scrapy:中间件/管道单实例

2024-09-19 23:43:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

现在,正如您所见,Pipeline和{}都需要一起工作,所以分离看起来不是很干净(我也有两个变量,我希望是唯一的),但是当我在它们各自的设置上设置这两个变量时:

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

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

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

如何确保只创建一个实例,并且不会与项目的Pipeline和{}功能冲突?在


Tags: 项目实例目的服务器信息idpipeline站点
1条回答
网友
1楼 · 发布于 2024-09-19 23:43:47

我刚刚意识到这是一个简单的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]

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

^{pr2}$

相关问题 更多 >