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

时间:2018-08-09 18:23:24

标签: python redis scrapy

我有一个抓取项目,需要在Redis中存储一些抓取的项目。

我当时正在考虑编写自己的管道类,但后来发现scrapy-redis并决定尝试。

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

通过无效,我的意思是,就我的应用程序而言,该项目应丢弃,而不要处理。

我知道,如果我编写自己的管道类,则可以引发DropItem异常,但是如果我使用RedisPipeline怎么办?

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

  1. 子类RedisPipeline,覆盖process_item,删除无效的 项目,并将有效项目的处理委托给 RedisPipeline.process_item。然后在我的Spiders中使用此子类化的管道。
  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 个答案:

答案 0 :(得分:1)

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

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

在您自己的管道上,只需放置项目即可。检查先前的管道是否具有比RedisPipeline更低的优先级(在我的示例中为299),以便在删除项目时它永远不会到达后续的管道。