python3 requests中文乱码之压缩格式问题解析
作者:Jason_WangYing 发布时间:2021-12-13 17:03:28
我们在爬虫时,经常会遇见中文乱码问题,之前都是编码格式的问题,很少遇见由于压缩格式造成的编码混乱问题,特记录下。先看下混乱的编码样式。
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)
来源:https://blog.csdn.net/Jason_WangYing/article/details/126374604


猜你喜欢
- random模块用于生成随机数,下面看看模块中一些常用函数的用法:from numpy import randomnumpy.random.
- replace(param1,param2,param3)param1 正则表达式;param2 将匹配的字符替换成指定字符;param3
- 最近有一个项目,需要检查某个字符型字段的值是否为数字,由于数据行是海量,所以需要通过SQL语句来筛查,这里拿来做个备忘。用到的函数为IsNu
- 在具体数据的选取上,我爬取的是各省份降水量实时数据话不多说,开始实操正文 1.爬取数据使用python爬虫,爬取中国天气网各省份2
- 第一步一般是建立一个关键字替换表 如 id keyword url 等字段第二步是文章显示时把【文章】内容和【关键字替换表】对应的关键字替换
- 一、先开启xp_cmdshell打开外围应用配置器—>功能的外围应用配置器—>实例名\Database Engine\xp_cm
- 在上一篇的基础上,继续在透明窗体上绘制小球,一、画个大球看看(一)核心代码在on_resize函数内部增加如下画圆的代码 can
- 本文实例讲述了python实现获取序列中最小的几个元素。分享给大家供大家参考。具体方法如下:import heapq import rand
- 百万级数据处理方案数据存储结构设计表字段设计表字段 not null,因为 null 值很难查询优化且占用额外的索引空间,推荐默认数字 0。
- 目录一、MySQL的join buffer二、join buffer cache存储空间的分配三、普通的多表查询实现四、join buffe
- 很多人都已经把 Javascript的用的炉火纯青了,但见到defer未必就知道他是做什么用的;很多人也都遇到过这样的问题,需要直接执行别且
- 1. 写在前面的话在开发数据库时,特别是写存储过程,遇到比较复杂的需求,使用临时表可以简化很多逻辑。曾经在一家互联网金融公司供职,公司数据组
- 正在看的ORACLE教程是:ORACLE常见错误代码的分析与解决三。 -----------------------------
- 逻辑判断与逻辑语句对于─件事情正确与否(真假的判断) √ X根据判断的结果做不同的事情,就是我们的逻辑业务对于条件满足的判断语句,就是条件语
- python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差。“一行代
- import导入包呈现灰色问题问题描述pycharm中单个py文件导入包时呈灰色,而别的文件却能正常显示,我按照CSDN博客上给的设置①右键
- 实现效果将位于/img目录下的1000张.png图片,转换成.webp格式,并存放于img_webp文件夹内。源图片目录目标图片目录关于批量
- transpose() 这个函数如果括号内不带参数,就相当于转置,和.T效果一样,而今天主要来讲解其带参数。我们看如下一个numpy的数组:
- 1. 序言每年淘宝双十一的时候,总是要刷各种各样的浏览页面,收集能量或者喵币或者什么。那既然如此,我就总想着,能否通过Python自动调用的
- 一、定义字典是一系列的键-值对,键与值之间用冒号隔开,而键-值对之间用逗号隔开,其中的“键”和&am