当你可以直接插入Scrapy时,为什么还要烦恼?

时间:2012-11-20 08:38:55

标签: python scrapy

我将使用scrapy来抓取域名。我打算用sqlalchemy将所有信息存储到我的数据库中。这是每页非常简单的xpath选择器,我打算使用HttpCacheMiddleware。

理论上,只要我有来自蜘蛛的数据,我就可以将数据插入到我的数据库中(这需要至少实例化hxs)。这将允许我绕过实例化任何Item子类,这样就不会有任何项目通过我的管道了。

我认为这样做的好处是:

  1. 由于管道没有任何CPU处理,因此CPU密集程度较低
  2. 防止内存泄漏。
  3. 磁盘I / O比网络I / O快很多,所以我认为这不会对蜘蛛产生太大影响。

    我有理由想使用Scrapy的Item类吗?

2 个答案:

答案 0 :(得分:6)

如果您直接插入蜘蛛内,那么您的蜘蛛将会阻塞,直到插入数据。如果您创建一个Item并将其传递给Pipeline,则蜘蛛可以在插入数据时继续爬行。此外,如果多个蜘蛛试图同时插入数据,则可能存在竞争条件。

答案 1 :(得分:1)

这是一个老问题,但我觉得赞成的答案并不正确。

  

我有理由想要使用Scrapy的Item类吗?

网络抓取的Scrapy模型基本上是:

  1. 使用蜘蛛收集数据。
  2. 将这些数据捆绑成项目。
  3. 使用项目管道处理这些项目。
  4. 使用另一个项目管道将这些项目存储在某处。
  5. 步骤3和4包含“大”项目管道。如果您没有子类Item,则无法在项目管道中输入对象,因此您必须规范化字段并将项目全部插入数据库中。

    如果你子类Item,你可以让你的项目处理代码更易于维护:

    from scrapy.item import Item, Field
    from scrapy.contrib.loader import XPathItemLoader
    from scrapy.contrib.loader.processor import MapCompose, Identity
    
    class Product(Item):
        name = Field()
        price = Field()
    
        aisle = Field()
        categories = Field()
    
    class ProductLoader(XPathItemLoader):
        default_item_class = Product
    
        price_in = MapCompose(parse_price)
        categories_out = Identity()