1. 项目背景:当传统查票遇上AI效率革命
每次计划出行最头疼的环节是什么?对我而言绝对是查机票。打开五六个比价网站,反复输入日期和目的地,手动记录各平台价格,最后还要对比航司官网——这套流程至少耗费半小时。直到上个月帮同事抢特价票时,我彻底被这种低效方式惹毛了。
传统查票的痛点太明显:首先是人肉操作耗时长,其次是难以获取全量数据(很多平台会隐藏部分航班),最重要的是动态价格追踪几乎不可能实现。而市面上现有的机票API要么收费昂贵(比如某旅行数据服务商按查询次数计费,每月基础费用就要2000元),要么功能受限(仅支持国内航班或固定航司)。
这就是为什么我要开发AiPy——一个用Python+AI技术打造的航班数据抓取分析工具。它的核心价值在于:输入出发地、目的地和日期范围后,30秒内返回全网航班的全量结构化数据,包括实时价格、历史价格曲线、准点率预测等维度。上周用它抢到北京飞昆明3折票的同事说:"这比雇个实习生整天盯着屏幕查票靠谱多了。"
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计:多维度数据融合方案
2.1 核心组件拓扑
整个系统采用模块化设计,主要包含四个功能层:
- 数据采集层:基于Playwright的无头浏览器集群,模拟真实用户操作绕过反爬
- 解析层:结合XPath规则和OCR识别处理动态加载内容
- 分析层:用时间序列算法预测价格波动趋势
- 输出层:生成带智能推荐标记的Excel/JSON文件
特别要说明的是浏览器模拟方案的选择。测试阶段对比过Selenium和Pyppeteer,最终选定Playwright是因为其更稳定的异步处理和更自然的鼠标移动轨迹模拟。在阿里云ECS上部署的20个浏览器实例,可以做到每分钟完成300次查询而不触发风控。
2.2 关键技术创新点
- 智能延迟控制:每个查询会随机生成2-5秒的操作间隔,配合HumanMouse库模拟真实点击轨迹
- 动态元素定位:当目标网站DOM结构变更时,通过CV算法识别页面关键元素坐标
- 数据校验机制:对抓取结果进行交叉验证,比如用携程的数据校验飞猪的结果
- 反反爬策略:自动轮换代理IP+浏览器指纹,每天凌晨自动更新UserAgent库
重要提示:实际开发中发现某大型OTA平台对快速翻页特别敏感,解决方案是在采集该平台时强制每页停留15秒,并通过滚动条分阶段下拉页面。
3. 实操搭建指南(含完整代码片段)
3.1 基础环境配置
建议使用Python3.9+环境,主要依赖库包括:
bash复制pip install playwright humanize requests pandas
playwright install # 安装浏览器驱动
配置文件config.ini需要设置:
ini复制[proxy]
enable = true # 建议始终开启
list = http://proxy1:port,http://proxy2:port
[retry]
max_attempts = 3
delay = 5
3.2 核心采集逻辑实现
以携程航班查询为例的代码框架:
python复制async def fetch_ctrip(from_city, to_city, date):
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
context = await browser.new_context(
user_agent=get_random_ua(),
proxy={"server": get_proxy()}
)
page = await context.new_page()
# 模拟人工输入
await human_type(page, '#depCity', from_city, speed=0.3)
await page.wait_for_timeout(1000)
await human_click(page, '#searchBtn')
# 处理动态加载
while not await page.query_selector('.flight-item'):
await page.wait_for_timeout(2000)
await auto_scroll(page)
# 数据提取
flights = []
items = await page.query_selector_all('.flight-item')
for item in items:
flight = {
'airline': await extract_with_ocr(item, '.airline'),
'price': await parse_price(await item.inner_text('.price'))
}
flights.append(flight)
await browser.close()
return flights
3.3 数据聚合与分析
使用Pandas进行数据清洗的典型流程:
python复制def analyze_flights(raw_data):
df = pd.DataFrame(raw_data)
# 价格标准化处理
df['price'] = df['price'].str.extract(r'(\d+)').astype(int)
# 航司分类
df['airline_type'] = df['airline'].apply(
lambda x: 'low_cost' if '春秋' in x else 'regular')
# 生成价格预测
df = add_price_trend(df, window_size=3)
return df.sort_values('price')
4. 实战效果与调优经验
4.1 性能基准测试
在2核4G的云服务器上测试不同场景的耗时:
| 查询范围 | 耗时 | 数据量 |
|---|---|---|
| 单日单航线 | 28s | 15-20班次 |
| 三日多航线 | 52s | 200+班次 |
| 全周国际航班 | 113s | 500+班次 |
4.2 常见问题排查手册
-
突然返回空数据
- 检查是否触发IP封锁:尝试用手机热点测试
- 更新元素定位规则:部分网站每周会微调CSS类名
- 验证OCR识别精度:有些航司名称使用特殊字体
-
浏览器实例崩溃
- 限制并发数量:建议每个IP不超过3个实例
- 增加内存交换空间:
sudo fallocate -l 2G /swapfile - 定期重启服务:用Supervisor配置自动重启
-
数据不一致
- 开启校验模式:设置
config.ini中的validate=true - 人工采样复核:随机选择5%的航班手动验证
- 过滤异常值:排除价格低于均价30%的记录
- 开启校验模式:设置
5. 进阶应用场景
除了基础的比价功能,这套系统还能实现:
- 票价预测:通过LSTM模型分析历史数据,预测未来72小时价格走势
- 漏洞票监控:实时捕捉航司价格系统bug(如头等舱标成经济舱价格)
- 航线热度分析:统计各航线查询频次,辅助投资决策
- 延误预警:整合历史准点率数据,生成延误风险评分
最近正在尝试接入ChatGPT API,让它能直接回答类似:"下周上海飞三亚最便宜的航班是哪班?要考虑托运行李费用"这样的自然语言查询。测试中发现大模型在理解"最便宜"这个模糊概念时,需要额外训练数据来定义权重系数(比如是否包含餐食、退改签政策等)。
这个项目给我的最大启示是:很多看似需要人工重复劳动的工作,其实可以用轻量级自动化方案大幅提升效率。现在团队里连行政小姐姐都会用这个工具查团建机票了,关键是培养出了数据驱动的决策意识——买机票不再凭感觉,而是看历史价格分位数和预测曲线。
