侧边栏壁纸
博主头像
いちごみるく

行动起来,活在当下

  • 累计撰写 70 篇文章
  • 累计创建 48 个标签
  • 累计收到 55 条评论

目 录CONTENT

文章目录

Requests 携程机票接口:历史签名与报价数据分析

历史协议分析。 本文参考 2022 年的携程 Requests 采集文章,讨论请求签名与报价关联。相关接口、签名和 Cookie 规则不作为当前服务契约;示例只用于离线分析。

一、参考来源与讨论范围

请求流程参考 AIslandX 的《获取携程机票信息(爬虫)》。该来源中的代码署名 AIslandX,日期为 2022-01-01,页面标注 CC BY-SA 4.0。下文围绕这一历史请求结构讨论签名与数据处理。

本博客最初发表于 2022-06-27。相关的 Selenium 初版历史分析和 V2 历史分析也没有证明当前携程接口可用,不能把它们作为已验证的替代入口。

二、2022 年请求链的要点

当时先取得一个包含 transactionID 与查询上下文的响应,再按交易标识、出发代码、到达代码和日期构造摘要,随后请求 batchSearch。这是对当时 Web 应用的观察,不是携程承诺给第三方稳定使用的公开 API。

需要同时检查 HTTP、业务标志和列表结构,才能判断是否取得数据。HTTP 200 可能仍是业务失败;没有 flightItineraryList 字段也不能在未了解错误响应的情况下直接视为零航班。Cookie 与交易标识通常需要来自同一个有效上下文,随机生成字符串并不等于已建立真实会话。

三、离线计算请求摘要

下面用自定义演示值重现当年观察到的拼接顺序,不发网络请求,也不表示该摘要现在仍能通过服务认证:

import hashlib


def historical_digest(transaction, departure, arrival, departure_date):
    values = (transaction, departure, arrival, departure_date)
    if any(not isinstance(value, str) or not value for value in values):
        raise ValueError('四个历史字段必须为非空字符串')
    joined = ''.join(values).encode('utf-8')
    return hashlib.new('md5', joined, usedforsecurity=False).hexdigest()


if __name__ == '__main__':
    print(historical_digest('demo-transaction', 'SHA', 'BJS', '2022-01-29'))

字符编码、大小写、日期格式和拼接次序都会影响结果。MD5 是摘要而非加密,也不应据此设计新的安全认证协议;usedforsecurity=False 只是明确这是历史数据演示,不是安全用途。Python hashlib

四、航段与报价的数据关联

将航段与报价拆成两张表后,不能只依靠 flightNo 合并。一个航班号可能对应不同日期、航段、行程和供应商,单独使用它会产生错误关联或多对多膨胀。应按源数据的完整行程标识、日期、航段和报价上下文建立键,并用合并校验确认预期关系。

价格处理还独立取 max(price) 和 max(discount) 推算原价;这两个值可能来自不同票种。例如 500 元 / 0.8 与 800 元 / 0.5 是两条报价,分别推算为 625 和 1600;独立取两个最大值得到 800 / 0.8 = 1000,并不对应其中任何一条。折扣单位、税费口径、舱位与价格来源没有核实之前,原价应标为未知。

直接索引 priceUnitList[0]['flightSeatList'][0] 和首个航段时,中转、空数组、缺字段和不同响应结构都会出错。把这些错误用宽泛 except 跳过,会让 CSV 看似完整,实际上缺失部分行程。成功、确认无数据和解析失败应分别存储。

五、能复用的工程方法

保存自己有权取得的原始响应、采集时间、查询条件与解析版本,然后在离线样本上验证:业务错误、空列表、多航段、同航班多价格、缺价格字段和重复键。解析函数返回明确的状态和原因,不让连接异常变成“该航线无航班”。

请求必须有显式 timeout,必要重试有总次数与时间上限;自动化客户端还要遵守数据来源的允许频率和使用范围。Requests 超时说明

这些数据建模方法可以用于合法取得的离线样本,但不能据此推断 flightlist / batchSearch 的当前签名、Cookie 或访问规则。

0

评论区