Python3 解压 HTTP 压缩数据

Python3 解压 HTTP 压缩数据

Web 压缩常见方式有 gzip,deflate 等。而 Brotli 是一种由 Google 开发的全新压缩算法,可以有效减小传输内容大小,加速分发效果。

当客户端的请求携带请求头 Accept-Encoding: br 时,表示客户端希望获取对应资源时进行 Brotli 压缩。当服务端响应携带响应头 Content-Encoding: br 时,表示服务端响应的内容是 Brotli 压缩的资源。需要注意的是,只有在 HTTPS 的情况下,浏览器才会发送 br 这个 Accept-Encoding 。目前,知乎已经启用了 Brotli 压缩。

知乎 Brotli 压缩

当我们使用 Python 获取 request 数据时,如果 response 使用了压缩,必须解压才能正常阅读显示,不然就会出现“乱码”。以下简单说明在 Python 中如何解压 gzip HTTP 压缩数据,和如何解压最新的 Brotli(br)HTTP 压缩数据。

Python3 解压 gzip HTTP 压缩数据

当 response 的 headers 中的 Content-Encodinggzip时,就必须进行gzip解压了。代码如下:

import gzip
import io

# ...

content_encoding = response.getheader('Content-Encoding')

if content_encoding == 'gzip' :
    buf = io.BytesIO(response.read())
    gf = gzip.GzipFile(fileobj = buf)
    content = gf.read().decode('UTF-8')

Python3 解压 br HTTP 压缩数据

同样的,可以通过Content-Encoding查看压缩格式,如果是br,就用 Brotli 解压。在 Python3 中 Brotli 不是内建的库,需要单独安装,pip install brotli,然后就可以导入使用了,import brotli。代码如下:

import brotli

# ...

# 当客户端的请求携带请求头 `Accept-Encoding: br` 时,表示客户端希望获取对应资源时进行 Brotli 压缩
request.add_header('accept-encoding', 'gzip, deflate, br')

content_encoding = response.getheader('Content-Encoding')
if content_encoding == 'br' :
    content = brotli.decompress(response.read()).decode('UTF-8')

参考

HTTP headers Content-Encoding
Brotli Github repository

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章