python3 requests中文乱码问题之压缩格式问题

本文详细记录了在爬虫过程中遇到的由Brotli压缩格式引起的中文乱码问题。首先展示了乱码的示例,然后分析了请求头和响应头中的Content-Type和Accept-Encoding字段。在了解到Brotli是一种高压缩比的数据格式后,介绍了如何通过安装和使用Brotli库来解压数据。此外,还提到了在使用httpx库时,无需手动处理Brotli解压,httpx会自动处理。最后,文章提供了解决BrotliDecompressFailed错误的方法。
部署运行你感兴趣的模型镜像

我们在爬虫时,经常会遇见中文乱码问题,之前都是编码格式的问题,很少遇见由于压缩格式造成的编码混乱问题,特记录下。先看下混乱的编码样式。

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.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 解决 Python 网页爬虫中的中文乱码问题 #### 1. 使用 `requests` 库获取网页内容并处理编码 为了防止因默认编码设置不当而导致的乱码现象,在使用 `requests.get()` 方法时可以先通过 `.content` 获取原始字节数据,再手动指定解码方式: ```python import requests url = "http://example.com" headers = { &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64)&#39;, } response = requests.get(url, headers=headers) # 尝试检测页面的真实编码 if response.encoding == &#39;ISO-8859-1&#39;: encodings = [&#39;utf-8&#39;, &#39;gb2312&#39;] for encoding in encodings: try: content = response.content.decode(encoding) break except UnicodeDecodeError: continue else: content = response.text ``` 此段代码尝试识别服务器返回的实际编码格式,并优先考虑常见的 UTF-8 或 GBK 编码[^1]。 #### 2. 处理特定类型的压缩算法(如 Brotli) 某些现代网站可能会采用更高效的压缩技术来减少传输的数据量。如果遇到 `&#39;Content-Encoding&#39;: &#39;br&#39;` 这样的情况,则需要引入额外的支持库来进行解压操作: ```python import brotli key = &#39;Content-Encoding&#39; if key in response.headers and response.headers[key] == &#39;br&#39;: decompressed_data = brotli.decompress(response.content).decode(&#39;utf-8&#39;) else: decompressed_data = response.text ``` 这段逻辑能够有效应对由 Brotli 压缩引起的潜在乱码问题[^3]。 #### 3. 利用 BeautifulSoup 正确解析 HTML 文档 在创建 Beautiful Soup 对象时显式指明文档的编码有助于避免不必要的麻烦: ```python from bs4 import BeautifulSoup soup = BeautifulSoup(content, features="html.parser", from_encoding=&#39;utf-8&#39;) print(soup.prettify()) ``` 这里特别强调了 `from_encoding` 参数的重要性,它可以帮助我们更好地控制输入流的解释过程。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值