requests默认自动解压gzip,前提是未禁用Accept-Encoding且响应头含Content-Encoding: gzip;否则需手动用gzip.decompress()处理,否则会得到乱码二进制数据。

Python 爬虫收到 Content-Encoding: gzip 响应时,默认不会自动解压,必须手动处理,否则拿到的是乱码二进制数据。
requests 自动解压 gzip 的前提条件
requests 本身支持自动解压 gzip,但仅限于响应头明确包含 Content-Encoding: gzip 且响应体确实为合法 gzip 流时。常见失效场景包括:
- 服务器返回
Content-Encoding: gzip,但实际响应体未压缩(比如 CDN 缓存异常) - 响应头缺失
Content-Encoding,但 body 是 gzip(部分老旧或自定义服务会这样) - 使用了
stream=True但没调用.raw.read()或没设置decode_content=True
验证是否已自动解压:检查 resp.text 是否可读、resp.content[:3] 是否等于 b'\x1f\x8b'(gzip 魔数)。若等于,说明还没解压。
手动解压 raw gzip 数据
当 requests 没自动解压,或你用了 urllib/http.client 等底层库时,需手动调用 gzip.decompress():
import gzip
import requests
<p>resp = requests.get(url, headers={'Accept-Encoding': 'gzip'})
if resp.headers.get('Content-Encoding') == 'gzip':
try:
content = gzip.decompress(resp.content)
text = content.decode(resp.encoding or 'utf-8')
except (OSError, UnicodeDecodeError) as e:</p><h1>常见错误:不是 gzip 格式 / 编码不匹配</h1><pre class="brush:php;toolbar:false;"> print(f"解压失败:{e}")
text = resp.text # 降级回原始 resp.text(可能乱码)
注意:gzip.decompress() 不接受空字节串,需先判断 resp.content 非空;若响应是 chunked 传输且未完整接收,也可能触发 OSError: Not a gzipped file。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
requests 中强制启用自动解压(含 deflate)
requests 默认只对 gzip 和 deflate 做自动解压,但需确保没禁用:
- 不要设置
stream=True后直接读resp.raw——此时解压逻辑被绕过 - 避免手动修改
resp.raw的decode_content属性为False - 若需兼容
br(Brotli),必须额外装urllib3[secure]并升级到 v1.26+,且 requests ≥ 2.25.0
最稳妥写法是显式声明接受编码,并依赖默认行为:
resp = requests.get(
url,
headers={'Accept-Encoding': 'gzip, deflate'},
timeout=10
)
# 此时 resp.text / resp.content 已解压(只要服务端配合)
遇到 gzip 解压失败的快速诊断步骤
解压报错时,别急着改代码,先定位问题源头:
- 用
print(resp.headers.get('Content-Encoding'))确认响应头是否真为gzip - 用
print(resp.content[:10].hex())查看前几个字节:正常 gzip 是1f8b,789c是 zlib,0000可能是空响应或图片 - 尝试
zlib.decompress(resp.content, wbits=zlib.MAX_WBITS|16)——有些服务用 zlib 封装但标成 gzip - 检查是否被反爬返回了 HTML 错误页(比如 403 页面),却误当成 gzip 处理
gzip 解压本身很稳定,绝大多数失败都源于“你以为它是 gzip,其实不是”。先验真,再解压。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










