You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:45:02