本文由腾讯云+社区自动同步,原文地址 https://cloud.tencent.com/developer/article/1540946
gzip是网页文件在传输中使用的一种压缩方式,但是在以往的爬虫程序中我们往往忽略这个选项,只请求没有压缩的页面。
这两天要使用百度的统计api,发现需要使用python对gazip进行压缩与解压缩,就简单探索下用法。这些函数可以用在爬虫项目中。
python3和python2处理gzip的方式有些不同,主要是由于字符串的差异
import gzip
def gzdecode(data):
return gzip.decompress(data).decode('utf8')
import gzip
def gzencode(data):
if type(data) == str:
data = bytes(data, 'utf8')
s_out = gzip.compress(data)
return s_out
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
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()
既然可以用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