使用requests处理流式响应需设stream=True,用iter_content()逐块读取bytes并手动解码;raw流需自行处理编码和连接释放;务必用with管理连接或显式close()。

用 requests 处理流式响应时,关键在于禁用自动解码、启用流模式,并逐块读取,避免把整个响应体加载进内存。
启用流式请求
必须显式设置 stream=True,否则 requests 会默认把响应体全部读入内存再返回:
response = requests.get(url, stream=True)- 此时
response.content不可用(会触发完整读取),应改用response.iter_content()或直接遍历response.raw
按块读取响应体
推荐使用 iter_content(chunk_size),它自动处理压缩、分块传输等细节:
for chunk in response.iter_content(chunk_size=8192):-
chunk是bytes类型,需自行解码(如 UTF-8)再处理文本 - 设为
None表示不缓冲,适合极低延迟场景;设为具体数值(如 4096)更平衡效率与内存
手动控制 raw 流(高级场景)
若需精细控制底层 socket 行为(如超时、非阻塞读),可绕过 requests 的封装,直接操作 response.raw:
- 确保
response.raw.readable()为True - 调用
response.raw.read(n)或response.raw.readline() - 注意:需手动处理
gzip等编码,requests 默认已解压Content-Encoding: gzip,但raw可能未解压,建议优先用iter_content
及时释放连接与异常防护
流式响应容易因处理慢或中断导致连接堆积,务必规范收尾:
- 用
with requests.get(..., stream=True) as r:自动关闭连接 - 在循环中捕获
requests.exceptions.ChunkedEncodingError或ConnectionError - 处理完后显式调用
response.close()(尤其未用上下文管理器时)









