iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

2

目前為止我們都是用 scrapy crawl <spider-name> 指令來啟動爬蟲,但有時候可能需要在程式中來啟動爬蟲(例如提供一個 API 接口,外部發請求來告知要啟動哪一支爬蟲,由程式來啟動對應的爬蟲),今天會介紹幾種啟動爬蟲的方式。

用 Python 執行 Scrapy 指令

Python 有提供內建的 subprocess 模組,可以在程式中開啟一個新的程序(process)來執行其他程式。我們可以利用這個模組來執行 scrapy crawl 指令。

import subprocess

subprocess.run('scrapy crawl ithome')

https://ithelp.ithome.com.tw/upload/images/20191017/20107875cPn9B5OKsZ.png

因為每次執行 scrapy crawl 都會產生一個新的 Scrapy Engine 實體,如果用這個方式啟動多個爬蟲會非常吃資源,所以其實不建議使用 (那幹嘛講)

CrawlerProcess

我們可以利用 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()

https://ithelp.ithome.com.tw/upload/images/20191017/20107875WaIspGHWFG.png

CrawlerRunner

如果原本的程式中已經有使用 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()

參考資料


上一篇
【Day 29】在 Scrapy 中處理請求和回應 - Downloader Middlewares
下一篇
【Day 31】在 Scrapy 中操作瀏覽器
系列文
爬蟲在手、資料我有 - 30 天 Scrapy 爬蟲實戰33

尚未有邦友留言

立即登入留言