网站首页 文章专栏 python3使用gzip压缩与解压缩
python3使用gzip压缩与解压缩
创建于:2019-04-19 03:23:21 更新于:2024-11-22 09:54:49 羽瀚尘 5316
python python,压缩

背景

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