7

herehereから読み、同じプロセスで実行されている複数のスパイダーを機能させました。

ただし、すべてのスパイダーが終了したときにリアクターを停止するための信号システムを設計する方法がわかりません。

私のコードは、次の例と非常によく似ています。

from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy.settings import Settings
from scrapy import log
from testspiders.spiders.followall import FollowAllSpider

def setup_crawler(domain):
    spider = FollowAllSpider(domain=domain)
    crawler = Crawler(Settings())
    crawler.configure()
    crawler.crawl(spider)
    crawler.start()

for domain in ['scrapinghub.com', 'insophia.com']:
    setup_crawler(domain)
log.start()
reactor.run()

すべてのクローラーが停止した後も、リアクターはまだ稼働しています。ステートメントを追加すると

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

setup_crawler 関数に対して、reactor は最初のクローラーが閉じたときに停止します。

すべてのクローラーが終了したときに原子炉を停止させる方法を教えてくれる人はいますか?

4

2 に答える 2

2

シャクラの答えに加えて、そのルートを取ることはうまくいきます。状態を保持するクロージャーとしてシグナルレシーバーを作成できます。つまり、完了したスパイダーの量を記録します。コードは実行中のスパイダーの数を認識している必要があるため、すべてのスパイダーがいつ実行されたかを確認してから実行するだけで済みますreactor.stop()

例えば

シグナル レシーバーをクローラーにリンクします。

crawler.signals.connect(spider_finished, signal=signals.spider_closed)

シグナル レシーバーを作成します。

def spider_finished_count():
    spider_finished_count.count = 0

    def inc_count(spider, reason):
        spider_finished_count.count += 1
        if spider_finished_count.count == NUMBER_OF_SPIDERS:
            reactor.stop()
    return inc_count
spider_finished = spider_finished_count()

NUMBER_OF_SPIDERS は、このプロセスで実行しているスパイダーの総数です。

または、逆の方法で、実行中のスパイダーの数から 0 までカウントダウンすることもできます。または、より複雑なソリューションには、完了したスパイダーと完了していないスパイダーの口述を保持することが含まれます。

注意: inc_count が送信されspiderreasonこの例では使用しませんが、これらの変数を使用したい場合があります。これらの変数はシグナル ディスパッチャーから送信され、閉じたスパイダーと閉じた理由 (str) です。

Scrapy バージョン: v0.24.5

于 2015-04-01T18:55:16.040 に答える