首先,我们需要先来认识一下请求头中 Accept-Encoding 的值所代表的意思:

  1. gzip

    • 类型 :压缩算法。
    • 描述 :基于 DEFLATE 算法的压缩格式(RFC 1952),是目前最常用的压缩方式之一。
    • 特点 :压缩率较高,兼容性好,几乎所有现代浏览器和服务器都支持。
  2. deflate

    • 类型 :压缩算法。
    • 描述 :直接使用 zlib 编码的 DEFLATE 算法(RFC 1951),但早期实现可能存在兼容性问题(如数据头处理差异)。
    • 特点 :压缩率略低于 gzip,但传输开销更小。
  3. br (Brotli)

    • 类型 :压缩算法。
    • 描述 :由 Google 开发的现代压缩算法(RFC 7932),支持高压缩率和快速解压。
    • 特点 :压缩率比 gzip 高 20-26%,但需要服务器和客户端同时支持(较新的浏览器和服务器支持)。
  4. 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 压缩引起的问题

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐