Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在scrapy_redis.pipelines.RedisPipeline中引发scrapy.exceptions.DropItem_Python_Redis_Scrapy - Fatal编程技术网

Python 如何在scrapy_redis.pipelines.RedisPipeline中引发scrapy.exceptions.DropItem

Python 如何在scrapy_redis.pipelines.RedisPipeline中引发scrapy.exceptions.DropItem,python,redis,scrapy,Python,Redis,Scrapy,我有一个scrapy项目,我需要在Redis中存储一些刮下来的项目 我曾考虑编写自己的管道类,但后来我发现并决定尝试它 我的问题是:如果刮掉的物品无效,我该怎么办 无效,我的意思是,就我的申请而言,这个项目应该被丢弃,而不是被处理 我知道如果我编写自己的管道类,我可以引发一个DropItem异常,但是如果我使用RedisPipeline,我能做什么呢 我可以想出两种可能的解决办法: 子类RedisPipeline,重写process\u项,删除无效的 项,并将有效项的处理委托给 RedisPip

我有一个scrapy项目,我需要在Redis中存储一些刮下来的项目

我曾考虑编写自己的管道类,但后来我发现并决定尝试它

我的问题是:如果刮掉的物品无效,我该怎么办

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

我知道如果我编写自己的管道类,我可以引发一个
DropItem
异常,但是如果我使用
RedisPipeline
,我能做什么呢

我可以想出两种可能的解决办法:

  • 子类
    RedisPipeline
    ,重写
    process\u项
    ,删除无效的 项,并将有效项的处理委托给
    RedisPipeline.process\u项目
    。然后在我的spider中使用这个子类管道
  • 定义另一个负责删除无效项的管道类,并赋予此管道更高的优先级
  • 我当时在想这样的事情:

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

    另请参见:

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

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

    在您自己的管道上,只需放下这些项目。检查前一个管道的优先级(在我的示例中为
    299
    )是否低于RedisPipeline,这样当项目被丢弃时,它就不会到达以下管道。

    您可以有多个管道。