一个Scrapy项目下的多个爬虫如何同时运行?

2020-07-16 14:17:26 浏览数 (1)

我们知道,如果要在命令行下面运行一个 Scrapy 爬虫,一般这样输入命令:

代码语言:javascript复制
scrapy crawl xxx

此时,这个命令行窗口在爬虫结束之前,会一直有数据流动,无法再输入新的命令。如果要运行另一个爬虫,必须另外开一个命令行窗口。

我们也知道,可以通过两条Python 代码,在 Python 里面运行 Scrapy 爬虫:

代码语言:javascript复制
from scrapy.cmdline import execute

execute('scrapy crawl xxx'.split())

假设我们把这两行代码放在一个Scrapy 项目根目录下名为 main.py 的文件里面。当我们运行这个文件python3 main.py,Scrapy 爬虫也能正常启动。

但如果我们要运行同一个项目下面的两个爬虫,也需要开两个命令窗口。

那么,有没有什么办法,在一个命令窗口里面,同时运行同一个 Scrapy 项目下面的多个爬虫呢?

假设我们有一个 Scrapy 项目叫做test_multple_crawler,它下面有两个爬虫exerciseua

运行exercise时,爬虫输出如下图所示:

运行ua时,爬虫输出如下图所示:

如果我把运行两个爬虫的代码同时写到main.py里面会怎么样呢?我们试试看:

可以看到,这两个爬虫是串行运行的。首先第一个爬虫运行。直到它里面所有代码全部运行完成了,它结束了以后,第二个爬虫才会开始运行。这显然不是我们需要的。

为了让同一个 Scrapy 项目下面的多个爬虫实现真正的同时运行,我们可以使用 Scrapy 的CrawlerProcess

它的用法如下:

代码语言:javascript复制
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

settings = get_project_settings()

crawler = CrawlerProcess(settings)
crawler.crawl('爬虫名1')
crawler.crawl('爬虫名2')
crawler.crawl('爬虫名3')
crawler.start()

使用这种方法,可以在同一个进程里面跑多个爬虫。

回到我们的例子中,修改 main.py代码为:

代码语言:javascript复制
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

settings = get_project_settings()

crawler = CrawlerProcess(settings)

crawler.crawl('exercise')
crawler.crawl('ua')

crawler.start()
crawler.start()

运行效果如下图所示:

可以看到,两个爬虫真正实现了同时运行。

0 人点赞