Python3 Requests中文乱码之压缩格式问题解析

季宁
季宁
发布时间:2026-10-16 | 7人浏览过
原创

本文解析Python爬虫中因服务器使用Brotli压缩导致的中文乱码问题。详细说明了如何识别Accept-Encoding头中的br格式,通过手动导入brotli库或使用httpx自动处理来正确解码数据,并提供了修改请求头以禁用br压缩的替代方案。

问题背景与现象

在进行网络爬虫开发时,中文乱码是常见困扰。以往多由编码格式不匹配引起,但有时乱码源于服务器返回数据的压缩格式特殊。本文记录一种因压缩格式导致的编码混乱现象及其解决方案。

b'a\xd4l\x00 G6\xb5\xaa\xdf\xeaAy\x0f\xa0\xcaoZ\x92I&\x88\x14$p\xd8N\xb8\xaau\x02\xab\xdf\xeb\xac\x89r\x112q\x91\x99\xd8t\x1b\xa1"\x0b]\xb7\xf2\xee\xde[\xe8\x8a.\xd1\xa5\xe9(ZqE\xa1q\x08\x9dV\x0f\xba\x90\x11\x16K\x10^~\xc5|7\x02\x17\xd6\xef\t\x17\xea5\xe6}\xb6\x95\xf1\x91\xf6H\xa9o+s\xd3\xadv\xa9\xff\xb3\xad\xec\'

请求头分析与编码误区

首先检查请求头信息。

header = {
    "Content-Type":"application/json",
    "Accept": "application/json",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Agw-Js-Conv": 'str',
    "Connection": "keep-alive",
    "Cookie":"***",
    "Host": "life.douyin.com",
    "Referer": "https://life.douyin.com/p/login",
    "sec-ch-ua": '"Chromium";v="104", " Not A;Brand";v="99", "Google Chrome";v="104"',
    "sec-ch-ua-platform": "Android",
    "Sec-Fetch-Dest": "empty",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "same-origin",
    "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Mobile Safari/537.36",
    "x-secsdk-csrf-token": "*",
}

注意到Content-Type字段为application/json,表明数据格式为JSON。此时需关注中文转换,通常使用utf-8编码将Unicode字符串转换为可读文本。

然而,转换后解析出的数据仍显示为乱码。这涉及请求头与响应头中相关字段的含义,需进一步分析。

请求头字段说明响应头字段
Accept告知服务器发送何种媒体类型Content-Type
Accept-Language告知服务器发送何种语言Content-Language
Accept-Charset告知服务器发送何种字符集Content-Type
Accept-Encoding告知服务器采用何种压缩方式Content-Encoding

Brotli压缩格式解析

查看Accept-Encoding字段,它指示服务器返回数据使用的压缩格式。常见值为gzip或deflate,但若发现末尾包含br,则需探究其含义。

br代表Brotli,这是一种新型无损数据压缩格式,其压缩比通常高于gzip。

手动处理Brotli数据

若需手动处理Brotli压缩数据,需单独导入brotli库。

安装步骤如下。

pip install Brotli

安装完成后,可使用brotli模块解析数据。

data = brotli.decompress(res.content)

禁用Brotli压缩的替代方案

另一种简便方法是修改请求头,告知服务器不支持br格式,从而迫使服务器不使用该压缩方式。

"Accept-Encoding": "gzip, deflate",

常见错误与httpx处理差异

补充说明:关于BrotliDecompress failed错误的处理。

初期使用requests库时,发现必须引入brotli库才能正确解压缩数据,否则返回的仍是乱码。

import brotli
res = requests.get(url,headers = header,verify=False)
print(res.content)
print(res.text)
 
if res.headers.get('Content-Encoding') == 'br':
    data = brotli.decompress(res.content)
    print(data.decode('utf-8'))
else:
    print(res.text)

但在改用httpx库后,再次调用brotli.decompress()方法会引发报错。

Traceback (most recent call last): File "/****", line 61, in <module> data = brotli.decompress(res.content) brotli.error: BrotliDecompress failed

此时无需手动引入brotli库,httpx会自动处理Brotli解压。

import json
finish_data = []
with httpx.Client(http2=True, verify=False) as client:
    cookies = httpx.Cookies()
    res = client.get(url,headers = header)
    if res.headers.get('Content-Encoding') == 'br':
       data = res.content.decode('utf-8')
       print(data)
       
       else:
          print(res.text)

至此,关于Python3 Requests中文乱码问题中压缩格式的影响已介绍完毕。更多相关内容可参考本站过往文章或继续浏览后续内容,感谢支持。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表