Scrapy中ItemLoader和ItemAdapter有什么区别?

问题描述 投票:0回答:1

我知道在 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 问题来描述两者之间的关系。

python web-scraping scrapy
1个回答
0
投票

我同意,它们有点令人困惑。但他们有不同的目的:

  • 项目加载器为您提供了一个API,用于(几乎/某种程度上)声明性地说明如何从响应中提取实体的属性。因此,它们本质上是您实体的“构建者”。通过这种方式,您可以提高代码的可读性并拥有一些用于提取数据的助手。

  • Item 适配器为您提供了一个 API,用于以标准化方式访问容器对象中的数据,无论您使用 Item 类、Data 类还是只是字典,您都可以使用适配器以一种类似于字典的方式来访问数据。从对象访问数据。它们更像是“包装纸”。一种常见的情况是,您有一个代码库可以解析对不同类型对象的响应,但您不想在项目管道中处理这些类型。因此,您使用适配器,并且您的项目管道可以忽略从蜘蛛返回的对象类型。
  • 不幸的是,关于它们的文档并不多(我想你可以找到更多关于加载器的信息,但我不知道)。然而,它们是独立的组件,因为它们处理不同的问题,您可能想使用它们两个、一个或都不使用......

  • 希望这有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.