Scrapy本身通过异步架构(基于Twisted)和内置的并发机制来处理多爬虫并发。核心是调整CONCURRENT_REQUESTS等设置,并使用scrapy crawl同时运行多个爬虫进程。
关键配置(settings.py):
# 全局并发请求数(默认16)
CONCURRENT_REQUESTS = 32
# 每个域名的并发限制
CONCURRENT_REQUESTS_PER_DOMAIN = 8
# 每个IP的并发限制(默认0,表示不启用)
CONCURRENT_REQUESTS_PER_IP = 0
# 下载延迟(秒)
DOWNLOAD_DELAY = 0.25
# 自动限速扩展(根据负载动态调整延迟)
AUTOTHROTTLE_ENABLED = True
启动多个爬虫:
# 方案1:终端同时运行(最简单)
scrapy crawl spider1 &
scrapy crawl spider2 &
# 方案2:使用CrawlerProcess(单进程多爬虫)
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
process = CrawlerProcess(get_project_settings())
process.crawl('spider1')
process.crawl('spider2')
process.start()
# 方案3:使用CrawlerRunner(更灵活的控制)
from twisted.internet import reactor
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
configure_logging()
runner = CrawlerRunner()
runner.crawl('spider1')
runner.crawl('spider2')
d = runner.join()
d.addBoth(lambda _: reactor.stop())
reactor.run()
注意事项:
- 共享资源(如数据库连接)需要加锁或使用连接池
- 大量并发时建议配合代理池和用户轮换
- 监控服务器资源,避免过度并发被目标封禁
总结:调参+异步架构是Scrapy并发的核心。