Scrapy多爬虫混合并行与顺序链式调度的实现方法咨询
Scrapy多爬虫混合并行/链式调度实现方案
完整启动代码
from scrapy.utils.project import get_project_settings from scrapy.crawler import CrawlerProcess from twisted.internet import defer setting = get_project_settings() process = CrawlerProcess(setting) @defer.inlineCallbacks def run_spider_group(*spider_names): # 并行启动指定爬虫组,组内全部任务执行完成后再返回 crawl_tasks = [] for spider_name in spider_names: crawl_tasks.append(process.crawl(spider_name)) yield defer.gatherResults(crawl_tasks) # 初始并行启动前3个爬虫 d1 = process.crawl('scraper1') d2 = process.crawl('scraper2') d3 = process.crawl('scraper3') # 爬虫2运行结束后,并行启动4、5、6 d2.addCallback(lambda _: run_spider_group('scraper4', 'scraper5', 'scraper6')) # 爬虫3运行结束后,并行启动7、8、9 d3.addCallback(lambda _: run_spider_group('scraper7', 'scraper8', 'scraper9')) # 若存在更多层级的依赖调度,可继续基于Deferred链式绑定,示例: # 等爬虫1和爬虫4组都运行结束后,再启动爬虫10、11 # defer.gatherResults([d1, d2]).addCallback(lambda _: run_spider_group('scraper10', 'scraper11')) process.start()
核心逻辑说明
process.crawl()调用后会返回一个Twisted的Deferred对象,对应爬虫的运行生命周期,爬虫正常结束或异常终止时该对象会触发对应的回调- 初始调用三次
process.crawl()直接实现前三个爬虫并行运行,互不阻塞 - 对爬虫2、3对应的Deferred对象单独绑定回调,触发时调用封装好的组启动函数,即可实现“某前置爬虫跑完后再启动一批并行爬虫”的需求
run_spider_group封装了批量并行启动爬虫的逻辑,会等待组内所有爬虫都运行完成后才结束,适合多爬虫依赖的嵌套场景
注意事项
- 需要根据同一时间运行的最大爬虫数量调整Scrapy配置和下游服务配置:比如调度逻辑中同一时间最多同时运行6个爬虫时,需要对应调整
CONCURRENT_REQUESTS、数据库连接池大小等参数,避免资源瓶颈 - 默认情况某爬虫运行异常会中断后续绑定的回调任务,若需要忽略错误继续执行后续调度,可以给Deferred对象添加
errback处理异常
内容的提问来源于stack exchange,提问作者Stephen Butler
相关产品推荐
相关产品推荐

