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')