作为爬虫,如何避免踩中 gzip 炸弹?

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

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

查看 gzip 炸弹的 URL 返回的 Headers,你会发现如下图所示的字段:

你只需要判断 resp.headers 中,是否有一个名为 content-encoding ,值包含 gzip deflate 的字段。如果没有这个字段,或者值不含 gzip deflate 那么你就可以放心,它大概率不是炸弹。

值得一提的是,当你不读取 resp.content resp.text 的时候,Requests 是不会擅自给你解压缩的,如下图所示。因此你可以放心查看 Headers。:

那么,如果你发现网站返回的内容确实是 gzip 压缩后的内容了怎么办呢?这个时候,我们如何做到既不解压缩,又能获取到解压以后的大小?

如果你本地检查一个 .gz 文件,那么你可以使用命令 gzip -l xxx.gz 来查看它的头信息:

打印出来的数据中,第一个数字是压缩后的大小,第二个数字是解压以后的大小,第三个百分比是压缩率。这些信息是储存在压缩文件的头部信息中的,不用解压就能获取到。

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

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

运行效果如下图所示:

此时可以看到,这个大小是压缩后的二进制数据的大小。现在,我们可以使用如下代码,在不解压的情况下,查询到解压缩后的文件大小:

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)

运行效果如下图所示:

打印出来的数字转成 MB 就是 10MB,也就是我们昨天测试的解压后的文件大小。

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

崔庆才的新书《Python3网络爬虫开发实战(第二版)》已经正式上市了!书中详细介绍了零基础用 Python 开发爬虫的各方面知识,同时相比第一版新增了 JavaScript 逆向、Android 逆向、异步爬虫、深度学习、Kubernetes 相关内容,‍同时本书已经获得 Python 之父 Guido 的推荐,目前本书正在七折促销中!

内容介绍: 《Python3网络爬虫开发实战(第二版)》内容介绍

好文和朋友一起看~

这是「进击的Coder」的第 580篇技术分享作者:kingname来源:未闻Code“ 阅读本文大概需要 3 分钟。 ”作为爬虫,如何避免踩中 gzip 炸弹?最直接的方法,就是把你的...
jsoup是一款Java的HTML解析器,主要用来对HTML解析。在 爬虫 的时候,当我们用HttpClient之类的框架,获取到网页源码之后,需要从网页源码中取出我们想要的内容,就可以使用jsoup这类HTML解析器了。可以非常 轻松 的实现。 虽然jsoup也支持从某个地址直接去爬取网页源码,但是只支持HTTP,HTTPS协议,支持不够丰富。所以,主要还是用来对HTML进行解析。 #Jsoup地址 https://www.open-open.com/jsoup/ #在maven中央仓库的地址 https:
作为一个站长,你是不是对 爬虫 不胜其烦? 爬虫 天天来爬,速度又快,频率又高,服务器的大量资源被白白浪费。 看这篇文章的你有福了,我们今天一起来报复一下 爬虫 ,直接把 爬虫 的服务器给干死机。 本文有一个前提:你已经知道某个请求是 爬虫 发来的了,你不满足于单单屏蔽对方,而是想搞死对方。 很多人的 爬虫 是使用Requests来写的,如果你阅读过Requests的文档,那么你可能在文档中的Binary Response Content[1]这一小节,看到这样一句话: The gzip and deflate transf
使用 python 3做 爬虫 的时候,一些网站为了防 爬虫 会在请求头设置一些检查机制,因此我们就需要添加请求头,伪装成浏览器正常访问。 字段情况,详见下表: 请求头字段 说明 响应头字段 Accept 告知服务器发送何种媒体类型 Content-Type Accept-Language 告知服务器发送何种语言 Content-Language Accept-Charset 告知服务器发送何种字符集 Content-Type Accept-Encoding 告知服务器采用何种压缩方式 Content-Encoding
'Connection': 'keep-alive', #'Content-Length': '37', 'Accept': 'application/json, text/javascript, */*; q=0.01',
有的时候用 爬虫 爬一个网页下来发现是乱码,上网站f12一看: <meta http-equiv="Content-Type" content="text/html" charset="utf-8"> 没错呀,是utf-8,然而爬下来,乱码惨不忍睹: 这时候很有可能是网站开启了 gzip 压缩,只要在option里加上这一项: var options = { gzip : true, // ...其他 就可以顺利爬取下来了: 而 gzip 是什么呢? gzip 最初是用在UNIX系统
最直接的方法,就是把你的 爬虫 隐藏起来,因为 gzip 炸弹 只能在发现了 爬虫 以后使用,否则就会影响到正常用户。只要你的 爬虫 让网站无法发现,那么自然就不会踩中 炸弹 。 如果你没有把握隐藏 爬虫 ,那么,请继续往下看。 查看 gzip 炸弹 的URL返回的Headers,你会发现如下图所示的字段: 你只需要判断resp.headers中,是否有一个名为content-encoding,值包含 gzip 或deflate的字段。如果没有这个字段,或者值不含 gzip 、deflate那么你就可以放心,它大概率不是 炸弹
如何用java实现小明最近迷上了一款名为《扫雷》的游戏。 其中有一个关卡的任务如下: 在一个二维平面上放置着 n 个炸雷,第 i 个炸雷 (xi,yi,ri) 表示在坐标 (xi,yi) 处存在一个炸雷,它的爆炸范围是以半径为 ri 的一个圆。 为了顺利通过这片土地,需要玩家进行 排雷 。 玩家可以发射 m 个 排雷 火箭,小明已经规划好了每个 排雷 火箭的发射方向,第 j 个 排雷 火箭 (xj,yj,rj) 表示这个 排雷 火箭将会在 (xj,yj) 处爆炸,它的爆炸范围是以半径为 rj 的一个圆,在其爆炸范围内的炸雷会被引爆。 同时,当炸雷被引爆时,在其爆炸范围内的炸雷也会被引爆。 现在小明想知道他这次共引爆了几颗炸雷? 你可以把炸雷和 排雷 火箭都视为平面上的一个点。 一个点处可以存在多个炸雷和 排雷 火箭。 当炸雷位于爆炸范围的边界上时也会被引爆。 输入格式 输入的第一行包含两个整数 n、m。 接下来的 n 行,每行三个整数 xi,yi,ri,表示一个炸雷的信息。 再接下来的 m 行,每行三个整数 xj,yj,rj,表示一个 排雷 火箭的信息。 输出格式 输出一个整数表示答案。
1. 定义一个类,代表一个炸雷或 排雷 火箭。这个类应该包含三个成员 量:x 坐标、y 坐标和半径。 2. 定义一个函数,用于判断两个炸雷或 排雷 火箭是否会相互影响,也就是看它们的爆炸范围是否重叠。你可以使用勾股定理来计算两个点之间的距离,然后比较它们的半径之和与距离的大小关系。如果距离小于等于半径之和,则两个炸雷或 排雷 火箭的爆炸范围重叠。 3. 定义一个函数,用于模拟 排雷 过程。这个函数应该接受两个参数:一个炸雷数组和一个 排雷 火箭数组。你可以使用两重循环遍历数组,然后利用前面定义的函数来判断每个炸雷和每个 排雷 火箭是否会相互影响。如果会,就把炸雷的状态改为“已引爆”。 4. 定义一个函数,用于计算最终引爆的炸雷数量。你可以再次使用两重循环遍历炸雷数组,统计“已引爆”状态的炸雷数
JoJo_Leics: 我最近也遇到了这个问题,其实不是get_token有问题,而是因为我们自己本地的js根本没有替换成功,自然也拿不到window.encrypt。 没有替换成功的原因也很怪,其实是page.route里的第一个参数的文件路径不对,我不清楚为什么用相对路径不行,暂时还在找原因,但你直接换成https://spa2.scrape.center/js/chunk-10192a00.243cb8b7.js就可以替换成功了 [code=python] page.route( "https://spa2.scrape.center/js/chunk-10192a00.243cb8b7.js", lambda route: route.fulfill(path="./chunk.js") [/code] 只要改动这里就可以替换本地js,拿到挂载给window对象的encrypt属性了 可能是palywright版本的问题? 我暂时还没在网上找到对应的回答 一点知识丨Vue.js 中 prop 如何科学地实现双向绑定 Julia412139: 学到了,谢谢