Python3 解压 HTTP 压缩数据
Web 压缩常见方式有 gzip,deflate 等。而 Brotli 是一种由 Google 开发的全新压缩算法,可以有效减小传输内容大小,加速分发效果。
当客户端的请求携带请求头 Accept-Encoding: br
时,表示客户端希望获取对应资源时进行 Brotli 压缩。当服务端响应携带响应头 Content-Encoding: br
时,表示服务端响应的内容是 Brotli 压缩的资源。需要注意的是,只有在 HTTPS 的情况下,浏览器才会发送 br
这个 Accept-Encoding
。目前,知乎已经启用了 Brotli 压缩。
当我们使用 Python 获取 request 数据时,如果 response 使用了压缩,必须解压才能正常阅读显示,不然就会出现“乱码”。以下简单说明在 Python 中如何解压 gzip HTTP 压缩数据,和如何解压最新的 Brotli(br)HTTP 压缩数据。
Python3 解压 gzip HTTP 压缩数据
当 response 的 headers 中的 Content-Encoding
为gzip
时,就必须进行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')