Scrapy 在同一工艺中运行多个蜘蛛后,如何停止反应器上的刮擦?

Scrapy 在同一工艺中运行多个蜘蛛后,如何停止反应器上的刮擦?,scrapy,scrapy-spider,Scrapy,Scrapy Spider,我有几个不同的蜘蛛,想同时运行它们。基于和,我可以在同一进程中运行多个spider。然而,我不知道如何设计一个信号系统,在所有蜘蛛完成后停止反应堆 我试过: crawler.signals.connect(reactor.stop, signal=signals.spider_closed) 及 在这两种情况下,当第一个爬虫关闭时,反应器停止。 当然,我希望在所有蜘蛛完成后反应堆停止 有人能教我怎么做吗?睡了一夜之后,我意识到我知道怎么做了。我只需要一个柜台: from twisted.int

我有几个不同的蜘蛛,想同时运行它们。基于和,我可以在同一进程中运行多个spider。然而,我不知道如何设计一个信号系统,在所有蜘蛛完成后停止反应堆

我试过:

crawler.signals.connect(reactor.stop, signal=signals.spider_closed)

在这两种情况下,当第一个爬虫关闭时,反应器停止。 当然,我希望在所有蜘蛛完成后反应堆停止


有人能教我怎么做吗?

睡了一夜之后,我意识到我知道怎么做了。我只需要一个柜台:

from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy import log, signals
from scrapy.utils.project import get_project_settings

class ReactorControl:

    def __init__(self):
        self.crawlers_running = 0

    def add_crawler(self):
        self.crawlers_running += 1

    def remove_crawler(self):
        self.crawlers_running -= 1
        if self.crawlers_running == 0 :
            reactor.stop()

def setup_crawler(spider_name):
    crawler = Crawler(settings)
    crawler.configure()
    crawler.signals.connect(reactor_control.remove_crawler, signal=signals.spider_closed)
    spider = crawler.spiders.create(spider_name)
    crawler.crawl(spider)
    reactor_control.add_crawler()
    crawler.start()

reactor_control = ReactorControl()
log.start()
settings = get_project_settings()
crawler = Crawler(settings)

for spider_name in crawler.spiders.list():
    setup_crawler(spider_name)

reactor.run()
我假设Scrapy不是平行的

我不知道这是否是最好的方法,但它是有效的


编辑:已更新。请参阅@Jean-Robert comment.

为什么不使用
scrapyd
。我想说,在我的例子中,使用
scrapyd
就是“用炮弹杀死蚂蚁”。我只需要把一群蜘蛛放在一起
scrapyd
做的远不止这些
scrapyd
添加了一层我不需要的软件。很好的解决方案!不过有一件事:由于scrapy的异步行为,在将爬虫添加到
ReactorControl
之前,可能会触发
spider_closed
信号(可能是在过程的早期出现异常),在这种情况下,计数是错误的。可能将
add\u crawler
向上移动一行就可以了。但这是一个极端的情况…如果我启动3个蜘蛛,它们如何在相同的过程中继续?他们分享什么?只是猜测。。。你可以把每个蜘蛛看作一个独立的函数,任何蜘蛛都会干涉其他两个蜘蛛。同样,我假设Scrapy作为一个线程运行。因此,任何时候都只有一个进程和一个线程。(但我可能完全错了。)我在使用JOBDIR时不能正常工作,因为爬行器资源没有正确释放。
from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy import log, signals
from scrapy.utils.project import get_project_settings

class ReactorControl:

    def __init__(self):
        self.crawlers_running = 0

    def add_crawler(self):
        self.crawlers_running += 1

    def remove_crawler(self):
        self.crawlers_running -= 1
        if self.crawlers_running == 0 :
            reactor.stop()

def setup_crawler(spider_name):
    crawler = Crawler(settings)
    crawler.configure()
    crawler.signals.connect(reactor_control.remove_crawler, signal=signals.spider_closed)
    spider = crawler.spiders.create(spider_name)
    crawler.crawl(spider)
    reactor_control.add_crawler()
    crawler.start()

reactor_control = ReactorControl()
log.start()
settings = get_project_settings()
crawler = Crawler(settings)

for spider_name in crawler.spiders.list():
    setup_crawler(spider_name)

reactor.run()