10
26
2012
4

在 Python 中流式解压 gzip 数据

本文来自依云's Blog,转载请注明。

在处理 HTTP 响应时,我需要来一段数据就处理一段。为了节约网络资源,我开启了 gzip 传输。然后问题来了:有什么办法把 gzip 过的数据一段段传进去,它能一段段地解压并吐出数据呢?gzip 模块虽然支持fileobj参数,但是它读不到数据时认为数据流已经结束,然后进行 CRC 校验……这里有个人也这样尝试过。解决办法也有了

d = zlib.decompressobj(16+zlib.MAX_WBITS)

使用一个神奇的数字构造一个decompress对象,然后不断地调用它的decompress方法就可以得到一段段的解压数据了 :-)

然后,我发现我真的想太多了——我用的可流式解析 HTTP 响应的库 http-parser 原生支持解压的,而且同时支持 gzip 和 deflate 方法!这个库能很好地适配到异步 I/O 框架中,可是文档太少了,这个解压的支持 docstring 里都没写,看了源码才知道 :-(

Category: python | Tags: Python HTTP | Read Count: 23356
秋景雨 说:
Oct 27, 2012 09:37:39 PM

虽然目前用不到,但关注一下。

陆仁贾 说:
Feb 03, 2013 05:42:57 PM

啊。我正好也在研究这个呢。
找到我的抓网址机器人无法抓B站的原因了。
因为B站强制压缩成了gzip。(不管有没有 Accept-Encoding,这一定是它们的 nginx 配置失误)
所以我要解压,又不想全部解压。。。

test 说:
Jul 26, 2016 06:47:32 PM

能详细解释一下吗?

Avatar_small
依云 说:
Jul 27, 2016 11:15:30 AM

不能。毕竟这不是教程。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com