代码之家  ›  专栏  ›  技术社区  ›  jackdbd

如何在scrapy-redis.pipelines.RedisPipeline中引发scrapy.exceptions.DropItem

  •  0
  • jackdbd  · 技术社区  · 6 年前

    我有一个零碎的项目,我需要在Redis中存储一些零碎的东西。

    我想写我自己的管道类,但后来我发现 scrapy-redis 决定试试看。

    我的问题是:如果刮掉的东西是 无效的 ?

    无效的 ,我的意思是,就我的申请而言,这个项目应该被丢弃而不是处理。

    我知道如果我自己写管道类,我可以 DropItem 例外,但是如果我使用 RedisPipeline ?

    我可以想出两种可能的解决方案:

    1. 子类 再贴现 ,重写 process_item ,删除无效的 ,并将有效项的处理委托给 RedisPipeline.process_item . 然后在我的spider中使用这个子类管道。
    2. 定义另一个负责删除无效项的管道类,并赋予此管道更高的优先级。

    我在想一些事情:

    class DropItemPipeline(object):
    
    def process_item(self, item, spider):
        if not item["is_valid"]:
            raise DropItem
        else:
            return item
    

    另见: How can I use different pipelines for different spiders in a single Scrapy project

    1 回复  |  直到 6 年前
        1
  •  1
  •   eLRuLL    6 年前

    您可以为项目设置多个管道,因此可以将ScrapyRedis管道与用于删除项目的管道一起使用:

    ITEM_PIPELINES = {
        'my.own.Pipeline': 299,
        'scrapy_redis.pipelines.RedisPipeline': 300,
    }
    

    在你自己的管道上放下物品。检查以前的管道是否应具有较低的优先级( 299 在我的例子中)比RedisPipeline,所以当项目被删除时,它永远不会到达下面的管道。