Python中如何使用Scrapy框架控制多个Spider并发运行?

有 30 个网址,用一个 scrapy 来做,每个网址写成一个 spider。之后监控一个 redis 队列,从中不断取值,根据不同的值运行相应的 spider。请问这个如何实现?
主要是从 redis 得到值之后如何运行相应的 spider ?或者有好点的方案吗?
Python中如何使用Scrapy框架控制多个Spider并发运行?

4 回复

在Scrapy里控制多个Spider并发运行,核心是使用CrawlerProcessCrawlerRunnerCrawlerProcess更直接,适合大多数情况。下面是一个完整的示例,演示如何同时运行两个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()

关键点:

  1. CrawlerProcess会为你管理Twisted reactor,调用start()后,所有通过crawl()添加的Spider会并发执行。
  2. 每个Spider的请求会共享全局的并发设置(如CONCURRENT_REQUESTS),你可以在项目设置或CrawlerProcess实例化时配置。
  3. 如果想更精细地控制(例如,每个Spider使用独立的设置或控制启动顺序),可以使用CrawlerRunner配合reactor,但代码会更复杂一些。

总结:用CrawlerProcesscrawl方法添加多个Spider,然后调用start即可。


加群 t.me/datapy 问,代码在电脑上,明天记得的话给你贴上来。不过需要提醒我一下。

Scrapy-redis 其实可以满足需求

马克,目前用的自定义命令,运行全部的 spider

回到顶部