使用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:模拟真实浏览器,避免被识别为爬虫 - 添加
Referer和Origin:告诉服务器请求来自官网,符合正常用户行为
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




