我一直在做scrapy治疗3个月。为了提取选择器我使用简单的response.css或response.xpath ..
我被要求切换到ItemLoaders并使用add_xpath add_css等。
我知道物品装载机如何工作以及它们有多方便,但是有人能比较这两种效率吗?哪种方式有效,为什么?
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提供的便利,可帮助您更好地组织您的蜘蛛,避免在您的蜘蛛代码中混合格式规则(例如)。
项目加载器在您不使用它们时执行的操作完全相同。因此,对于每个loader.add_css/add_xpath
调用,将执行responce.css/xpath
。它不会更快,他们所做的少量额外工作也不会让事情变得更慢(特别是与xml解析和网络/ io加载相比)。