我知道在 scrapy 中我们可以定义自定义项目或只返回简单的 Python 字典。 我 Scrapy 文档 有一个针对 Item Loaders 的特定页面,上面写着:
项目加载器提供了一种方便的机制来填充已抓取的项目。尽管可以直接填充项目,但项目加载器通过自动执行一些常见任务(例如在分配原始提取数据之前解析原始提取数据),提供了更方便的 API,用于从抓取过程中填充项目。
另外,在下一节解释 Item Pipelines 时,有一个使用 Item Adapters 来清理价格的示例:
from itemadapter import ItemAdapter
from scrapy.exceptions import DropItem
class PricePipeline:
vat_factor = 1.15
def process_item(self, item, spider):
adapter = ItemAdapter(item)
if adapter.get("price"):
if adapter.get("price_excludes_vat"):
adapter["price"] = adapter["price"] * self.vat_factor
return item
else:
raise DropItem(f"Missing price in {item}")
他们为什么不直接使用 Item Loaders 并声明一个处理器来清理或重写序列化器方法来清理价格?
我只是不明白项目加载器和项目适配器之间的区别。我似乎也找不到适合其中任何一个的好文档,也找不到任何博客文章或 stackoverflow 问题来描述两者之间的关系。
我同意,它们有点令人困惑。但他们有不同的目的:
项目加载器为您提供了一个API,用于(几乎/某种程度上)声明性地说明如何从响应中提取实体的属性。因此,它们本质上是您实体的“构建者”。通过这种方式,您可以提高代码的可读性并拥有一些用于提取数据的助手。
不幸的是,关于它们的文档并不多(我想你可以找到更多关于加载器的信息,但我不知道)。然而,它们是独立的组件,因为它们处理不同的问题,您可能想使用它们两个、一个或都不使用......