同時運行多個爬蟲查到的主要有兩種方法。第一種是在項目內創建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。