查看原文
其他

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

IT服务圈儿 2022-09-10

The following article is from 未闻Code Author kingname

IT服务圈儿

有温度、有态度的IT自媒体平台


来源:经公众号:未闻Code(ID:itskingname)授权转载

作者:kingname



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

scrapy crawl xxx

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

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

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

它的用法如下:

from scrapy.crawler import CrawlerProcessfrom 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代码为:

from scrapy.crawler import CrawlerProcessfrom scrapy.utils.project import get_project_settings
settings = get_project_settings()
crawler = CrawlerProcess(settings)
crawler.crawl('exercise')crawler.crawl('ua')
crawler.start()crawler.start()

运行效果如下图所示:

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





*版权声明:转载文章和图片均来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存