我目前正在构建一个Scrapy脚本,该脚本使用以下设置执行广泛爬网:
'CONCURRENT_REQUESTS': 600,
'CONCURRENT_REQUESTS_PER_DOMAIN': 25,
'CONCURRENT_ITEMS': 250,
'REACTOR_THREADPOOL_MAXSIZE': 600,
为了执行广泛的爬行,我在我的蜘蛛中循环浏览域列表,如下所示:
def start_requests(self):
for domain in self.domains:
yield scrapy.Request("https://www." + domain['domain'], self.parse, meta={'domain':domain})
该循环运行良好,每秒可拨打10个以上的电话。
然而,我注意到,一旦我发送了要在管道中处理的第一个项目(执行简单的循环和条件检查(,我的整个抓取就会减慢。
问题似乎是start_requests((中的循环等待当前处理的项目完成,然后再继续我对新域的广泛爬网,尽管这远远低于我的"CONCURRENT_requests"限制。
结果是一个运行速度慢2到3倍的脚本。
项目处理不是应该不阻止请求吗?
Scrapy使用并发,而不是多线程。
网络输入和输出(发送的请求和接收的响应(不会阻塞代码,但永远不会同时执行代码的两个部分。
Scrapy使用Twisted,如果你不能让你的代码更有效率,你可以用Twisted的方式让你的管道代码在一个单独的线程中运行。