適合本篇閱讀的人:
- 寫過爬蟲的人
- 想監控管理爬蟲的人
本篇架構:
- Pyspider介紹
- Pyspider架構
- 安裝
- WebUI介紹
- Projectdb, Resultdb和Taskdb
- 後語
Pyspider介紹
官方Tutorial:http://docs.pyspider.org/en/latest/
GitHub:https://github.com/binux/pyspider
Pyspider是由一位中國大大Binux所撰寫的,結至為止在github有13195顆星星,是相當高的專案,Pyspider強大地方在於有管理介面,方便監控各個爬蟲,會有這樣設計也是跟作者當初開發情境有關,作者在官方Tutorial表示
Two years ago, I was working on a vertical search engine. We are facing following needs on crawling:
1. collect 100–200 websites, they may on/offline or change their templates at any time …
2. data should be collected in 5min when website updated …
這也道出Pyspider的使用情境,(一)多個網站需要維護、(二)衍生出需要監控的需求,下一章節讓我們深入了解一下Pyspider架構。
Pyspider架構
Pyspider主要分為四個元件,以下截取官方網站Architecture章節內容,要懂Pyspider從這張圖能有個概念。
Scheduler
Scheduler負責從newtask_queue那裡接收新任務(task),決定是新任務還是要重爬的任務,根據token bucket演算法(流量管制),依任務的優先順序餵給Fetcher。以上說的在程式裡都藉由self.crawl
API。
Fetcher
Fetcher負責抓取網頁頁面(html, css…),再把結果寄Processor,Fetcher也支援Data URI,對於JavaScript生成頁面,Pyspider可以藉由Phantomjs跟Splash,這過程的設定也是藉由self.crawl
(Headers, Cookies, Proxy, Etag...等)。
Phantomjs Fetcher
Phantomjs Fetcher就像是proxy. Fetcher會連接Phantomjs,Phantomjs會負責抓取頁面,在回傳給Fetcher,流程如下:
scheduler -> fetcher -> processor
|
phantomjs
|
internet
補充:
PhantomJS 是一個沒有介面的網頁瀏覽器(web browser),提供Javascript API,表示我們可以下Script執行對它做一些事情,click按鈕或是scroll頁面。但是它已經停止維護了,在網路上也看到一些網友提出不穩定、或是顯示不完全等問題,所以後來作者提供另一個解決方案,使用Splash,它是一個輕量的網頁瀏覽器,我個人沒有使用過就不多解釋了,只知道Scrapy的擴充套件也是使用Splash來爬取JavaScript生成頁面,然後需要用Docker進行安裝。
Processor
Processor負責執行你寫的Script,藉由Fetcher抓取後的資訊去解析、萃取你要的資訊, Pyspider預設是使用PyQuery,當然你可以使用自己習慣的套件去解析Html,另外,Processor會捕捉Exception跟log,並傳遞狀態或新任務給Scheduler,和傳遞結果給Result Worker。
Result Worker (optional)
Result Worker會從Processor
那接收結果,這結果會存在resultdb
當中,當然,你也可以改寫成你需要的格式。
補充:
我一開始以為Result.db的資料就是資料存放的地方,不對!應該說不完全對,它的確會把資料儲存在Result.db中供網頁頁面Result Table去顯示,但你自己要存的資料要自己想辦法存進資料庫或是文件,之後在實作篇會有範例可以參考。
WebUI
WebUI是個網頁管理介面,這可能是Pyspider最令人興奮的功能,你可以step by step,如同Pyspider一樣的執行你的script,藉此來開發跟Debug。,功能包山包海:
- Script Editor, Debugger
- Project manager
- Task monitor
- Result viewer, Exporter
安裝
pyspider的安裝步驟其實有點繁雜,有一些相依套件若不先安裝,後續就會噴錯,若過程中有出錯,可以參考我的踩坑篇。
步驟一:安裝Anaconda,建立虛擬環境Python 3.6環境
使用Anaconda來建立虛擬環境,命名為spider(可以自行修改),python版本使用3.6,這裡補充一下,pyspider支援Python 2.{6,7}, 3.{3,4,5,6}。
conda create --name spider python=3.6
安裝完畢後切換到spider環境中。
conda activate spider
步驟二:安裝pycurl
pycurl是一款用戶端的URL傳輸庫(client-side URL transfer library),有點類似之前提到的requests,但是更加快速且強大,他是libcurl的python介面,我們在Linux環境中使用curl的指令也是基於libcurl。我們要使用pyspider框架前,必須手動先安裝。
conda install -c anaconda openssl
conda install pycurl
步驟三:安裝lxml
可以擷取xml跟html的套件
conda install -c anaconda lxml
步驟四:安裝pyspider
終於來到我們的主角,由於conda中沒有pyspider套件,就用pip安裝吧!
pip install pyspider
步驟五:下載設定phantomjs
下載phantomjs,並設定環境變數[your path]\phantomjs-2.1.1-windows\bin
,終端機輸入phantomjs -v
,顯示版本表示成功。
步驟六:啟動pyspider服務
先切換到你要放置專案的資料夾,終端機輸入pyspider
啟動服務
cd [your project path]
pyspider
當你看到這個畫面代表成功囉,有啟動三個東西
- phantomjs fetcher啟動在port 25555,當你要爬取javascript生成網頁時,你就會到他
- xmlrpc server啟動在port 23333,這是負責在scheduler跟webui的通訊,做這在這邊有提到https://segmentfault.com/q/1010000008915759
- webui啟動在port 5000,這就是管理介面,現在打開你的http://localhost:5000就能看到畫面囉!以下就讓我們來看看pyspider強大的管理介面能做什麼事情。
WebUI介紹
Dashboard
由上往下,由左至右做介紹
- 最上方那排,我沒有使用過…,我理解是當使用redis或rabbitmq當作柱列時,上面才會開始有數字顯示。
- Recent Active Tasks顯示目前任務的狀況
- Create建立新的專案
- 下方表格分別設定群組、專案名稱、專案狀態、抓取頻率、平均時間、各時間單位執行的任務數、操作action按鈕,以下就逐一補充吧!
專案狀態:有分好幾類,如果選擇STOP,過24小時候會進行刪除該專案,這也是用介面刪除專案的方式。另外,還有一個狀態回PAUSE,當你的專案Fail 10次(預設),就會進入PAUSE狀態,這時候爬蟲就暫停了,會停一段時間,在繼續運行。
抓取頻率:舉例來說rate/burst為1/3,代表1秒發送一次任務,第一次發3個任務;0.1代表10秒發次任務。
操作action按鈕:Run是執行爬蟲,Active Tasks是該專案的目前狀態,Results是預覽爬取結果,這部分是可以自訂的,可以查看後面Result Worker部分。
Script Editor
此區為撰寫程式(processor)的地方,這裡是編輯區,也是測試區,一切開發從這裡做起,挑值得補充的介紹:
- 綠色框框紀錄目前這個任務的狀況,上圖就是在data:,on_start,表示目前還沒開始爬取網站,當你點下Run就會執行。
- 若是有scheduler有接受到任務,就會出現下方黃色地方顯示,點下白色箭頭就會將此任務發給fetcher抓取資料,在經過你撰寫的程式,呈現在編輯區,右方程式的部分後續會在做介紹。
- 點選web能預覽網站畫面,若在點選enable css selector helper,就能擷取html tag,會以pyquery的語法輸出。
Active Tasks
每一個任務的執行狀況都會顯示在這,Failed表示在Fetch就發生錯誤,Process_error表示Fetch成功但process失敗,點擊網址顯示詳細Log。
Log
由上而下就是Pyspider在執行任務所留下的訊息,當任務錯誤,可以藉由Log排除異狀。
Result table
Processor回傳結果在此呈現,預設就是長下面這樣,若要自訂欄位,可以在Result Worker進行修改。
Projectdb, Resultdb和Taskdb
Pyspider有三個資料是需要儲存的
- project.db:你所撰寫的Script
- result.db:Processor解析完的結果
- task.db:所有任務的資訊(網址、抓取是成功還失敗…等)
當你順利啟動Pypsider,應該會看到專案資料夾下看到data資料夾,有數個檔案,其實就是對應上面提的三個資料,另外scheduler.1d, 1h, all則是記錄個別時間內任務的成功或失敗的數據。
你也可以選擇把這些資料存到資料庫中,你必須撰寫一個config.json檔案,來指定你要存放的位置,下面提供我的config.json:
{
"taskdb": "mysql+taskdb://root:1234@127.0.0.1:3306/taskdb",
"projectdb": "mysql+projectdb://root:1234@127.0.0.1:3306/projectdb",
"resultdb": "mysql+resultdb://root:1234@127.0.0.1:3306/resultdb",
"phantomjs-proxy": "127.0.0.1:25555",
"webui": {
"username": "admin",
"password": "1234",
"need-auth": true
},
"scheduler": {
"delete_time": 60
}
}
- 依照username:password@ip:port/db name去更換即可
- webui設定會建置簡易的登入系統
- scheduler.delete_time設置當專案狀態改為STOP時,等待多久才刪除專案
- 關於Result Worker作者提過,屬於全域設定,也就無法依據單一群組或專案去設定,這點我就沒需求,需要查詢就到資料查詢
使用config.json後,在啟動的語法就不一樣了,改成以下這語法即可
pyspider -c config.json
若無法順利啟動,可以參考我的踩坑篇-6.Pyspider無法啟動。
後語
此篇介紹Pyspider基本概念跟教大家怎麼安裝,最後,講一下我使用心得,Pyspider在需要管理多個爬蟲真的情境下滿方便,但是,我在過程中經歷過一段陣痛期…,在安裝或是開發的過程中發生許許多多奇怪的錯誤,但在網路上的資料卻不多,或是說分散在各地,所以,我另外寫了一篇「踩坑篇」我遇到的問題,以及怎麼去解決,希望能讓各位網友少走點冤忘路。
最後,喜歡我的文章幫我拍拍手,給予我鼓勵我會很開心的,以上。