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