项目加载程序提供了一种方便的机制来填充已删除的项目。尽管可以使用他们自己的类字典API来填充项目,但是项目加载器通过自动执行一些常见任务(例如在分配原始提取数据之前解析原始提取数据),提供了一种更方便的API,用于从抓取过程中填充它们。

换句话说,Items提供了抓取数据的容器,而Item Loaders提供了填充该容器的机制。

项目加载器旨在提供灵活,高效和简单的机制,用于通过蜘蛛或源格式(HTML,XML等)扩展和覆盖不同的字段解析规则,而不会成为维护的噩梦。

使用项目加载器填充项目

要使用Item Loader,必须先实例化它。您可以使用类似dict的对象(例如Item或dict)实例化它,也可以不使用一个,在这种情况下,Item使用ItemLoader.default_item_class 属性中指定的Item类在Item Loader构造函数中自动实例化。

然后,您开始将值集合到Item Loader中,通常使用 Selectors。您可以向同一项目字段添加多个值; Item Loader将知道如何使用适当的处理函数“加入”这些值。

下面是Spider中典型的Item Loader用法,使用Items章节中声明的Product

from scrapy.loader import ItemLoader
from myproject.items import Product

def parse(self, response):
    l = ItemLoader(item=Product(), response=response)
    l.add_xpath('name', '//div[@class="product_name"]')
    l.add_xpath('name', '//div[@class="product_title"]')
    l.add_xpath('price', '//p[@id="price"]')
    l.add_css('stock', 'p#stock]')
    l.add_value('last_updated', 'today') # you can also use literal values
    return l.load_item()

通过快速查看该代码,我们可以看到该name字段是从页面中的两个不同XPath位置提取的:

  1. //div[@class="product_name"]
  2. //div[@class="product_title"]

换句话说,通过使用该add_xpath()方法从两个XPath位置提取数据来收集数据。这是稍后将分配给该name字段的数据。

之后,类似的调用用于pricestock字段(后者使用CSS选择器和add_css()方法),最后使用不同的方法last_update直接用字面值(today)填充字段:add_value()

最后,收集到的所有数据时,该ItemLoader.load_item()方法被调用,实际上返回填充了先前提取并与收集到的数据的项目add_xpath(), add_css()add_value()调用。