关于 Content-Encoding: gzip - 知道创宇

关于 Content-Encoding: gzip - 知道创宇

关于 Content-Encoding: gzip

2012-04-20

背景
===
如果你的网页抓取程序(例如爬虫)在抓取网页时没有发送 Accept-Encoding: gzip,那么你 out 了:
因为今天超过  99% 的网页抓取程序都会声明支持 gzip (或 deflate) 编码。

如果你的程序属于这 99%,那么恭喜,但别高兴的太早。 你的程序是否正确处理了 Content-Encoding: gzip?

问题
===
典型的处理 Content-Encoding: gzip 的代码片段 (python):

html_data = GzipFile(fileobj=StringIO(html_data), mode="r").read()

假设 html_data 为 Web 服务器返回的Content-Encoding 为 gzip 的数据。

那么在大多数情况下,上述代码都能正确处理。 但很不幸,你会发现,对有些 url,浏览器可以正常显示内容,
但是你的网页抓取程序会出错!

分析
===
不是所有 Web 服务器(或应用)都是遵纪守法的公民。 极少数应用,会在 gzip 压缩后的数据后面,添加一些“尾巴”数据。
一些数据解压模块(如Python 的 GzipFile 模块)在这种情况下会出现处理异常。

例外的是浏览器。它们充分体会和考虑到了现实世界的复杂,会自动抛弃多出的“尾巴”,正常解压和处理页面数据。

解决
===
Python GzipFile 模块有个未公开属性: extrabuf, 负责保存已经成功解压的数据。 因此,下面的代码有更好的兼容性:

try:
    gf = GzipFile(fileobj=StringIO(html_data), mode="r")
    html_data = gf.read()
except:
    html_data = gf.extrabuf
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值