我需要在scrapyd上运行的爬虫/蜘蛛之间共享一个公共对象实例。
最好的方案是将对象的方法挂钩到每个蜘蛛的信号上,比如
ext = CommonObject()
crawler.signals.connect( ext.onSpiderOpen, signal = signals.spider_opened )
crawler.signals.connect( ext.onSpiderClose, signal = signals.spider_closed )
etc..
其中 CommonObject 将被实例化并初始化仅一次并将其方法暴露给所有正在运行的爬网进程/蜘蛛(我不介意为此目的使用单例) )。
根据我的研究,我知道我有两种选择:
- 在一个 CrawlerProcess 中运行所有蜘蛛/爬虫,其中 CommonObject 也将被实例化。
- 每个 CrawlerProcess 运行一个spider / crawler(默认scrapy(d)行为),在反应堆中的某个地方实例化 CommonObject 并使用 twisted远程访问它.spread.pb
醇>
问题:
- 使用第一个选项而不是让scrapyd管理进程(这是第二个选项)是否有任何CPU使用率惩罚(CPU使用效率较低)? CrawlerProcess 是否能够并行运行更多抓取工具 (不是按顺序)?如何在同一 CrawlerProcess 中的运行时间内安排更多蜘蛛? (我理解 CrawlerProcess.start()正在阻止。)
- 我不够先进,无法实施第二个选项(实际上不确定它是否可行)。是否有人会抽取样本实施?
- 也许我错过了什么,还有另一种方法可以做到这一点吗?
醇>