【问题标题】:Scrapy: Difference between simple spider and the one with ItemLoaderScrapy:简单蜘蛛和带有 ItemLoader 的蜘蛛之间的区别
【发布时间】:2018-09-15 00:17:46
【问题描述】:

我已经在 scrapy 上工作了 3 个月。为了提取选择器,我使用简单的 response.css 或 response.xpath..

我被要求切换到 ItemLoaders 并使用 add_xpath add_css 等。

我知道 ItemLoader 是如何工作的,而且它们很方便,但是谁能比较这两个 w.r.t 的效率?哪种方式有效,为什么??

【问题讨论】:

    标签: python python-3.x scrapy css-selectors


    【解决方案1】:

    Item Loaders 是一种方便的抽象,允许您在给定的 Scrapy 项目中的多个蜘蛛之间重用提取代码。

    假设您有一个 Scrapy 项目来从多个电子商务中抓取数据。您将拥有多个蜘蛛(很可能每个网站一个),但它们都将共享相同的架构来提取您提取的数据。假设您的 ProductItem 课程如下所示:

    class ProductItem(scrapy.Item):
        name = scrapy.Field()
        price = scrapy.Field()
        ...
    

    现在,假设在某些网站中,price 字段在价格中包含逗号作为分隔符,例如 1,459.99。如果你想去掉那个逗号来标准化那个字段的输出,你必须在你的蜘蛛内部混合格式化逻辑,这很容易导致混乱。

    如果您为您的ProductItem 类创建ItemLoader,您可以为每个字段定义处理器,这样您就不必将格式化代码添加到您的蜘蛛程序中。像这样的:

    from scrapy.loader import ItemLoader
    from scrapy.loader.processors import MapCompose
    
    class ProductItemLoader(ItemLoader):
        default_item_class = ProductItem
        # an input processor for your price field
        price_in = MapCompose(lambda x: x.replace(',', ''))
    

    现在,每当您在蜘蛛中使用它时:

    loader = ProductItemLoader(response=response)
    loader.add_css('price', '#price::text')
    ...
    yield loader.load_item()
    

    price 字段的输入处理器将被调用来为您格式化该字段。

    我建议您阅读documentation on item loaders 以更好地理解我上面提供的示例。

    TL;DR:项目加载器是 Scrapy 提供的一种便利,可帮助您更好地组织蜘蛛,避免在蜘蛛代码中混合格式规则(例如)。

    【讨论】:

      【解决方案2】:

      物品加载器在下面做的事情与你不使用它们时做的事情完全相同。因此,对于每个loader.add_css/add_xpath 调用,都会执行responce.css/xpath。它不会更快,而且他们所做的少量额外工作不会让事情变得更慢(尤其是与 xml 解析和网络/io 加载相比)。

      【讨论】:

      • 所以当我使用item loader时我的spider启动很慢,是正常的还是需要优化代码??花了大约 1 分钟,这有时很烦人。特别是在测试中,因为我必须一次又一次地运行它......
      • 这很奇怪,通常项目加载器无法以任何显着的方式减慢启动速度,可能包括有和没有项目加载器的蜘蛛代码
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多