本文所使用的 Scrapy 版本:Scrapy==1.8.0
一個 Scrapy 項目下可能會有多個爬蟲,本文陳述兩種情況:
- 多個爬蟲
- 所有爬蟲
顯然,這兩種情況並不一定是等同的。假設當前項目下有 3 個爬蟲,分別名為:route、dining、experience,並在項目目錄下創建一個 main.py
文件,下面的示例代碼都寫在這個文件中,項目執行時,在命令行下執行 python main.py
或者在 pycharm 中把這個腳本文件設置為執行腳本即可。
1. 運行多個爬蟲
核心點:使用 CrawlerProcess
代碼如下:
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
# 根據項目配置獲取 CrawlerProcess 實例
process = CrawlerProcess(get_project_settings())
# 添加需要執行的爬蟲
process.crawl('route')
process.crawl('dining')
process.crawl('experience')
# 執行
process.start()
2. 運行所有爬蟲
核心點:使用 SpiderLoader
代碼如下:
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from scrapy.spiderloader import SpiderLoader
# 根據項目配置獲取 CrawlerProcess 實例
process = CrawlerProcess(get_project_settings())
# 獲取 spiderloader 對象,以進一步獲取項目下所有爬蟲名稱
spider_loader = SpiderLoader(get_project_settings())
# 添加需要執行的爬蟲
for spidername in spider_loader.list():
process.crawl(spidername)
# 執行
process.start()
3. 關於 ScrapyCommand
網上有部分文章說到使用 ScrapyCommand
這個類下面的 crawler_process.list()
方法可以得到項目下的所有爬蟲名稱,但我在最新的官方文檔中已經搜索不到 ScrapyCommand
這個類,估計是已經棄用了
4. 其它
如果需要向某個爬蟲傳遞參數,可以在 process.crawl
方法中添加進去,例如:
process.crawl('dining', dt='20191119')
則在 dining
這個爬蟲(類)中,可以在 __init__
方法中接收這個 dt
參數。例如:
class Dining(scrapy.Spider):
name = 'dining'
def __init__(self, dt)
self.dt = dt