Python requests.get请求网页时gzip内容解码失败该如何解决
问题原因
- 手动指定
Accept-Encoding头引发冲突:requests默认会自动配置合理的Accept-Encoding值,且内置了gzip、deflate格式的自动解码能力,手动指定该头时额外加入了br(Brotli压缩)、compress等requests默认不支持的编码格式,同时部分站点不会严格遵守identity要求返回未压缩内容,容易出现编码匹配异常。 - 反爬机制触发异常响应:目标站点对请求头做了校验,缺少
User-Agent等浏览器常规请求头时,返回的不是正常的gzip压缩内容,而是反爬错误页、空内容,但响应头仍标记content-encoding: gzip,导致requests解码时校验失败。 - 部分站点返回的压缩包存在格式异常,不符合标准gzip结构,触发解码错误。
解决方法
方法1:删除手动设置的Accept-Encoding头,补充常规浏览器请求头
这是最优先尝试的方案,requests会自动处理压缩解码逻辑,不需要手动配置编码相关参数,修改后代码如下:
import requests url = r'https://www.huffpost.com/entry/sean-hannity-gutless-tucker-carlson_n_60d5806ae4b0b6b5a164633a' headers = { # 替换为对应浏览器的User-Agent即可 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36' } r = requests.get(url, headers=headers) print(r.text)
方法2:安装Brotli依赖支持br编码解码
如果站点默认返回br格式的压缩内容,requests默认无法自动处理,安装brotli库后requests会自动适配:
pip install brotli
安装完成后不需要修改其他代码,即可正常解析br编码的响应。
方法3:禁用自动解码,手动处理压缩内容
如果上述方法均无效,可以直接获取原始响应字节,手动处理解码逻辑,避免requests自动解码报错:
import requests import gzip from io import BytesIO url = r'https://www.huffpost.com/entry/sean-hannity-gutless-tucker-carlson_n_60d5806ae4b0b6b5a164633a' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36' } r = requests.get(url, headers=headers, stream=True) # 手动判断编码格式处理 content_encoding = r.headers.get('content-encoding', '') if 'gzip' in content_encoding: content = gzip.GzipFile(fileobj=BytesIO(r.content)).read() elif 'br' in content_encoding: import brotli content = brotli.decompress(r.content) else: content = r.content print(content.decode('utf-8'))
内容的提问来源于stack exchange,提问作者someguy67
相关产品推荐
相关产品推荐

