目前為止我們都是用 scrapy crawl <spider-name>
指令來啟動爬蟲,但有時候可能需要在程式中來啟動爬蟲(例如提供一個 API 接口,外部發請求來告知要啟動哪一支爬蟲,由程式來啟動對應的爬蟲),今天會介紹幾種啟動爬蟲的方式。
Python 有提供內建的 subprocess 模組,可以在程式中開啟一個新的程序(process)來執行其他程式。我們可以利用這個模組來執行 scrapy crawl
指令。
import subprocess
subprocess.run('scrapy crawl ithome')
因為每次執行 scrapy crawl
都會產生一個新的 Scrapy Engine 實體,如果用這個方式啟動多個爬蟲會非常吃資源,所以其實不建議使用 (那幹嘛講)。
我們可以利用 scrapy.crawler.CrawlerProcess
這個類別來啟動爬蟲,scrapy crawl
指令其實也是使用這個類別。
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
'''
get_project_settings() 方法會取得爬蟲專案中的 settings.py 檔案設定
啟動爬蟲前要提供這些設定給 Scrapy Engine
'''
process = CrawlerProcess(get_project_settings())
process.crawl('ithome')
process.start()
如果原本的程式中已經有使用 Twisted 來執行一些非同步的任務,官方建議改用 scrapy.crawler.CrawlerRunner
來啟動爬蟲,如此可以跟原本的程式使用同一個 Twisted reactor。
from twisted.internet import reactor
from scrapy.crawler import CrawlerRunner
from scrapy.utils.project import get_project_settings
'''
get_project_settings() 方法會取得爬蟲專案中的 settings.py 檔案設定
啟動爬蟲前要提供這些設定給 Scrapy Engine
'''
runner = CrawlerRunner(get_project_settings())
d = runner.crawl('ithome')
d.addBoth(lambda _: reactor.stop())
reactor.run()