python3 requests中文乱码问题之压缩格式问题
Posted Jason_WangYing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3 requests中文乱码问题之压缩格式问题相关的知识,希望对你有一定的参考价值。
我们在爬虫时,经常会遇见中文乱码问题,之前都是编码格式的问题,很少遇见由于压缩格式造成的编码混乱问题,特记录下。先看下混乱的编码样式。
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
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,我们的数据是jason格式,这时要考虑中文转换问题,用utf-8来把中文从unicode转过来。
我们转了后发现解析出来的数据还是乱码,这是什么情况呢?我们先看下请求头和响应头关于字段的解释
请求头字段 | 说明 | 响应头字段 |
Accept | 告知服务器发送何种媒体类型 | Content-Type |
Accept-Language | 告知服务器发送何种语言 | Content-Language |
Accept-Charset | 告知服务器发送何种字符集 | Content-Type |
Accept-Encoding | 告知服务器采用何种压缩方式 | Content-Encoding |
我们再看"Accept-Encoding",这个意思就是返回的数据使用的是什么压缩格式,平常我们经常使用"gzip, deflate",这是我们发现后面还跟了个br,br是什么格式呢?
br 指的是 Brotli,是一种全新的数据格式,无损压缩,压缩比极高(比gzip高的)
这需要单独导入brotil库
安装
pip install Brotli
安装后我们使用brotli来解析数据即可,
data = brotli.decompress(res.content)
还有一种最简单的方法,我们修改请求头,高速服务器,我不支持br格式,这样服务器就不会用br来压缩数据了
"Accept-Encoding": "gzip, deflate",
补充下:BrotliDecompress failed错误问题
刚开始我用request库时发现,对返回的response数据必须要引入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会自动引入,自动调用
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中文乱码问题之压缩格式问题的主要内容,如果未能解决你的问题,请参考以下文章
python3爬虫中文乱码之请求头‘Accept-Encoding’:br 的问题
Python3的requests类抓取中文页面出现乱码的解决办法
win10+python3.5,使用requests抓取信息遇到chunked乱码的诡异问题。python2.7则不乱码