同时运行多个爬虫查到的主要有两种方法。第一种是在项目内创建command文件夹,添加改写后的crawl.py文件,并在settings.py进行相关配置实现的,该方法相当于创建了一个自定义的指令,启动多个爬虫时,在cmd命令行中执行新创建的指令即可。详细步骤见这里。第二种方法通过scrapy.crawler.CrawlerProcess实现,本人使用的就是这种方法。
官方文档中,scrapy.crawler.CrawlerProcess的介绍是“A class to run multiple scrapy crawlers in a process simultaneously.”,主要用到两个方法,CrawlerProcess.crawl()和CrawlerProcess.start(),crawl方法根据参数启动一个爬虫,start方法启动一个twisted reactor(scrapy是基于twisted事件驱动网络框架的),该方法会阻塞直到所有爬虫执行完毕。代码如下
process = CrawlerProcess(settings=get_project_settings())
for module_path, module_name, ispkg in pkgutil.iter_modules(spiders.__path__, spiders.__name__ + "."):
print('module',module_name)
spider_name = module_name.split('.')[-1]
print(spider_name)
process.crawl(spider_name)
process.start()
这里使用了python内置的pkgutil库,遍历spiders文件夹下所有爬虫并启动,最后执行start方法阻塞在这里。
另外在编写定时代码时,出现第一次运行没有问题,但是第二次会报twisted.internet.error.ReactorNotRestartable错误的情况,解决方法之一见这里,即在不同的进程中启动reactor。