我们知道,如果要在命令行下面运行一个 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,它下面有两个爬虫exercise和ua。
运行exercise时,爬虫输出如下图所示:
运行ua时,爬虫输出如下图所示:
如果我把运行两个爬虫的代码同时写到main.py里面会怎么样呢?我们试试看:
可以看到,这两个爬虫是串行运行的。首先第一个爬虫运行。直到它里面所有代码全部运行完成了,它结束了以后,第二个爬虫才会开始运行。这显然不是我们需要的。
为了让同一个 Scrapy 项目下面的多个爬虫实现真正的同时运行,我们可以使用 Scrapy 的CrawlerProcess。
它的用法如下:
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代码为:
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()
运行效果如下图所示:
可以看到,两个爬虫真正实现了同时运行。