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
猜你喜欢
- 一、数据库操作1、创建model表基本结构:#coding:Utf8from django.db import modelsclass us
- 我们的机器学习任务通常会跟全局图像的问题有关(例如,“图像是否包含一只猫呢?”),所以我们最后一层的神经元应该对整个输入的全局敏感。通过逐渐
- 前言今天我看了一下自己的文件夹,发现了自己写了许多似乎很无聊的代码。于是乎,一个想法油然而生:“生活已经很无聊了,不如再无聊一点叭”。说干就
- 导言:在前面的教程里我们探讨了如何为GridView控件添加radio buttons列。当用户最多只能选择一项数据时,我们可以在用户界面里
- 要达到二级名的效果,必须一下条件以及流程:1、必须有一个顶级域名,而且此域名必须做好泛解析并做好指向。2、必须有一台属于你的独立的服务器。泛
- 原文:Unobtrusive Ajax。今天才看见的一个Presentation,是Jesse Skinner在06年10月发表的。虽然题目
- 1 为什么需要防抖和节流在前端开发当中,有些交互事件,会被频繁触发,这样会导致我们的页面渲染性能下降,如果频繁触发接口调用的话,会直接导致服
- 准备在以后制作的网站中尝试一些变化,比如:先提交内容,后提示注册/登陆。感觉这样可以绑架更多用户……不想注册再发言?那就先让你上钩发言,然后
- 一、设计说明设计这个自动化的目的是想要交替、重复地使用固定的几个分区(分区编号01~05)来保存数据,当最后一个分区就是快满的时候,我们会把
- 网上有很多关于PHP在IIS下配置的教程,但都是一些很理性化的东西,我从里面整理出来这个教程 发出来为了方便参考,有什么问题也可以大家一起交
- MySQL目前不支持列的Default 为函数的形式,如达到你某列的默认值为当前更新日期与时间的功能,你可以使用TIMESTAMP列类型下面
- 阅读上一章:Chapter 14 图片替换Chapter 15 为<body>指定样式把内容与显示效果分开设定的好处之一就是灵活
- 本文实例为大家分享了python定时发送邮件的具体代码,供大家参考,具体内容如下全部代码如下:import timefrom datetim
- 相对于自动化测试工具QTP来说,selenium小巧、免费,而且兼容Google、FireFox、IE多种浏览器,越来越多的人开始使用sel
- 车牌识别在高速公路中有着广泛的应用,比如我们常见的电子收费(ETC)系统和交通违章车辆的检测,除此之外像小区或地下车库门禁也会用到,基本上凡
- 正常使用了go 1.8一段时间没有发现异常,为了发布便捷,以及后期引入plug-in,开始将大项目分解。涉及到通过vendor引入私有库保存
- 1、手上目前拥有数据集是一大坨,没有train,test,val的划分如图所示2、目录结构:|---data |
- 今日一同时问我,new Date(Date(str))这段代码什么意思?我一看就晕了,一个new Date 一个Date这是什么意思?这函数
- PHP mysqli_stmt_init() 函数初始化声明并返回 mysqli_stmt_prepare() 使用的对象:<?php
- 如果你的网站涉及个人隐私或者机密性非公开的网页,怎样告诉禁止搜索引擎收录抓取,下面侯庆龙说下以下方法,希望对不想被搜索引擎收录抓取网站有所帮