1

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

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

我认为这样做的好处是:

  1. 更少的 CPU 密集型,因为管道不会有任何 CPU 处理
  2. 防止内存泄漏。

磁盘 I/O 比网络 I/O 快很多,所以我认为这不会对蜘蛛产生太大影响。

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

4

2 回答 2

7

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

于 2012-11-20T08:55:22.600 回答
0

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

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

网页抓取的 Scrapy 模型本质上是:

  1. 用蜘蛛收集数据。
  2. 将该数据捆绑到项目中。
  3. 使用项目管道处理这些项目。
  4. 将这些项目存储在另一个项目管道的某个地方。

第 3 步和第 4 步组成了“大”项目管道。如果您不 subclass Item,则无法将对象输入到项目管道中,因此您必须规范化字段并将项目插入到您的数据库中,所有这些都在您的蜘蛛中。

如果你subclass 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()
于 2013-11-05T01:00:23.720 回答