原因
“requests.exceptions.ContentDecodingError: Failed to decode response content” 的报错提示意味着 Python requests 库无法解码 HTTP 响应内容。这个错误通常出现在你在使用 requests.get()
或 requests.post()
获取 API 响应时。
这种情况通常是由于服务器返回的响应内容未被正确编码。可能是因为服务器使用了压缩算法,例如 gzip 或 deflate。这通常会导致内容的二进制数据比设定的大小更小,这样可以发送更少的数据并减少带宽消耗,从而提高整体性能。
解决方法
要处理这个问题,你可以采用两种方法:
方法一:禁用自动解压缩
现实中,大部分 HTTP 请求都不需要自动解压缩。如果你的请求没有做到这一点,可能会触发 “requests.exceptions.ContentDecodingError” 这个异常。
通过设置 requests
库的 content
属性,你可以禁用自动解压缩。可是,这种方法非常不便,因为你需要自行解压服务器返回的数据。
import requests
import gzip
from io import BytesIO
url = 'http://example.com'
req = requests.get(url)
gz = gzip.GzipFile(fileobj=BytesIO(req.content))
content = gz.read()
print(content)
这段代码会在从站点请求数据时解压缩压缩的响应。它的工作原理是为得到完整的响应,解压 GZIP 压缩数据,然后将解压缩后的数据转换成字符串。
方法二:设置正确的编码
设置正确的编码是消除该问题的最佳方法。 要解决这个问题,你需要进行以下操作:
-
查看文档并理解服务器那里使用了什么类型的编码,通常情况下,响应头中会返回这个信息。可以通过
response.content
属性获取整个响应内容,查看相应字段。通常值为 gzip 或 deflate。 -
对请求添加适当的解码器。只有这样,requests才能正确地解码服务器返回响应并返回文本。这个简单示例展示了如何解码 gzip 格式的数据。
“`python
import requests
from io import BytesIO
import gzipheaders = {
‘Accept-Encoding’: ‘gzip, deflate’,
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; WOW64; rv:80.0) Gecko/20100101 Firefox/80.0’,
}url = ‘http://example.com’
res = requests.get(url, headers=headers)
encodings = res.headers.get(‘Content-Encoding’, None)if ‘gzip’ in encodings:
buf = BytesIO(res.content)
f = gzip.GzipFile(fileobj=buf)
data = f.read()
elif ‘deflate’ in encodings:
data = zlib.decompress(res.content, -zlib.MAX_WBITS)print(data)
“`
以上代码为一个示例,用于解码 gzip 和 deflate 编码类型的对象。如果服务器返回了其他编码类型对象,则还需要添加适当的解码器。
除此之外,还可以使用 requests 库的 decode_content
属性来使用正确的编码进行解码,如下:
import requests
url = 'http://example.com'
res = requests.get(url)
text = res.text
# 直接获取文本,requests 库将使用 Content-Type 头部信息进行自动解码
这段代码会使用 requests 库的 decode_content
属性进行自动解码。话说这个方法没有任何难度,工作效果更加明显。