python - 如何在 scrapy_redis.pipelines.RedisPipeline 中提高 scrapy.exceptions.DropItem
问题描述
我有一个scrapy项目,我需要在Redis中存储一些刮掉的项目。
我正在考虑编写自己的管道类,但后来我发现了scrapy-redis并决定尝试一下。
我的问题是:如果抓取的物品无效,我该怎么办?
无效,我的意思是就我的申请而言,这个项目应该被丢弃而不是处理。
我知道如果我编写自己的管道类,我可以引发DropItem
异常,但是如果我使用 该怎么办RedisPipeline
?
我可以想到两种可能的解决方案:
- 子类化
RedisPipeline
、覆盖process_item
、删除无效项,并将有效项的处理委托给RedisPipeline.process_item
. 然后在我的蜘蛛中使用这个子类管道。 - 定义另一个负责丢弃无效项的管道类,并赋予此管道更高的优先级。
我在考虑这些方面的事情:
class DropItemPipeline(object):
def process_item(self, item, spider):
if not item["is_valid"]:
raise DropItem
else:
return item
解决方案
您可以为您的项目设置多个管道,因此您可以将 ScrapyRedis 管道与您编写的用于删除项目的管道一起使用:
ITEM_PIPELINES = {
'my.own.Pipeline': 299,
'scrapy_redis.pipelines.RedisPipeline': 300,
}
在您自己的管道上,只需放下项目。检查前一个管道的优先级(299
在我的示例中)是否应低于 RedisPipeline,因此当项目被丢弃时,它永远不会到达以下管道。
推荐阅读
- c# - 如何从停止的位置继续对列表进行编号?
- sql-server - 了解气隙网络中的 CREATE CONTRACT
- c# - UWP:ListView:CalendarDatePicker 中的默认视图
- liquibase - 如何在 Liquibase DATABASECHANGELOG 表中生成和存储现有数据库的“初始”状态?
- r - 重新编码数据框中的一组列
- java - 无效的 splitapkbundle。捆绑目标未知语言:[gr]
- java - 当其中一个抛出异常时如何防止执行runnables
- c++ - std::hardware_ destroyer_interference_size 的可靠性
- docker - Docker ADD 不会复制子文件夹的内容
- r - 错误:外部实体错误,getURl 错误