ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

影刀RPA新手教程:携程去哪儿数据采集实战——机票酒店价格监控与比价

影刀RPA新手教程:携程去哪儿数据采集实战——机票酒店价格监控与比价 影刀RPA新手教程携程去哪儿数据采集实战——机票酒店价格监控与比价机票价格追踪不是简单抓几个数字做机票价格监控的人大多有一个误解以为打开携程搜索结果页抓一下每条航班的金额就行了。实际上携程的机票详情页数据分了至少三层加载——列表页只有最低价价格日历需要点击查看全部日期具体舱位价格又藏在二次请求里。更麻烦的是部分价格字段不是HTML明文而是Canvas渲染的元素捕获拿不到任何文本。去哪儿的页面结构是完全不同的另一套逻辑价格日历不是弹窗而是嵌入式DOM舱位列表接口的返回结构比携程扁平一层。要在两个平台之间做同航线比价不仅要解决各自的技术差异还要保证日期对齐、舱位对齐、币种对齐。这篇从北京-上海航线出发写一个双平台价格采集合并对比的完整流程。可以直接套到任意航线。影刀还没装的先装好完整教程参考 home.linyan.cloud。元素定位两个平台的DOM差异携程携程的航班搜索结果页面是一个大table虽然用了div模拟每行一条航班信息。价格显示在每行最右列的div中。DOM结构大概是div.flight-item div.flight-info // 航班号、起飞降落时间 div.flight-price span.price // 主要价格 span.price-desc // 价格说明如经济舱元素捕获方法先捕获第一个航班的价格span再捕获第二个做相似元素校验得到所有航班的价格相似元素组。但问题来了不是每条航班的价格都在.price里。部分航司国航、南航的价格在页面初次加载后由JS动态填充第一轮抓取可能拿到空白或者占位符--。解决方案在获取相似元素列表之前先对页面body执行一段JS触发价格渲染function(){window.scrollTo(0,document.body.scrollHeight);window.scrollTo(0,0);returntrue;}滚到底再滚回来强迫页面触发所有懒加载的价格渲染。执行完后等2秒再捕获元素。去哪儿去哪儿的航班列表页用的是微信小程序风格的卡片布局价格在卡片右下角的span.price-real中。舱位类型在div.class-type中。去哪儿的元素捕获相对简单——DOM变更频率低class命名规范。但有一个要注意价格数字带了起字后缀如¥580起去起字用文本_替换(起, )。价格日历的定位携程的价格日历需要先点击日期选择器触发弹窗弹窗里是一个7列周一~周日的日期网格。每天的日期div有一个data-date属性值为YYYY-MM-DD格式的日期价格是div内部的span.price文本。去哪儿的价格日历是页面内嵌的不需要点击就能看到。但日期范围默认只显示最近15天需要点更多日期展开到30天。两者在日期选择上还有一个共同问题当前日期和未来日期可能有不同的价格展示逻辑。今天出发的航班是实时价格明天之后的航班有预估价。需要分开标记否则比价毫无意义。做法是给每条数据加一个价格类型字段实时价或预估价。变量设计对齐两个平台的数据字段两个平台返回的字段不完全一致需要统一成一个中间格式。中间数据字典定义dict_航班数据{平台:携程,# 携程/去哪儿日期:2025-08-15,# 出发日期航班号:CA1234,航司:中国国航,出发时间:08:30,到达时间:10:45,出发机场:PEK,到达机场:SHA,价格:580.0,# 浮点数舱位:经济舱,价格类型:实时价,采集时间:2025-07-01 10:30:00,剩余座位:5}携程的接口返回字段映射price→价格flightNo→航班号airlineName→航司depTime→出发时间arrTime→到达时间。去哪儿的接口返回ticketPrice→价格flightNumber→航班号。注意去哪儿的航司名在carrierName而非airlineName。价格字段统一转浮点数去掉¥和逗号分隔符float(price_str.replace(¥,).replace(,,))变量命名沿用前缀规范list_携程航班、list_去哪儿航班、list_合并结果、dict_最低价信息。流程控制三层嵌套循环最外层循环是日期未来30天中层是航线如果监控多条航线内层是平台携程和去哪儿。设置 list_价格对比 新建列表 For str_日期 in list_未来30天: For str_航线 in list_监控航线: For str_平台 in [携程, 去哪儿]: If str_平台 携程: 打开携程航班搜索页(航线, 日期) 等待航班列表加载 滚动页面触发价格渲染 获取相似元素列表 → 解析每条航班信息 追加到 list_携程航班 Else: 打开去哪儿航班搜索页(航线, 日期) 等待航班列表加载 获取相似元素列表 → 解析每条航班信息 追加到 list_去哪儿航班 # 两个平台都采集完后合并去重 list_当前日期对比 按航班号匹配合并(list_携程航班 list_去哪儿航班) 追加 list_当前日期对比 到 list_价格对比 # 检查价格变化 对比昨日同航班价格, 如有超过阈值的变化 → 记录到 list_异常价格 写入Excel(list_价格对比) If list_异常价格.length 0: 飞书通知(list_异常价格)重点解析一、日期循环的生成。不用手动列30天用Python表达式fromdatetimeimportdatetime,timedelta startdatetime.now()dates[(starttimedelta(daysi)).strftime(%Y-%m-%d)foriinrange(1,31)]运行一次拿到30天的日期列表存成影刀的列表变量。二、合并去重的匹配键是日期航班号不是单纯的航班号——同一航班在不同日期的价格不同合并的关键维度是日期航班号。三、价格变化阈值检查。昨天的数据从哪来从Excel历史记录里读。用Excel_读取区域加载昨天的数据表然后Nested Loop对比For当前航班 in 今日数据For历史航班 in 昨日数据如果当前航班.航班号 历史航班.航班号 当前航班.日期 历史航班.日期计算价格变化率 abs(当前价格-历史价格)/历史价格超过5%就记入异常列表。网页自动化携程和去哪儿的打开姿势不同携程URL拼接方式https://flights.ctrip.com/domestic/search/?dcity{出发城市代码}acity{到达城市代码}ddate{日期}城市代码用三字码北京BJS上海SHA深圳SZX。打开后页面加载时间较长携程的航班搜索大概3-5秒等航班列表容器出现后再往下走。用等待元素(web)等待class为flight-list的div出现超时15秒。携程的价格日历交互先点日期选择器class为date-picker的div等日历弹窗出现class为calendar-container然后循环所有带data-date属性的日期元素获取每天的价格。弹窗关闭携程的价格日历弹窗在日历外点任意位置关闭。做法是点页面顶部的导航栏logo附近那个区域不会触发日历操作。去哪儿URL拼接https://flight.qunar.com/site/oneway_list.htm?fromCity{三字码}toCity{三字码}fromDate{日期}去哪儿的页面加载后价格列表在一级页面上直接可见不需要额外点击。但去哪儿有一个干扰项页面加载后会弹出一个低价提醒的浮窗。必须处理掉这个浮窗否则后面元素捕获可能被遮挡。关闭浮窗的时机等页面加载完毕后等1秒浮窗有淡入动画然后点浮窗右上角的关闭按钮。关闭按钮没有显眼的class用文本匹配知道了或关闭按钮点击。双重保障如果浮窗关闭按钮点不到先用按Esc尝试关闭再点页面空白区域。无头浏览器问题携程和去哪儿都对无头浏览器有检测。影刀的浏览器默认是Chrome的有头模式不需要额外配置。但如果你的流程部署到Linux服务器的无头环境需要在启动参数里加--disable-blink-featuresAutomationControlled影刀的打开网页指令支持自定义浏览器参数在高级设置里可以加这个参数。数据处理多维度比价数据采集完后合并对比的核心逻辑用Python写更清晰影刀的表达式处理多维数组比较费劲。# 输入携程列表、去哪儿列表# 输出最低价航班列表result{}forflightinctrip_listqunar_list:key(flight[日期],flight[航班号])ifkeynotinresultorflight[价格]result[key][价格]:result[key]flight这段代码把两个平台的数据合并按日期航班号去重保留价格更低的那条。结果写入Excel时标记哪个平台更便宜。Excel输出三张表Sheet1 每日最低价日期、航班号、航司、出发时间、到达时间、最低价格、来源平台、舱位。Sheet2 双平台价格对比日期、航班号、携程价格、去哪儿价格、价差、便宜的平台。Sheet3 价格波动日志日期、航班号、今日价格、昨日价格、变化金额、变化率、是否异常。价差计算在Python里价差ctrip_price-qunar_price# 正数表示去哪儿便宜便宜平台去哪儿if价差0else携程Excel中可以用条件格式高亮异常价格变化行变化率5%的行标红但目前影刀不直接支持Excel条件格式替代方案是写入时根据变化率判断在备注列写入⚠️异常标记。阈值与异常通知价格变化超过阈值时的飞书通知消息模板机票价格异常预警 航线北京 → 上海 日期2025-08-15 航班CA1234中国国航 历史价格¥580.00 当前价格¥720.00 变化幅度24.1%超过5%阈值 来源平台携程 ---------------------- 建议尽快确认是否为正常调价消息分两档变化率5%-15%发普通通知15%加所有人。两档分开构造消息用If判断走不同分支。阈值不要写死从Excel配置表读取。配置表结构航线价格阈值%状态北京-上海5启用深圳-北京10启用循环每行配置只在状态为启用的航线上执行监控和通知。进阶多线程并行采集单线程串行跑两个平台30天数据大约需要20-30分钟。如果监控多条航线时间成倍增加。多线程方案不要在一个影刀应用里做多线程影刀不支持而是拆成多个子应用在计划任务里并行调度。一个子应用只处理一条航线的一个平台一个日期调度中心同时分配给多台机器人执行。子应用的入参通过启动参数传递航线代码、日期、平台名称。主应用负责生成所有子任务通过影刀API批量创建调度任务。影刀的计划任务API调用方式用HTTP请求指令POST到影刀控制台的任务创建接口Body里传applicationId子应用ID和参数JSON。{applicationId:123456,parameters:{航线:PEK-SHA,日期:2025-08-15,平台:携程}}10台机器人并行跑能把30天×2平台的时间从30分钟压到3分钟。系统联动自动下单预警除了飞书通知还可以把最低价数据自动更新到工作群的在线表格或数据库供业务团队直接决策。飞书多维表格联动用飞书多维表指令集的写入记录指令把每日最低价数据写入飞书多维表格。飞书多维表格支持公式、筛选和图表非技术同事也能直接看数据。影刀的飞书多维表指令使用前需要先在飞书开发者后台创建应用拿到app_id和app_secret配置到影刀的飞书多维表_初始化指令里。初始化后的写入飞书多维表_写入记录表格ID工作表名记录列表记录列表的格式是字典列表每个字典对应一行数据键是字段名。数据库写入方案适合数据量大的场景用影刀的MySQL扩展指令集直接写数据库。建表SQLCREATETABLEflight_price_daily(idINTAUTO_INCREMENTPRIMARYKEY,flight_dateDATE,flight_noVARCHAR(10),airlineVARCHAR(50),dep_timeTIME,arr_timeTIME,ctrip_priceDECIMAL(10,2),qunar_priceDECIMAL(10,2),min_priceDECIMAL(10,2),min_platformVARCHAR(10),crawl_timeDATETIME,INDEXidx_date_flight(flight_date,flight_no));每次采集后INSERT新记录历史数据全部保留便于做趋势分析。工程化容错和恢复采集过程中最脆弱的环节是网页交互。可能有3种失败场景页面超时网络抖动导致页面15秒没加载出来。等待元素超时后不直接报错退出而是执行刷新网页重试一次再失败才记录日志跳过该日期继续下一个。价格获取不到部分航班的价格字段是Canvas渲染的元素文本为空。此时从接口拿数据Network里找到/flight/search或类似接口监听返回的JSON中取价格。接口数据不受Canvas渲染限制。兜底逻辑价格获取元素文本(价格元素)If 价格isNoneor价格:价格从监听接口获取价格()If 价格isNone:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/35bc0f359650493fa9a3f63415fcf558.png#pic_center)价格N/A浏览器崩溃Chrome偶尔会自己崩掉特别是长时间运行后内存占用过大。流程里增加一个健康检查每处理完5个日期检查获取当前浏览器标签页数量是否正常0。如果为0重新启动Chrome并恢复当前进度。另一个小技巧每跑完一个完整的采集周期主动关闭Chrome重启一次防止内存泄漏累积。用执行命令行taskkill /f /im chrome.exe timeout /t 3 start chrome。速查表/常见报错报错信息场景解决获取元素文本返回null价格Canvas渲染切换到接口监听方案抓JSON数据等待元素超时携程搜索结果页加载慢超时时间从15秒改30秒加刷新重试去哪儿浮窗遮挡元素低价提醒弹窗先点知道了关闭浮窗再继续操作价格日历只显示7天去哪儿默认范围点更多日期展开到30天航司名称不一致携程和去哪儿命名不同建一个航司名称映射表做标准化ConnectionError浏览器崩溃或断网检查Chrome进程数少于期望数就重启飞书消息超过长度限制单条消息超过2048字节拆成多条消息分批发送日期格式不匹配携程和去哪儿日期格式不同统一用YYYY-MM-DD解析后格式化输出关于数据对不齐的问题携程的航班编号和去哪儿的航班编号之间没有标准化的映射关系。同一班CA1234在两个平台上可能价格相同但舱位代码不同——这在航司动态调价场景下很正常。比较时建议以出发时间到达时间航司作为匹配维度而不是只依赖航班号。匹配逻辑IF 出发时间相差不超过30分钟 AND 到达时间相差不超过30分钟 AND 航司相同 THEN 视为同一航班因为携程和去哪儿的航班时刻表来源不同同一航班的时间标注可能有微小差异。内容标签携程数据采集、去哪儿机票抓取、价格监控RPA、双平台比价、飞书通知作者林焱
返回列表