python 在Scrapy中,ItemLoader和ItemAdapter之间有什么区别?

vhmi4jdf  于 2023-08-02  发布在  Python
关注(0)|答案(1)|浏览(124)

我知道在scrapy中我们可以定义自定义项目,或者只是返回简单的Python命令。我Scrapy documentation有一个特定的页面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}")

字符串
为什么他们不使用项目加载器并声明一个处理器来清理或重写序列化器方法来清理价格?
我只是不明白项目加载器和项目适配器之间的区别。我似乎也找不到任何一个好的文档或任何博客文章或stackoverflow问题来描述两者之间的关系。

a0x5cqrl

a0x5cqrl1#

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

  • 项加载器为您提供了一个API,用于(几乎/某种程度上)声明如何从响应中提取实体的属性。所以,它们本质上是你的实体的构建者。这样可以提高代码的可读性,并有一些帮助器来提取数据。
  • 项目适配器为您提供了一个API,用于以标准化的方式访问容器对象中的数据,无论是使用项目类、数据类,还是仅使用字典,您都可以使用适配器以单一的、类似于dict的方式访问对象中的数据。他们更像是** Package 。一个常见的情况是,您有一个代码库,它解析对不同类型对象的响应,但您不想在项管道中处理这些类型。因此,您使用适配器,项目管道可以忽略从蜘蛛返回的对象类型。

不幸的是,关于这两个方面的文档并不多(我猜你可以找到更多关于加载器的信息,但是idk)。但是,它们是独立的组件,因为它们处理不同的问题,您可能希望使用它们两者,一个或两个都不使用。
希望这对你有帮助:)

相关问题