Scrapy 運行多個爬蟲


本文所使用的 Scrapy 版本:Scrapy==1.8.0

一個 Scrapy 項目下可能會有多個爬蟲,本文陳述兩種情況:

  1. 多個爬蟲
  2. 所有爬蟲

顯然,這兩種情況並不一定是等同的。假設當前項目下有 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM