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:

  1. 我們不知道ret.raw中是不是gzip壓縮,需要加判斷
  2. 目前還不太清楚為什麼已經用了requests, 還要自己處理gzip. 百度統計api python2 github