Python中如何从爬虫帖联想到相关技术问题

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

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

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

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

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

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

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

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

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

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


Python中如何从爬虫帖联想到相关技术问题

24 回复

人是自私的,我只会想着最快时间爬完


我无法理解你的问题

例如你做一个网站最新内容抓取,肯定考虑及时性,所以我会把 get 间隔越小越好

学习了

研究表明,人类访问网站的时间间隔分布服从幂律分布且具有爆发( burst )的特性。

感觉一般都会停顿吧,否则大家都不好过

我会停顿,我的潜意识告诉我,爬得太频繁,把网站弄崩了,抛出异常对我也不方便。

最近我网站总是隔一段时间 CPU 和带宽就飙升,
如果爬太快,看访问日志时很容易被发现的。

同意!
主动停顿,成熟的爬虫肯定会从 api 层就预留主动停顿的接口的。
停顿有很多好处,它可以缓解目标服务器压力,隐藏爬虫行为,同时也可以对抗服务器限流。

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

http://www.xuxueli.com/xxl-crawler/

我觉得更近一步本质上应该是精准的控制并发,100 个线程即使随机暂停也会莫个时刻并发很大,不让加个队列 10 线程稳定输出的好。

还可以加个思考:什么时候爬比较好。

令牌桶了解一下。

停顿是一点,另外你不可以翻页太厉害,翻页后面 sql 是 limit M,N,对 sql 服务器负担大,很多网站后端不知道翻页优化可以用自增 id 和总 id 数反推出一个区间从而使用索引会很快,删除的记录不显示即可

确实。另外自私的人会找很多理由来正当化自己的行为。

翻页太厉害的意识是翻太多页了吗,那进行翻 10 几页页的话,是不是也需要停顿下

不止是你一个人用爬虫。本来,爬虫就不被许多 eula 或者网站主认可的。通过工具化获取信息没有错。但不要太自私

所以这就是他们的教程没有教如何爬 Facebook,淘宝的原因。因为这些网站反爬虫反得他们都没法做

所爬的内容不是 cc 授权的话,其实是违法的。
国内目前不管,但估计迟早有天会有人被办的。

赞同贴主的想法!
至于 robots.txt ,我猜部分较大的搜素引擎都不一定会遵循。。

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

好像自己这么设计,挺善良的。。 哈哈哈

使用 Scrapy,默认就遵守 robots.txt 的了吧
自己写的时候都加 sleep 的,不加的话很快就被搬

赞,特别同意要注意 delay 请求这点。。。贪得无厌最终是全部死光。

我也是,一般请求间隔都会间隔,就怕被 ban,还一个就是队列的问题,采的再快,你也得处理、存储啊

爬虫抢刷商品。
我以前睡 0.1 秒。后来发现有问题,刷出来的老是已经被人买走了的空页面(大约 5 秒前已经被买走)。
百思不得其解。只好猜测是太快导致数据没下载全。

于是改成睡 0.4 秒,遇到的问题是略慢,提交购买申请时大概慢了个 1 秒(偶尔出现)

我也很苦恼啊。
快了担心数据下载不全,慢了担心人家已经捷足先登。
我预计至少有 6 个机器人在和我争。我不狂刷就要被别的机器人虐。

无奈啊啊啊啊。那就让服务器多劳苦劳苦啦。

LoadRunner 中 Pacing 和 Think time 概念。

建议看一下 scrapy 母公司的项目- frontera
https://github.com/scrapinghub/frontera

回到顶部