我有一个抓取项目,需要在Redis中存储一些抓取的项目。
我当时正在考虑编写自己的管道类,但后来发现scrapy-redis并决定尝试。
我的问题是:如果刮擦的物品是无效,我该怎么办?
通过无效,我的意思是,就我的应用程序而言,该项目应丢弃,而不要处理。
我知道,如果我编写自己的管道类,则可以引发DropItem
异常,但是如果我使用RedisPipeline
怎么办?
我可以想到两种可能的解决方案:
RedisPipeline
,覆盖process_item
,删除无效的
项目,并将有效项目的处理委托给
RedisPipeline.process_item
。然后在我的Spiders中使用此子类化的管道。我正在考虑以下方面的事情:
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
答案 0 :(得分:1)
您可以为项目设置多个管道,因此可以将ScrapyRedis管道与您编写的用于放置项目的管道一起使用:
ITEM_PIPELINES = {
'my.own.Pipeline': 299,
'scrapy_redis.pipelines.RedisPipeline': 300,
}
在您自己的管道上,只需放置项目即可。检查先前的管道是否具有比RedisPipeline更低的优先级(在我的示例中为299
),以便在删除项目时它永远不会到达后续的管道。