gpt4 book ai didi

python - 如何在多个 scrapy 蜘蛛在同一进程中运行时停止 react 堆

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

我已经阅读了 herehere ,并使在同一进程中运行的多个蜘蛛工作。

但是,我不知道如何设计一个信号系统来在所有蜘蛛完成后停止 react 器

我的代码与以下示例非常相似:

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()

爬虫全部停止后,reactor还在运行。如果我添加语句

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

setup_crawler 函数,reactor 在第一个爬虫关闭时停止。

任何人都可以告诉我如何在所有爬虫完成后让 react 堆停止吗?

最佳答案

除了 shackra 的回答,采取那条路线确实有效。您可以将信号接收器创建为保留状态的闭包,这意味着它会记录已完成的蜘蛛数量。您的代码应该知道您正在运行多少个蜘蛛,因此检查所有蜘蛛何时运行然后运行 ​​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

关于python - 如何在多个 scrapy 蜘蛛在同一进程中运行时停止 react 堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18787750/

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