本文来自依云'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 里都没写,看了源码才知道 :-(
Oct 27, 2012 09:37:39 PM
虽然目前用不到,但关注一下。
Feb 03, 2013 05:42:57 PM
啊。我正好也在研究这个呢。
找到我的抓网址机器人无法抓B站的原因了。
因为B站强制压缩成了gzip。(不管有没有 Accept-Encoding,这一定是它们的 nginx 配置失误)
所以我要解压,又不想全部解压。。。
Jul 26, 2016 06:47:32 PM
能详细解释一下吗?
Jul 27, 2016 11:15:30 AM
不能。毕竟这不是教程。