Scrapy当你可以直接插入的时候为什么要麻烦物品呢?

smdncfj3  于 2023-05-22  发布在  其他
关注(0)|答案(3)|浏览(190)

我将使用scrapy抓取域。我计划用sqlalchemy把所有的信息存储到我的数据库中。每个页面的xpath选择器非常简单,我计划使用HttpCacheMiddleware。
从理论上讲,只要我有来自spider的数据,我就可以将数据插入到我的db中(这至少需要示例化hxs)。这将允许我绕过示例化任何项目子类,所以不会有任何项目通过我的管道。
我认为这样做的好处是:

  1. CPU密集度更低,因为管道不需要任何CPU处理
    1.防止内存泄漏。
    磁盘I/O比网络I/O快得多,所以我不认为这会对蜘蛛造成很大影响。
    我为什么要使用Scrapy的Item类?
e5nszbig

e5nszbig1#

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

jv4diomz

jv4diomz2#

这是一个老问题了,但我觉得投票结果不太正确。
我为什么要使用Scrapy的Item类?
Web抓取的Scrapy模型本质上是:
1.用spider收集数据
1.将数据绑定到项中。
1.使用项管道处理这些项。
1.用另一个项目管道将这些项目存储在某个地方。
步骤3和4包括“大”项流水线。如果你没有子类化Item,你就不能在条目管道中输入一个对象,所以你必须规范化字段并将条目插入到你的数据库中,所有这些都在你的蜘蛛中完成。
如果你 do 子类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()
c90pui9n

c90pui9n3#

好吧,如果你在同一个项目中有多个蜘蛛,如果你想/需要更改项目,拥有一个项目可以更容易地管理它。假设你想添加项目,并已声明项目,你可以在一个地方做所有。否则,您将需要在项目中的每个蜘蛛中执行此操作。但对于较小的项目来说,显然不是这样。

相关问题