python3 网络爬虫(七)针对scrapy并发请求的一点看法(提速篇)

时间:2024-04-09 16:26:24

环境:python3.4
win7 ,ubuntu
框架:scrapy

本篇文章主要介绍本人在学习scrapy中遇到的一个大问题:并发请求。大家从各类博客也能看到,人家的一个爬虫程序一天能爬取数千万条数据,这是为什么呢,为什么其他人能做到,而我们无法做到,那么今天我们就来探究这其中缘由(这仅仅是我的个人看法,不喜忽喷,欢迎大家一同探讨)

首先抛开反爬不说,那么如果真正需要在单位时间内爬取大量网站,那么对于使用scrapy的人来说,无delay是最好的选择,因为scrapy的并发请求,只有在无delay时才能实现:

python3 网络爬虫(七)针对scrapy并发请求的一点看法(提速篇)

python3 网络爬虫(七)针对scrapy并发请求的一点看法(提速篇)

那么如果delay不为0的时候,又该是如何呢?我们来试试:

python3 网络爬虫(七)针对scrapy并发请求的一点看法(提速篇)
python3 网络爬虫(七)针对scrapy并发请求的一点看法(提速篇)

再对上两张图进行一些解释,将delay设置为3s,意味着在访问一个网址之后要等待3s(3s左右,不能完全说肯定就是3s,还与网速有些关系)才能对下一个网址进行访问,这样一来,刚才我们还能在同一时间访问的网址,现在就需要很多时间去访问。

这就是scrapy的奇妙之处,当你真正需要快速爬取的时候,它能够做到,但是当你需要它模仿人为行为去爬取网站的时候它也能够做到。我们都知道scrapy14.0 默认并发请求数CONCURRENT_REQUESTS=32,而scrapy默认的线程数为10(看网上大神们说10个线程其实都在启动,但是只有一个线程去请求,其他线程都在完成框架内的其他工作,保证scrapy的正常运行,所以在此就是提一下线程),单位时间请求的数量依赖于电脑吞吐量,也就是说电脑性能越好,单位时间请求的数量就可以设置得越大,有些人甚至将这个数值设置为100都没问题,我的电脑已经老化,目前也仅仅能够实现REQUESTS=16这个量级,但是每秒16个,这意味着一天24小时:24*60*60*16=1382400条,等于说如果在无反爬策略影响和无delay下,一天能爬到百万条数据。

相反,如果delay设置为1s,那么24*60*60*1=86400条,一天拼命爬也最多爬到86400条数据。

从上述实验中,我们发现,对于scrapy,在理想条件下我们设置无delay的行为是最完美的,但是事实上,一个IP如此疯狂地爬取站点的数据肯定不是人为操作,一旦遇到有反爬措施的网站,分分钟禁止你对该网站的访问。但是这依旧不会成为我们的问题,每次请求时更换IP是我们解决反爬问题最好的做法,至于如何更换IP,我以后再进行介绍。

最后,对我的第一篇博文《反爬虫之我见》进行一点小小的纠正,delay并非10s才好(10s可能是我被豆瓣吓坏了- - 才设置了10s),只能说10s真的就像一个人的操作,但是10s对于爬虫来说实在是太慢了,大家其实可以根据网站反爬的程度,将delay设置为1到10s不等,在日常的定时爬取任务中很推荐用delay,因为定时爬取的话每次爬取的数量应该不会很大(因为之前都有爬过),这样既能够防止网站将IP封禁,其次是也降低对目标网站的伤害,过快的爬取速度对站点会造成一定的伤害。

谢谢大家的查看,如果大家对这个知识有不同的看法,希望大家能和我分享,谢谢大家