在大范围爬网中阻塞新请求的报废项目处理



我目前正在构建一个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的方式让你的管道代码在一个单独的线程中运行。

最新更新