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