从前面一个爬虫帖想到的

2018-03-18 08:04:33 +08:00
 CitizenR

那个爬虫贴在这里:默默的撸了套爬虫...

很多人的关注点在那几个简单粗暴的循环上,虽然的确是略粗暴了点,但对于爬虫来说,这不是重点,重点是:

每个请求之间没有合理的时间停顿

这对于被爬取的服务器才真的是粗暴。

也许有人会说,获取网页后的处理过程(此处甚至包含数据库操作)就是一个给服务器喘息的过程;也许还有人会说每秒几个几十个的请求对于服务器来说小 CASE 不然网站还是关停算了。

暂且不论服务器是否能承受的问题,我想有些人学爬虫根本不知道robots.txt,也没想过这是在免费获取他人网站的信息不应该给他人服务器施加太大压力,他们只想快速获取自己想要的内容。一个热门网站(微博为例),如果爬取的人很多,并且都不停顿甚至加多线程,对于服务器的压力可想而知。

当初学爬虫的时候,作者在书中第一个例子里就加了sleep,并且反复强调这很重要。我也想如此强调,这很重要。

在写不加停顿 /多线程的爬虫时,我们是否应该思考如下问题:

  1. 我爬取的信息有必要这么快获取吗,慢一点是不是也可以?
  2. 我想爬取的信息如果有一定的即时性,官方是否有相应 API ?

一点小小的想法,如果能给大家一点小小的启发,非常荣幸。也欢迎大家讨论自己的爬虫习惯。

4837 次点击
所在节点    Python
23 条回复
qu3290052
2018-03-18 08:28:46 +08:00
人是自私的,我只会想着最快时间爬完
qu3290052
2018-03-18 08:30:12 +08:00
例如你做一个网站最新内容抓取,肯定考虑及时性,所以我会把 get 间隔越小越好
Hydjan
2018-03-18 08:37:50 +08:00
学习了
chuanqirenwu
2018-03-18 08:46:42 +08:00
研究表明,人类访问网站的时间间隔分布服从幂律分布且具有爆发( burst )的特性。
mengzx
2018-03-18 09:22:22 +08:00
感觉一般都会停顿吧,否则大家都不好过
whwq2012
2018-03-18 09:25:34 +08:00
我会停顿,我的潜意识告诉我,爬得太频繁,把网站弄崩了,抛出异常对我也不方便。
shapl
2018-03-18 09:37:30 +08:00
最近我网站总是隔一段时间 CPU 和带宽就飙升,
如果爬太快,看访问日志时很容易被发现的。
xuxueli
2018-03-18 10:36:45 +08:00
同意!
主动停顿,成熟的爬虫肯定会从 api 层就预留主动停顿的接口的。
停顿有很多好处,它可以缓解目标服务器压力,隐藏爬虫行为,同时也可以对抗服务器限流。

比如这个爬虫库就支持随机主动停顿 :)

http://www.xuxueli.com/xxl-crawler/
iyaozhen
2018-03-18 11:17:16 +08:00
我觉得更近一步本质上应该是精准的控制并发,100 个线程即使随机暂停也会莫个时刻并发很大,不让加个队列 10 线程稳定输出的好。

还可以加个思考:什么时候爬比较好。
mornlight
2018-03-18 11:19:12 +08:00
令牌桶了解一下。
gouchaoer
2018-03-18 11:27:58 +08:00
停顿是一点,另外你不可以翻页太厉害,翻页后面 sql 是 limit M,N,对 sql 服务器负担大,很多网站后端不知道翻页优化可以用自增 id 和总 id 数反推出一个区间从而使用索引会很快,删除的记录不显示即可
Levox
2018-03-18 11:47:29 +08:00
确实。另外自私的人会找很多理由来正当化自己的行为。
hyi
2018-03-18 12:48:13 +08:00
@gouchaoer 翻页太厉害的意识是翻太多页了吗,那进行翻 10 几页页的话,是不是也需要停顿下
Coioidea
2018-03-18 13:44:10 +08:00
不止是你一个人用爬虫。本来,爬虫就不被许多 eula 或者网站主认可的。通过工具化获取信息没有错。但不要太自私
neoblackcap
2018-03-18 14:01:47 +08:00
@qu3290052 所以这就是他们的教程没有教如何爬 Facebook,淘宝的原因。因为这些网站反爬虫反得他们都没法做
zachguo
2018-03-18 14:06:07 +08:00
所爬的内容不是 cc 授权的话,其实是违法的。
国内目前不管,但估计迟早有天会有人被办的。
safedogcc
2018-03-18 14:06:12 +08:00
赞同贴主的想法!
至于 robots.txt ,我猜部分较大的搜素引擎都不一定会遵循。。

- - -
我现在做的 APP,也是抛弃了服务端爬虫的做法,让用户主动的触发网站爬取的操作(比如用户想看网站,浏览器访问,可能会加载很多如 js css 等资源)而我只需要一次 get 请求主页 html 源码即可)
另外还有缓存的功能,一个小时内用户再次查看此栈点,会有限加载缓存中的列表,没数据了之后再进行 HTTP 请求。

好像自己这么设计,挺善良的。。 哈哈哈
LINAICAI
2018-03-18 14:10:03 +08:00
使用 Scrapy,默认就遵守 robots.txt 的了吧
自己写的时候都加 sleep 的,不加的话很快就被搬
exiahan
2018-03-18 14:18:43 +08:00
赞,特别同意要注意 delay 请求这点。。。贪得无厌最终是全部死光。
zdnyp
2018-03-18 14:39:39 +08:00
@whwq2012 我也是,一般请求间隔都会间隔,就怕被 ban,还一个就是队列的问题,采的再快,你也得处理、存储啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/439038

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX