python3.8 brotli brotli.error: BrotliDecompress failed?

2024-01-03

我的代码 python3.8

布罗特利=1.0.9

使用请求获取 url,标头使用 Accept-Encoding="br" 我需要使用decode br,因为我认为使用accept-encoding=br更好

import brotli
import requests 
headers = {}
headers['Accept'] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
headers['Accept-Encoding'] = "gzip, deflate, br"
headers['Host'] = "book.douban.com"
headers['Referer'] = "book.douban.com"
headers['Sec-Fetch-Dest'] = "document"
headers['Sec-Fetch-Mode'] = "navigate"
headers['Upgrade-Insecure-Requests'] = "1"

s=requests.Session()
url="https://book.douban.com/tag/%E5%B0%8F%E8%AF%B4"
try:
    response = s.get(url, headers=headers)
except:
    return ""
if response.status_code == 200:
    print(response.headers)
    if response.headers.get('Content-Encoding') == 'br':
        data = brotli.decompress(response.content)
        data1 = data.decode('utf-8')
        return data1
    else:
        return response.text
return ""

引发错误

data = brotli.decompress(response.content)
brotli.error: BrotliDecompress failed

文档中没有提到这一点requests https://requests.readthedocs.io/en/master/但有一次brotli https://github.com/google/brotli安装后,直接由Requests处理。

这意味着response.content将被自动解码(类似于gzip)。你不需要做brotli.decompress(response.content)

如果没有安装 brotli,您将不会收到任何错误消息。相反,response.content 将保持编码状态...

edit:

深入研究请求代码,我发现请求使用 urllib3.response 来实现 Brotli 的使用。

加载后,urllib3.response 将查找 Brotli 的导入:

try:
    import brotli
except ImportError:
    brotli = None

那么在解码响应时,它将使用适当的解码器:

def _get_decoder(mode):
    if "," in mode:
        return MultiDecoder(mode)

    if mode == "gzip":
        return GzipDecoder()

    if brotli is not None and mode == "br":
        return BrotliDecoder()

    return DeflateDecoder()

因此,如果安装了 Brotli,则会进行解码,否则不会发生任何事情,也不会向用户发出警告。

edit2其实这个在https://docs.python-requests.org/en/latest/user/quickstart/#binary-response-content https://docs.python-requests.org/en/latest/user/quickstart/#binary-response-content

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3.8 brotli brotli.error: BrotliDecompress failed? 的相关文章

随机推荐