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

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