如何阻止Python requests发送GET请求时接收响应以节省带宽
解决Python requests使用代理时避免下载大响应体的问题
要解决代理带宽浪费的问题,核心是让服务器在返回响应头后立即停止发送响应体,而不是只在本地丢弃已下载的内容。以下是两种可行的方案:
方案一:使用requests的流模式+连接关闭头
利用stream=True阻止requests自动下载响应体,同时通过Connection: close头告知服务器发送完响应头后断开连接,这样代理不会接收后续的大响应数据。
import requests # 配置目标地址和代理 TARGET_URL = "https://example.com/large-response" PROXIES = { "http": "http://your-proxy:port", "https": "http://your-proxy:port" } # 发送带流模式和关闭头的GET请求 with requests.get( TARGET_URL, proxies=PROXIES, stream=True, headers={"Connection": "close"} ) as response: # 仅处理响应头,不读取任何响应体内容 print(f"响应状态码: {response.status_code}") # 这里可以添加响应头的逻辑处理,比如检查Content-Type等 pass
原理说明
stream=True:让requests不会自动将整个响应体加载到内存,只有当你主动调用response.text/response.content时才会开始下载。Connection: close:告诉服务器,在返回响应头后立即关闭TCP连接,服务器会停止发送后续的响应体数据,代理也就不会继续接收并转发这部分内容,从根源上节省带宽。
方案二:直接操作urllib3底层连接
由于requests基于urllib3实现,直接使用urllib3的代理管理器可以更精细地控制连接生命周期:
from urllib3 import ProxyManager PROXY_URL = "http://your-proxy:port" TARGET_URL = "https://example.com/large-response" # 创建代理连接管理器 proxy_manager = ProxyManager(PROXY_URL) # 发送请求,关闭预加载响应体 response = proxy_manager.request("GET", TARGET_URL, preload_content=False) try: # 仅处理响应头 print(f"响应状态码: {response.status}") finally: # 立即关闭连接,终止响应体传输 response.close()
注意事项
- 不要调用任何会触发响应体下载的方法(比如
response.text/response.content/response.iter_content()),否则会导致代理开始接收完整响应体。 - 部分服务器可能忽略
Connection: close头,此时可以尝试在获取响应头后立即重置连接(需要更底层的socket操作,但上述方案已覆盖绝大多数场景)。 - 确保你的HTTP代理支持中途断开连接的操作,主流代理服务都兼容这种行为。
内容的提问来源于stack exchange,提问作者frogfromflow
相关产品推荐
相关产品推荐

