那个爬虫贴在这里:默默的撸了套爬虫...
很多人的关注点在那几个简单粗暴的循环上,虽然的确是略粗暴了点,但对于爬虫来说,这不是重点,重点是:
每个请求之间没有合理的时间停顿。
这对于被爬取的服务器才真的是粗暴。
也许有人会说,获取网页后的处理过程(此处甚至包含数据库操作)就是一个给服务器喘息的过程;也许还有人会说每秒几个几十个的请求对于服务器来说小 CASE 不然网站还是关停算了。
暂且不论服务器是否能承受的问题,我想有些人学爬虫根本不知道robots.txt
,也没想过这是在免费获取他人网站的信息不应该给他人服务器施加太大压力,他们只想快速获取自己想要的内容。一个热门网站(微博为例),如果爬取的人很多,并且都不停顿甚至加多线程,对于服务器的压力可想而知。
当初学爬虫的时候,作者在书中第一个例子里就加了sleep
,并且反复强调这很重要。我也想如此强调,这很重要。
在写不加停顿 /多线程的爬虫时,我们是否应该思考如下问题:
一点小小的想法,如果能给大家一点小小的启发,非常荣幸。也欢迎大家讨论自己的爬虫习惯。
1
qu3290052 2018-03-18 08:28:46 +08:00 via Android
人是自私的,我只会想着最快时间爬完
|
2
qu3290052 2018-03-18 08:30:12 +08:00 via Android
例如你做一个网站最新内容抓取,肯定考虑及时性,所以我会把 get 间隔越小越好
|
3
Hydjan 2018-03-18 08:37:50 +08:00
学习了
|
4
chuanqirenwu 2018-03-18 08:46:42 +08:00
研究表明,人类访问网站的时间间隔分布服从幂律分布且具有爆发( burst )的特性。
|
5
mengzx 2018-03-18 09:22:22 +08:00
感觉一般都会停顿吧,否则大家都不好过
|
6
whwq2012 2018-03-18 09:25:34 +08:00 via Android
我会停顿,我的潜意识告诉我,爬得太频繁,把网站弄崩了,抛出异常对我也不方便。
|
7
shapl 2018-03-18 09:37:30 +08:00
最近我网站总是隔一段时间 CPU 和带宽就飙升,
如果爬太快,看访问日志时很容易被发现的。 |
8
xuxueli 2018-03-18 10:36:45 +08:00 via Android
同意!
主动停顿,成熟的爬虫肯定会从 api 层就预留主动停顿的接口的。 停顿有很多好处,它可以缓解目标服务器压力,隐藏爬虫行为,同时也可以对抗服务器限流。 比如这个爬虫库就支持随机主动停顿 :) http://www.xuxueli.com/xxl-crawler/ |
9
iyaozhen 2018-03-18 11:17:16 +08:00 via Android
我觉得更近一步本质上应该是精准的控制并发,100 个线程即使随机暂停也会莫个时刻并发很大,不让加个队列 10 线程稳定输出的好。
还可以加个思考:什么时候爬比较好。 |
10
mornlight 2018-03-18 11:19:12 +08:00 via iPhone
令牌桶了解一下。
|
11
gouchaoer 2018-03-18 11:27:58 +08:00 via Android
停顿是一点,另外你不可以翻页太厉害,翻页后面 sql 是 limit M,N,对 sql 服务器负担大,很多网站后端不知道翻页优化可以用自增 id 和总 id 数反推出一个区间从而使用索引会很快,删除的记录不显示即可
|
12
Levox 2018-03-18 11:47:29 +08:00
确实。另外自私的人会找很多理由来正当化自己的行为。
|
14
Coioidea 2018-03-18 13:44:10 +08:00
不止是你一个人用爬虫。本来,爬虫就不被许多 eula 或者网站主认可的。通过工具化获取信息没有错。但不要太自私
|
15
neoblackcap 2018-03-18 14:01:47 +08:00
@qu3290052 所以这就是他们的教程没有教如何爬 Facebook,淘宝的原因。因为这些网站反爬虫反得他们都没法做
|
16
zachguo 2018-03-18 14:06:07 +08:00 via Android
所爬的内容不是 cc 授权的话,其实是违法的。
国内目前不管,但估计迟早有天会有人被办的。 |
17
safedogcc 2018-03-18 14:06:12 +08:00
赞同贴主的想法!
至于 robots.txt ,我猜部分较大的搜素引擎都不一定会遵循。。 - - - 我现在做的 APP,也是抛弃了服务端爬虫的做法,让用户主动的触发网站爬取的操作(比如用户想看网站,浏览器访问,可能会加载很多如 js css 等资源)而我只需要一次 get 请求主页 html 源码即可) 另外还有缓存的功能,一个小时内用户再次查看此栈点,会有限加载缓存中的列表,没数据了之后再进行 HTTP 请求。 好像自己这么设计,挺善良的。。 哈哈哈 |
18
LINAICAI 2018-03-18 14:10:03 +08:00
使用 Scrapy,默认就遵守 robots.txt 的了吧
自己写的时候都加 sleep 的,不加的话很快就被搬 |
19
exiahan 2018-03-18 14:18:43 +08:00 via Android
赞,特别同意要注意 delay 请求这点。。。贪得无厌最终是全部死光。
|
21
Mavious 2018-03-18 16:15:23 +08:00 via iPhone
爬虫抢刷商品。
我以前睡 0.1 秒。后来发现有问题,刷出来的老是已经被人买走了的空页面(大约 5 秒前已经被买走)。 百思不得其解。只好猜测是太快导致数据没下载全。 于是改成睡 0.4 秒,遇到的问题是略慢,提交购买申请时大概慢了个 1 秒(偶尔出现) 我也很苦恼啊。 快了担心数据下载不全,慢了担心人家已经捷足先登。 我预计至少有 6 个机器人在和我争。我不狂刷就要被别的机器人虐。 无奈啊啊啊啊。那就让服务器多劳苦劳苦啦。 |
22
linde 2018-03-18 22:47:38 +08:00
LoadRunner 中 Pacing 和 Think time 概念。
|
23
sunwei0325 2018-03-19 08:50:07 +08:00
建议看一下 scrapy 母公司的项目- frontera
https://github.com/scrapinghub/frontera |