作为爬虫,如何避免踩中 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:
一点知识丨Vue.js 中 prop 如何科学地实现双向绑定
Julia412139: