博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于 Content-Encoding: gzip - 知道创宇
阅读量:6278 次
发布时间:2019-06-22

本文共 819 字,大约阅读时间需要 2 分钟。

关于 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

转载地址:http://hgyva.baihongyu.com/

你可能感兴趣的文章
Vue组建通信
查看>>
用CSS画一个带阴影的三角形
查看>>
前端Vue:函数式组件
查看>>
程鑫峰:1.26特朗.普力挺美元力挽狂澜,伦敦金行情分析
查看>>
safari下video标签无法播放视频的问题
查看>>
01 iOS中UISearchBar 如何更改背景颜色,如何去掉两条黑线
查看>>
对象的继承及对象相关内容探究
查看>>
Spring: IOC容器的实现
查看>>
Serverless五大优势,成本和规模不是最重要的,这点才是
查看>>
Nginx 极简入门教程!
查看>>
iOS BLE 开发小记[4] 如何实现 CoreBluetooth 后台运行模式
查看>>
Item 23 不要在代码中使用新的原生态类型(raw type)
查看>>
为网页添加留言功能
查看>>
JavaScript—数组(17)
查看>>
Android 密钥保护和 C/S 网络传输安全理论指南
查看>>
以太坊ERC20代币合约优化版
查看>>
Why I Began
查看>>
同一台电脑上Windows 7和Ubuntu 14.04的CPU温度和GPU温度对比
查看>>
js数组的操作
查看>>
springmvc Could not write content: No serializer
查看>>