我有一个零碎的项目,我需要在redis中存储一些零碎的东西。
我想写我自己的管道类,但后来我发现scrapy-redis并决定试试。
我的问题是:如果刮掉的东西是无效的,我该怎么办?
我的意思是说,就我的申请而言,这个项目应该被丢弃而不是处理。
我知道如果我编写自己的pipeline类,我可以引发一个DropItem
异常,但是如果我使用RedisPipeline
,我可以做什么?
我可以想出两种可能的解决方案:
子类RedisPipeline
,重写process_item
,删除无效的
项,并将有效项的处理委托给RedisPipeline.process_item
然后在我的spider中使用这个子类管道。
定义另一个负责删除无效项的管道类,并赋予此管道更高的优先级。
我在想一些事情:
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
最佳答案
您可以为项目设置多个管道,因此可以将scrapyredis管道与用于删除项目的管道一起使用:
ITEM_PIPELINES = {
'my.own.Pipeline': 299,
'scrapy_redis.pipelines.RedisPipeline': 300,
}
在你自己的管道上放下物品。检查前一个管道的优先级是否应该低于redispipeline(在我的示例中为
299
),因此当项目被丢弃时,它永远不会到达下面的管道。