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