gpt4 book ai didi

python - scrapy:中间件/管道单例

转载 作者:太空狗 更新时间:2023-10-29 21:30:31 24 4
gpt4 key购买 nike

我正在创建一个本地响应缓存,我正在为其创建一个 Pipeline,因为我需要根据从站点收集的 ID 来存储项目的信息。

现在我还需要创建一个 Downloader Middleware,因为根据我之前存储的 ID,我不想用新的 Request 访问该站点,所以我在将 Request 发送到服务器之前拦截它,检查该 ID 是否已存在于我的缓存中,如果存在,则只从我的缓存中返回相同的项目。

现在你看到 PipelineMiddleware 需要一起工作,所以分离看起来不是很干净(我也有我想要的变量独特的),但是当我在各自的设置上进行设置时:

DOWNLOADER_MIDDLEWARES = {
'myproject.urlcache.CachePipelineMiddleware': 1,
}

ITEM_PIPELINES = {
'myproject.urlcache.CachePipelineMiddleware': 800,
}

我得到两个不同的实例(检查构造函数上的日志消息,所以它被创建了两次)。

如何确保只创建一个实例并且不会与项目的PipelineDownloader Middleware 功能发生冲突?

最佳答案

我刚刚意识到这是一个简单的 Singleton 问题,而 scrapy 实际上可以为管道和中间件使用相同的实例。

我首先创建这个 Singleton 类:

class Singleton(type):
_instances = {}

def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]

然后,在管道/中间件的类上,我添加了以下内容:

class CachePipelineMiddleware(object):

__metaclass__ = Singleton

def process_item(self, item, spider):
# it works as a Pipeline

def process_request(self, request, spider):
# it works as a Middleware

关于python - scrapy:中间件/管道单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48066352/

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