gpt4 book ai didi

python - 如何在 scrapy_redis.pipelines.RedisPipeline 中提高 scrapy.exceptions.DropItem

转载 作者:可可西里 更新时间:2023-11-01 11:15:05 27 4
gpt4 key购买 nike

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

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

我的问题是:抓取的item无效怎么办?

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

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

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

  1. 子类RedisPipeline,重写process_item,丢弃一个无效的项目,并将有效项目的处理委托(delegate)给RedisPipeline.process_item。然后在我的蜘蛛中使用这个子类管道。
  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

最佳答案

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

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

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

关于python - 如何在 scrapy_redis.pipelines.RedisPipeline 中提高 scrapy.exceptions.DropItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51773588/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com