gzip解码问题

一个小故事

有对老夫妻为了完成年轻时的小遗憾,打算拍婚纱照,儿子为他们找到了一家婚纱摄影服务公司(以下简称服务公司)。服务公司为夫妻俩拍完婚纱照之后,准备把处理好的几百张照片通过QQ发给客户。可是几百张图片加起来有1GB以上,服务公司自然知道不能一张张发,不仅费时费力,很有可能还会被客户抱怨不专业,影响公司形象。像平常一样,服务公司把这几百张图片打包成一个压缩包,文件大小缩小了一半多,很快老夫妻客户就收到了服务公司发来的压缩包文件。可是服务公司忽略了老人家是个“计算机文盲”的可能性。事实上老夫妻也确实是不懂电脑,平时只会使用QQ,看看儿子发来的可爱孙子照片。这次不知道为什么服务公司只发给他们一张“图片”,而且打开还看不到照片应有画面,经过服务公司和儿子的解释,老夫妻还是似懂非懂,觉得电脑这玩意儿太复杂。

可能会有人觉得这么简单问题很容易处理。可是呢,信息时代,编码无处不在,不了解它,出了问题还不知道是不是编码问题

前段时间想写个爬虫爬取某网站的代理 IP,结果报错了:

提示解码错误,可是我已经写了decode("utf-8"),就以为是其它原因,但都没解决

经过长时间寻找都没结果后我放弃了。

隔了几天后

今天决心从简单的开始写,不久就发现了问题所在:原因是当时想伪装成浏览器以防被发现是爬虫。于是就把真浏览器的请求头信息都复制添加到了addheaders中。其中包括这个字段:("Accept-Encoding", "gzip, deflate")

这里表示告诉服务器:我的浏览器支持gzip、deflate这两种编码数据,你随便发。经过测试,deflate这种编码不会出现编码问题。导致报错的罪魁祸首就是gzip编码。这样我只需要把gzip编码删掉就可以避免这种问题出现。可是想想,这只能避免问题的出现,但不能根本解决这个问题。就像一个不会游泳的人可以不去河边避免掉进水里,但万一哪天有人故意把你弄到河里面去你咋整?

所以我很快就在网上找到了 解压gzip的方法(本质上也是一种解码)。

以前网络不够发达的年代,网速是很慢的,而计算机 CPU 计算速度远高于网速。为了提高数据传输速率,可以先把数据压缩变小后再发送,而gzip就是一种数据压缩编码,gzip这种编码的数据不能直接通过utf-8解码,需要在这之前把数据解压(解码)出来,才可根据需要进一步对数据utf-8解码处理。

更详细的流程是

客户端向服务端请求数据,在确认浏览器支持压缩编码后,服务器对要响应的数据进行了压缩处理(编码),然后向客户端发送压缩后的数据,客户端收到响应数据,确认发来的是压缩数据后需要对数据进行解压处理(解码)、根据需要再进行utf-8解码,最终才可以正确展示数据内容。

解压gzip可以利用gzip模块decompress()方法,把压缩编码的数据作为decompress()的参数传入即可返回解压缩后的数据,再根据需要进一步 decode("utf-8") 即可得到真正的内容

代码片段:

但不一定每次都是压缩数据所以

欢迎关注display3D

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171213G0OR0P00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券