使用scrapy进行CPU密集型解析

时间:2014-02-13 03:58:21

标签: python web-scraping screen-scraping scrapy

http://doc.scrapy.org/en/latest/topics/settings.html#concurrent-items处的CONCURRENT_ITEMS部分将其定义为:

  

要处理的最大并发项数(每个响应)   项目处理器中的并行(也称为项目管道)。

这让我很困惑。这是否意味着发送到管道的项目是并行处理的,即。真的是多重过程?

假设我的解析涉及大量的lxml查询和xpath'ing。我应该在spider的parse方法本身中执行它们,还是应该在其中发送包含整个响应的Item,并让自定义管道类通过解析响应主体来填充Item的字段?

2 个答案:

答案 0 :(得分:4)

CONCURRENT_ITEMS设置是指在处理蜘蛛输出中的项目时限制并发活动。通过并发活动,我的意思是什么扭曲(Scrapy使用的底层框架)将同时执行 - 通常是网络请求之类的东西。

Scrapy不使用多线程,也不会使用多个核心。如果您的蜘蛛是CPU绑定的,通常的加速方法是使用多个单独的scrapy进程,避免使用python GIL的任何瓶颈。

答案 1 :(得分:3)

请求系统也可以并行工作,请参阅http://doc.scrapy.org/en/latest/topics/settings.html#concurrent-requests。 Scrapy旨在处理蜘蛛本身的请求和解析,回调方法使其异步,默认情况下,多个请求确实并行工作。

并行处理的项目管道并不打算进行大量解析:而是用于检查和验证每个项目中的值。 (http://doc.scrapy.org/en/latest/topics/item-pipeline.html

因此,您应该在蜘蛛本身中进行查询,因为它们被设计为存在。来自蜘蛛的文档:

  

蜘蛛是定义如何抓取特定网站(或网站组)的类,包括如何执行抓取(即跟随链接)以及如何从其网页中提取结构化数据(即抓取项目)。