python请求返回乱码的一种非常规解决方案
当你尝试过各种修改 response 的编码,但仍然不行时,可以尝试修改 Accept-Encoding 或者手动解压缩。以 zstd 为例。
·
首先,我们需要先来认识一下请求头中 Accept-Encoding 的值所代表的意思:
-
gzip
- 类型 :压缩算法。
- 描述 :基于 DEFLATE 算法的压缩格式(RFC 1952),是目前最常用的压缩方式之一。
- 特点 :压缩率较高,兼容性好,几乎所有现代浏览器和服务器都支持。
-
deflate
- 类型 :压缩算法。
- 描述 :直接使用 zlib 编码的 DEFLATE 算法(RFC 1951),但早期实现可能存在兼容性问题(如数据头处理差异)。
- 特点 :压缩率略低于 gzip,但传输开销更小。
-
br (Brotli)
- 类型 :压缩算法。
- 描述 :由 Google 开发的现代压缩算法(RFC 7932),支持高压缩率和快速解压。
- 特点 :压缩率比 gzip 高 20-26%,但需要服务器和客户端同时支持(较新的浏览器和服务器支持)。
-
zstd (Zstandard)
- 类型 :压缩算法。
- 描述 :由 Facebook 开发的快速压缩/解压算法(RFC 8478),强调速度和高压缩率的平衡。
- 特点 :压缩速度极快,适合大数据传输,但支持范围相对较新,部分旧设备或服务器可能不支持。
因此,当你尝试过各种修改 response 的编码,但仍然不行时,可以尝试修改 Accept-Encoding 或者手动解压缩。以 zstd 为例。
方案一、手动解码
代码如下:
import zstandard as zstd
print(zstd.__version__) # 输出 zstd 版本
# 创建解压器
decompressor = zstd.ZstdDecompressor()
# 流式解压(逐块读取)
with decompressor.stream_reader(response.content) as reader:
decompressed_data = reader.read()
print(decompressed_data.decode("utf-8"))
从下面的截图可以看到数据成功从乱码被解压成了html

方案二、修改 Accept-Encoding
headers['accept-encoding'] = 'gzip,deflate,br'
三、结论
使用方案一和方案二都可以解决由于 zstd 压缩引起的问题
更多推荐



所有评论(0)