scrapy 2.3 重复使用和扩展项目加载器
随着项目规模的扩大和蜘蛛数量的增加,维护成为一个基本问题,特别是当您必须为每个蜘蛛处理许多不同的解析规则时,有许多异常,但也希望重用公共处理器。
项目加载器旨在减轻解析规则的维护负担,而不会失去灵活性,同时为扩展和重写规则提供了方便的机制。因此,项目加载器支持传统的Python类继承来处理特定spider(或spider组)的差异。
例如,假设某个特定站点用三个破折号(例如 ---Plasma TV---
)你不想最后在最终的产品名称中删除这些破折号。
下面介绍如何通过重用和扩展默认的产品项加载器来删除这些破折号。 (ProductLoader
):
from itemloaders.processors import MapCompose
from myproject.ItemLoaders import ProductLoader
def strip_dashes(x):
return x.strip('-')
class SiteSpecificLoader(ProductLoader):
name_in = MapCompose(strip_dashes, ProductLoader.name_in)
扩展项加载器非常有用的另一种情况是当您有多个源格式时,例如XML和HTML。在XML版本中,您可能希望删除 CDATA
发生。下面是一个如何操作的示例:
from itemloaders.processors import MapCompose
from myproject.ItemLoaders import ProductLoader
from myproject.utils.xml import remove_cdata
class XmlProductLoader(ProductLoader):
name_in = MapCompose(remove_cdata, ProductLoader.name_in)
这就是您通常如何扩展输入处理器的方法。
对于输出处理器,在字段元数据中声明它们更为常见,因为它们通常只依赖于字段,而不依赖于每个特定的站点解析规则(与输入处理器一样)。参见: 声明输入和输出处理器 .
有许多其他可能的方法来扩展、继承和重写项加载器,不同的项加载器层次结构可能更适合不同的项目。Scrapy只提供了这种机制;它不会强制任何特定的装载机集合组织——这取决于您和项目的需要。