Python中如何使用Scrapy框架控制多个Spider并发运行?
有 30 个网址,用一个 scrapy 来做,每个网址写成一个 spider。之后监控一个 redis 队列,从中不断取值,根据不同的值运行相应的 spider。请问这个如何实现?
主要是从 redis 得到值之后如何运行相应的 spider ?或者有好点的方案吗?
Python中如何使用Scrapy框架控制多个Spider并发运行?
4 回复
在Scrapy里控制多个Spider并发运行,核心是使用CrawlerProcess或CrawlerRunner。CrawlerProcess更直接,适合大多数情况。下面是一个完整的示例,演示如何同时运行两个Spider。
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.spiders import Spider
# 定义第一个Spider
class MySpider1(Spider):
name = 'spider1'
start_urls = ['http://example.com/page1']
def parse(self, response):
# 你的解析逻辑
self.logger.info(f'Spider1 parsed {response.url}')
# 定义第二个Spider
class MySpider2(Spider):
name = 'spider2'
start_urls = ['http://example.com/page2']
def parse(self, response):
# 你的解析逻辑
self.logger.info(f'Spider2 parsed {response.url}')
if __name__ == '__main__':
process = CrawlerProcess()
# 将两个Spider添加到进程中
process.crawl(MySpider1)
process.crawl(MySpider2)
# 启动所有Spider,它们会并发运行
process.start()
关键点:
CrawlerProcess会为你管理Twisted reactor,调用start()后,所有通过crawl()添加的Spider会并发执行。- 每个Spider的请求会共享全局的并发设置(如
CONCURRENT_REQUESTS),你可以在项目设置或CrawlerProcess实例化时配置。 - 如果想更精细地控制(例如,每个Spider使用独立的设置或控制启动顺序),可以使用
CrawlerRunner配合reactor,但代码会更复杂一些。
总结:用CrawlerProcess的crawl方法添加多个Spider,然后调用start即可。
加群 t.me/datapy 问,代码在电脑上,明天记得的话给你贴上来。不过需要提醒我一下。
Scrapy-redis 其实可以满足需求
马克,目前用的自定义命令,运行全部的 spider

