Scrapy:简单蜘蛛和具有ItemLoader的蜘蛛之间的区别

问题描述 投票:0回答:2

我一直在做scrapy治疗3个月。为了提取选择器我使用简单的response.css或response.xpath ..

我被要求切换到ItemLoaders并使用add_xpath add_css等。

我知道物品装载机如何工作以及它们有多方便,但是有人能比较这两种效率吗?哪种方式有效,为什么?

python python-3.x scrapy css-selectors
2个回答
0
投票

Item Loaders是一个方便的抽象,允许您在给定的Scrapy项目中的多个蜘蛛之间重用提取代码。

假设您有一个Scrapy项目来从几个电子商务中获取数据。您将拥有多个蜘蛛(每个网站最多一个),但它们将为您正在提取的数据共享相同的模式。假设您的ProductItem类看起来像这样:

class ProductItem(scrapy.Item):
    name = scrapy.Field()
    price = scrapy.Field()
    ...

现在,让我们说在某些网站中,price字段在价格中包含逗号作为分隔符,例如1,459.99。如果你想摆脱那个逗号来标准化该字段的输出,你必须在你的蜘蛛内混合格式化逻辑,这很容易导致一团糟。

如果为ItemLoader类创建ProductItem,则可以为每个字段定义处理器,这样就不必将格式代码添加到蜘蛛中。像这样的东西:

from scrapy.loader import ItemLoader
from scrapy.loader.processors import MapCompose

class ProductItemLoader(ItemLoader):
    default_item_class = ProductItem
    # an input processor for your price field
    price_in = MapCompose(lambda x: x.replace(',', ''))

现在,每当你在你的蜘蛛中使用它时:

loader = ProductItemLoader(response=response)
loader.add_css('price', '#price::text')
...
yield loader.load_item()

price字段的输入处理器将被调用以为您格式化字段。

我建议你阅读documentation on item loaders,以便更好地理解我上面提供的例子。

TL; DR:项目加载器是Scrapy提供的便利,可帮助您更好地组织您的蜘蛛,避免在您的蜘蛛代码中混合格式规则(例如)。


0
投票

项目加载器在您不使用它们时执行的操作完全相同。因此,对于每个loader.add_css/add_xpath调用,将执行responce.css/xpath。它不会更快,他们所做的少量额外工作也不会让事情变得更慢(特别是与xml解析和网络/ io加载相比)。

© www.soinside.com 2019 - 2024. All rights reserved.