设置timeout后Python Requests响应更快,如何立即获取数据?
解决requests调用EPA API时无需等待超时即可立即获取响应的问题
你碰到的情况是服务器返回响应后没主动关闭连接,导致requests默认会一直等后续数据。要在拿到完整响应后立刻获取数据,不用靠timeout触发,有两种实用方法:
方法1:开启流式响应并主动读取全部内容
给requests.get()加上stream=True参数,这时requests不会自动缓存整个响应。你主动调用response.content或response.text读取完所有内容后,连接会直接关闭,不用再等超时:
import requests import json # 先补全header定义(示例里漏了) header = {"User-Agent": "Mozilla/5.0"} # 按需添加请求头 url = "https://aqs.epa.gov/data/api/monitors/byState?email=test@aqs.api&key=test¶m=42401&bdate=20150501&edate=20150502&state=49" response = requests.get(url, headers=header, stream=True) # 读取完整响应 full_content = response.content # 解析成JSON data = json.loads(full_content) print(data)
方法2:设置精准的分阶段超时(可选)
如果还是想保留timeout机制,推荐用元组形式的timeout,分别指定连接超时和读取超时,既能控制连接阶段的等待时间,也能避免无限制等后续数据:
# 连接超时2秒,读取超时3秒,按需调整数值 response = requests.get(url, headers=header, timeout=(2, 3)) print(response.json())
为什么会出现这种情况?
当服务器用分块传输编码且没在响应头里写Content-Length时,requests没法提前知道响应总长度,默认会一直等服务器主动关连接。开stream=True后主动读完全部内容,相当于告诉requests“已经拿完数据了”;而分阶段timeout则直接限制了读取阶段的最长等待时间,避免不必要的阻塞。
内容的提问来源于stack exchange,提问作者booRadley
相关产品推荐
相关产品推荐

