You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:51:19