阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

轻松排雷:爬虫让Gzip炸弹变哑炮

74次阅读
没有评论

共计 1076 个字符,预计需要花费 3 分钟才能阅读完成。

最直接的方法,就是把你的爬虫隐藏起来,因为 gzip 炸弹只能在发现了爬虫以后使用,否则就会影响到正常用户。只要你的爬虫让网站无法发现,那么自然就不会踩中炸弹。

如果你没有把握隐藏爬虫,那么,请继续往下看。

查看 gzip 炸弹的 URL 返回的 Headers,你会发现如下图所示的字段:
轻松排雷:爬虫让 Gzip 炸弹变哑炮
你只需要判断 resp.headers 中,是否有一个名为 content-encoding,值包含 gzip 或 deflate 的字段。如果没有这个字段,或者值不含 gzip、deflate 那么你就可以放心,它大概率不是炸弹。

值得一提的是,当你不读取 resp.content、resp.text 的时候,Requests 是不会擅自给你解压缩的,如下图所示。因此你可以放心查看 Headers。:
轻松排雷:爬虫让 Gzip 炸弹变哑炮
那么,如果你发现网站返回的内容确实是 gzip 压缩后的内容了怎么办呢? 这个时候,我们如何做到既不解压缩,又能获取到解压以后的大小?

如果你本地检查一个.gz 文件,那么你可以使用命令 gzip -l xxx.gz 来查看它的头信息:
轻松排雷:爬虫让 Gzip 炸弹变哑炮
打印出来的数据中,第一个数字是压缩后的大小,第二个数字是解压以后的大小,第三个百分比是压缩率。这些信息是储存在压缩文件的头部信息中的,不用解压就能获取到。

那么当我使用 Requests 的时候,如何获得压缩后的二进制数据,防止它擅自解压缩? 方法其实非常简单:

import requests
resp = requests.get(url, stream=True)
print(resp.raw.read())

运行效果如下图所示:
轻松排雷:爬虫让 Gzip 炸弹变哑炮
此时可以看到,这个大小是压缩后的二进制数据的大小。现在,我们可以使用如下代码,在不解压的情况下,查询到解压缩后的文件大小:

import gzip
import io
import requests
resp = requests.get(url, stream=True)

decompressed = resp.raw.read()
with gzip.open(io.BytesIO(decompressed), 'rb') as g:
    g.seek(0, 2)
    origin_size = g.tell()
    print(origin_size)

运行效果如下图所示:
轻松排雷:爬虫让 Gzip 炸弹变哑炮
打印出来的数字转成 MB 就是 10MB,也就是我们昨天测试的解压后的文件大小。

使用这个方法,我们就可以在不解压的情况下,知道网站返回的 gzip 压缩数据的实际大小。如果发现实际尺寸大得离谱,那就可以确定是 gzip 炸弹了,赶紧把它丢掉。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1076字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中