Python requests模块设置超时参数后仍长时间卡住无响应问题咨询
问题根因说明
- 首先排查代码笔误:你给出的代码片段中,定义的超时变量名为
timeout_respose_factor,但requests.get传参时使用的是未定义的timeout_response,如果实际运行代码存在该问题,会触发requests默认的无超时逻辑,直接导致请求无限等待。 - requests内置timeout参数的设计逻辑限制:你传入的
timeout=(timeout_connect, timeout_response)中,第二个参数是读取间隔超时,指两次收到服务器响应数据的最大间隔,不是整个请求的总耗时阈值。如果亚马逊服务端针对可疑请求故意以极慢速度返回数据(比如每15秒返回1个字节,低于你设置的20秒读取超时阈值),就永远不会触发内置超时,导致线程卡住数小时。
解决方案
1. 修正基础配置
先修正变量名错误,保证读取超时参数正常生效,同时可以适当降低读取超时阈值,降低被慢响应挂住的概率。
2. 实现请求总时长控制
最稳妥的方案是通过线程池的超时能力做外层兜底,不管请求内部逻辑是否卡住,超过总时长阈值直接终止等待,走后续逻辑,示例代码如下:
from concurrent.futures import ThreadPoolExecutor, TimeoutError import requests # 封装请求逻辑 def amazon_fetch(url, headers): timeout_connect = 10 timeout_response = 20 try: return requests.get( url, headers=headers, timeout=(timeout_connect, timeout_response), verify=False ) except Exception: return None # 调用侧加总超时兜底,这里设置总请求时长最多60秒 with ThreadPoolExecutor(max_workers=1) as executor: future = executor.submit(amazon_fetch, your_url, your_headers) try: resp = future.result(timeout=60) except TimeoutError: # 超时直接跳过,无需等待请求返回 resp = None
3. 额外优化建议
- 亚马逊会针对可疑爬虫请求故意返回慢响应消耗资源,建议搭配代理池、UA轮换策略使用,降低被识别的概率。
- 也可以替换HTTP客户端为支持总超时配置的库,直接在请求层设置总耗时阈值,无需额外做外层控制。
内容的提问来源于stack exchange,提问作者Tushar Seth
相关产品推荐
相关产品推荐

