python3使用gzip壓縮與解壓縮
- 2019 年 11 月 20 日
- 筆記
背景
gzip是網頁文件在傳輸中使用的一種壓縮方式,但是在以往的爬蟲程序中我們往往忽略這個選項,只請求沒有壓縮的頁面。
這兩天要使用百度的統計api,發現需要使用python對gazip進行壓縮與解壓縮,就簡單探索下用法。這些函數可以用在爬蟲項目中。
python3和python2處理gzip的方式有些不同,主要是由於字符串的差異
python3 代碼
解壓gzip
import gzip def gzdecode(data): return gzip.decompress(data).decode('utf8')
壓縮gzip
import gzip def gzencode(data): if type(data) == str: data = bytes(data, 'utf8') s_out = gzip.compress(data) return s_out
python2 代碼
python2的代碼沒有測試,直接從老代碼copy的。
這些代碼在python3中會報錯ModuleNotFoundError: No module named 'cStringIO'
, 原因是:
從Python 3.0開始,StringIO和cStringIO模塊已經取消。通過import io模塊代替,分別使用io.String或io.BytesIO處理文本和數據。 解壓gzip
import gzip import StringIO def gzdecode(data): f = StringIO(data) gziper = gzip.GzipFile(fileobj=f, compresslevel=9) data2 = gziper.read() # 讀取解壓縮後數據 gziper.close() return data2
壓縮gzip
import gzip import StringIO def gzencode(data): f = StringIO.StringIO() gziper = gzip.GzipFile(fileobj=f, mode='wb', compresslevel=9, ) gziper.write(data) # 壓縮後數據 gziper.close() return f.getvalue()
requests示例
既然可以用gzip了,那麼就測試下效果,這裡我們用gzip格式請求百度首頁。 requests可以自動幫我們處理gzip,這裡我們請求原始數據,自己解壓
import gzip import requests ret = requests.get('https://www.baidu.com', stream=True) ret_gzip = ret.raw.read() print(gzip.decompress(ret_gzip).decode('utf8'))
TODO:
- 我們不知道
ret.raw
中是不是gzip壓縮,需要加判斷 - 目前還不太清楚為什麼已經用了
requests
, 還要自己處理gzip
. 百度統計api python2 github