首页 > 解决方案 > 如何在 scrapy_redis.pipelines.RedisPipeline 中提高 scrapy.exceptions.DropItem

问题描述

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

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

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

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

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

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

  1. 子类化RedisPipeline、覆盖process_item、删除无效项,并将有效项的处理委托给 RedisPipeline.process_item. 然后在我的蜘蛛中使用这个子类管道。
  2. 定义另一个负责丢弃无效项的管道类,并赋予此管道更高的优先级。

我在考虑这些方面的事情:

class DropItemPipeline(object):

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

另请参阅:如何在单个 Scrapy 项目中为不同的蜘蛛使用不同的管道

标签: pythonredisscrapy

解决方案


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

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

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


推荐阅读