Requests报”requests.exceptions.ContentDecodingError: Failed to decode response content: {error message} “的原因以及解决办法

  • Post category:Python

原因

“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 压缩数据,然后将解压缩后的数据转换成字符串。

方法二:设置正确的编码

设置正确的编码是消除该问题的最佳方法。 要解决这个问题,你需要进行以下操作:

  1. 查看文档并理解服务器那里使用了什么类型的编码,通常情况下,响应头中会返回这个信息。可以通过 response.content 属性获取整个响应内容,查看相应字段。通常值为 gzip 或 deflate。

  2. 对请求添加适当的解码器。只有这样,requests才能正确地解码服务器返回响应并返回文本。这个简单示例展示了如何解码 gzip 格式的数据。

    “`python
    import requests
    from io import BytesIO
    import gzip

    headers = {
    ‘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 属性进行自动解码。话说这个方法没有任何难度,工作效果更加明显。