You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python Requests请求西南航空数据时出现超时错误及代码咨询

排查西南航空API请求超时问题(Requests库)

看起来你在使用Python Requests库请求西南航空API时碰到了超时错误,结合你给出的代码片段,我整理了几个常见的排查方向和解决办法:


先补全核心请求逻辑!

你定义了请求头和API地址,但还没写出发送requests.get()requests.post()的代码,这一步一定要补上,而且必须加超时参数,否则请求可能会无限挂起直到系统强制中断。

比如先补上最基础的请求代码(这个API大概率是POST请求):

def worker(oa,da,ods):
    """thread worker function"""
    print (oa + ' ' + da + ' ' + ods + ' ' + str(datetime.datetime.now()))
    url = "https://www.southwest.com"
    xurl = "https://www.southwest.com/api/air-booking/v1/air-booking/page/air/booking/shopping"
    rh = {
        'accept': 'application/json,text/javascript,*/*;q=0.01',
        'accept-encoding': 'gzip, deflate, br',
        'accept-language': 'en-US,en;q=0.5', # 修复不完整的语言头
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
        'Referer': 'https://www.southwest.com/',
        'Origin': 'https://www.southwest.com'
    }
    # 补全请求体,根据实际需求调整参数
    payload = {
        "originationAirportCode": oa,
        "destinationAirportCode": da,
        "departureDate": ods,
        "adultPassengersCount": 1
    }
    # 使用Session维持会话,自动处理Cookie
    session = requests.Session()
    try:
        # 先访问首页获取必要的Cookie
        session.get(url, headers=rh, timeout=(3, 10))
        # 发送API请求,设置连接超时3秒,读取超时10秒
        response = session.post(xurl, json=payload, headers=rh, timeout=(3, 10))
        response.raise_for_status() # 主动抛出HTTP错误状态码
        print(response.json())
    except requests.exceptions.Timeout:
        print(f"请求超时:{oa}-{da}-{ods}")
    except requests.exceptions.RequestException as e:
        print(f"请求出错:{e}")

具体排查与优化方向

1. 强制设置超时参数

一定要给requests请求加上timeout参数,推荐分连接超时读取超时(比如timeout=(3,10)):

  • 连接超时:限制建立TCP连接的时间
  • 读取超时:限制从服务器获取响应数据的时间
    这样能避免请求无限挂起,也能快速定位是连接阶段还是数据读取阶段出问题。

2. 补全请求头,避免被反爬拦截

西南航空的反爬机制很严格,你的原始请求头缺少很多关键字段:

  • 修复accept-language的不完整值(去掉末尾的...
  • 添加User-Agent:模拟真实浏览器,避免被识别为爬虫
  • 添加RefererOrigin:告诉服务器请求来自官网,符合正常用户行为

3. 用Session维持Cookie

直接请求API可能会因为缺少必要Cookie被拦截,先访问西南航空首页,用同一个Session发送API请求,让Requests自动处理Cookie的存储和携带。

4. 控制线程并发频率

你用了多线程,短时间内大量请求会触发服务器限流,导致超时:

  • 给每个线程添加随机延迟,比如time.sleep(random.uniform(1,3))
  • 用线程池替代手动管理线程,比如concurrent.futures.ThreadPoolExecutor(max_workers=5),控制并发数

5. 确认请求方法和请求体

西南航空的购物API是POST请求,不是GET,你需要提交包含出发地、目的地、日期等参数的JSON请求体。可以用浏览器开发者工具抓包,查看真实请求的payload结构,再对应调整代码。

6. 检查网络环境

如果本地网络访问西南航空官网很慢,可以尝试:

  • 切换稳定的网络
  • 使用代理IP(注意选择可靠的代理,避免被检测)

内容的提问来源于stack exchange,提问作者py_ios_dev

火山引擎 最新活动