Item Loaders 是一种方便的抽象,允许您在给定的 Scrapy 项目中的多个蜘蛛之间重用提取代码。
假设您有一个 Scrapy 项目来从多个电子商务中抓取数据。您将拥有多个蜘蛛(很可能每个网站一个),但它们都将共享相同的架构来提取您提取的数据。假设您的 ProductItem 课程如下所示:
class ProductItem(scrapy.Item):
name = scrapy.Field()
price = scrapy.Field()
...
现在,假设在某些网站中,price 字段在价格中包含逗号作为分隔符,例如 1,459.99。如果你想去掉那个逗号来标准化那个字段的输出,你必须在你的蜘蛛内部混合格式化逻辑,这很容易导致混乱。
如果您为您的ProductItem 类创建ItemLoader,您可以为每个字段定义处理器,这样您就不必将格式化代码添加到您的蜘蛛程序中。像这样的:
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 提供的一种便利,可帮助您更好地组织蜘蛛,避免在蜘蛛代码中混合格式规则(例如)。