数据来源与获取方法
数据来源
携程机票查询https://flights.ctrip.com/online/channel/domestic
网页分析
我们的目的是要爬取携程网中机票的价格,航班的起飞时间,降落时间,目的地,出发地,所乘做机型名称,航班号信息
第一步
首先通过浏览器开发者工具记录网络请求,并通过全局搜索得到起飞时间数据的请求头返回地址
其中请求头中的sign和transactionid为变化的状态,因此我们的方向就是分析sign和transactionid的变化规律并归纳出公式以便爬虫请求
我们进行逆向回推看看是哪里的设置改变了这两个参数,发现https://flights.ctrip.com/international/search/api/flightlist//round-tna0-cgq0?_=1&depdate=2022-12-01_2022-12-04&cabin=Y_S_C_F&containstax=1&v=0.18291690129031823
中的相应里有transactionid
从该地址中我们推测tna对应的是济南的三字码,cgq为长春的三字码,depdate=XXXX-XX-XX_XXXX-XX-XX为出发时间和返回时间,v=0.18291690129031823为时间戳刷新缓存(一般情况可以直接忽略)
接着我们查找sign的值,查到到最早出现sign的请求。但是没有出现关于sign的响应,因此初步断定sign的值是Js动态形成的
使用堆栈跟踪,在js代码中搜索sign,定位出现sign的位置,其中n的值赋给了sign,所以n的值的来源就是sign值的来源,n = sessionStorage.getItem(i)) || (n = (new a.a).update®.digest(‘hex’), sessionStorage.setItem(i,n)
其中sessionStorage为本地存储的键值对,get方法取键i为真,那么n为新new了一个对象把r进行md5并且以键值对(i,n)设置回sessionStorage
其中r是e.transactionID + t
那么t是
var n = e.departureCityCode,
r = e.arrivalCityCode,
a = e.departureDate;
t += n + r + a
departureCityCode是出发城市的三字码,arrivalCityCode是到达城市的三字码,departureDate是出发的日期
所以
实现效果
完整代码与说明文档
面包多:https://mbd.pub/o/bread/ZJabm5xp