scrapy怎样提升抓取速度

弱答一波......
scrapy是异步爬取,(step1)产生待爬取队列、(step2)爬取这些队列是不同步的、(step3)存储爬取下来的item保证这每一步不受限即可保证scrapy的高效率。
由于现在的个人理解没形成系统,先说几个最常见的情况。
一、关于产生待爬队列:1.如果是待爬队列需要通过递归产生,即下一步要爬的网址是通过parse()函数分析上一个页面得出的:如果能保证parse()分析后得出充足的待爬链接,比如通过关注用户爬取用户,每个页面可能产生成百上千个待爬的页面,step1即是不受限的;
2.如果是网址是有规律的,用循环可以瞬间构造出多个待爬取网址的,step1也是不受限的。
二、关于爬取这些队列网址:1.如果网站有限制,然后你在settings中设置了download_delay,那这个就是此步(step2)的限制,如果想方设法不delay,比如用IP代理、换user_agent、换cookie,使每一次请求都被认为是一个新用户,scrapy造成的这大量请求只被认为是大量用户同时访问的,那么网站就不会给你限制了;
2.如果待爬队列产生有障碍,来一个链接,scrapy就能瞬间爬取完,爬取的组建处于等待接受任务的状态,这个速率也就下来了,这时候需要想办法把step1加速。
3.scrapy settings.py中有个并发度(CONCURRENT_REQUESTS)的设置,即同一时刻会发送的请求数,不是指每秒请求数,一般来说, 这个调大了,会性能会成倍增加。
三、middleware及pipelines
这两个部件,最容易写成阻塞型操作,而(超时的)阻塞型操作会让异步变得毫无意义。
常见的阻塞型操作如:
1.cpu计算密集型的操作(由于Python锁的问题,这种操作无法靠新建线程解决);2.time.sleep()函数;3.其实pymongo的各种操作也是阻塞的,但是因为一般的对mongodb的操作耗时极低,比如insert_one(),瓶颈不在此处。但当数据量大之后用update,耗时加大,影响就明显了。insert_one()耗时会一直很低,不必介意。参考链接:Scrapy Pipeline之处理CPU密集型或阻塞型操作 - CSDN博客4.requests的各种函数,如requests.get, requests.post;--------
欢迎各位批评指正,多谢!

■网友
要是没有反爬措施,那就把settings里的下载延迟设置为0,所有并发量都设置地大一点,内存吃不消、带宽占满就用分布式,参考scrapy-redis等。
【scrapy怎样提升抓取速度】 但通常限制速度的是反爬。

■网友
分布式, 好硬件, 好网络


    推荐阅读