Pyspider — 介紹與安裝篇

Bing Kuo
12 min readJun 7, 2019

--

適合本篇閱讀的人:

  • 寫過爬蟲的人
  • 想監控管理爬蟲的人

本篇架構:

  1. Pyspider介紹
  2. Pyspider架構
  3. 安裝
  4. WebUI介紹
  5. Projectdb, Resultdb和Taskdb
  6. 後語

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從這張圖能有個概念。

Pyspider Architecture (from http://docs.pyspider.org/en/latest/Architecture/)

Scheduler

Scheduler負責從newtask_queue那裡接收新任務(task),決定是新任務還是要重爬的任務,根據token bucket演算法(流量管制),依任務的優先順序餵給Fetcher。以上說的在程式裡都藉由self.crawl API

Fetcher

Fetcher負責抓取網頁頁面(html, css…),再把結果寄Processor,Fetcher也支援Data URI,對於JavaScript生成頁面,Pyspider可以藉由PhantomjsSplash,這過程的設定也是藉由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
啟動成功畫面

當你看到這個畫面代表成功囉,有啟動三個東西

  1. phantomjs fetcher啟動在port 25555,當你要爬取javascript生成網頁時,你就會到他
  2. xmlrpc server啟動在port 23333,這是負責在scheduler跟webui的通訊,做這在這邊有提到https://segmentfault.com/q/1010000008915759
  3. webui啟動在port 5000,這就是管理介面,現在打開你的http://localhost:5000就能看到畫面囉!以下就讓我們來看看pyspider強大的管理介面能做什麼事情。

WebUI介紹

Dashboard

Dashboard畫面

由上往下,由左至右做介紹

  1. 最上方那排,我沒有使用過…,我理解是當使用redis或rabbitmq當作柱列時,上面才會開始有數字顯示。
  2. Recent Active Tasks顯示目前任務的狀況
  3. Create建立新的專案
  4. 下方表格分別設定群組、專案名稱、專案狀態、抓取頻率、平均時間、各時間單位執行的任務數、操作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

Script Editor畫面

此區為撰寫程式(processor)的地方,這裡是編輯區,也是測試區,一切開發從這裡做起,挑值得補充的介紹:

  1. 綠色框框紀錄目前這個任務的狀況,上圖就是在data:,on_start,表示目前還沒開始爬取網站,當你點下Run就會執行。
  2. 若是有scheduler有接受到任務,就會出現下方黃色地方顯示,點下白色箭頭就會將此任務發給fetcher抓取資料,在經過你撰寫的程式,呈現在編輯區,右方程式的部分後續會在做介紹。
  3. 點選web能預覽網站畫面,若在點選enable css selector helper,就能擷取html tag,會以pyquery的語法輸出。

Active Tasks

Active Tasks畫面

每一個任務的執行狀況都會顯示在這,Failed表示在Fetch就發生錯誤,Process_error表示Fetch成功但process失敗,點擊網址顯示詳細Log。

Log

Log畫面

由上而下就是Pyspider在執行任務所留下的訊息,當任務錯誤,可以藉由Log排除異狀。

Result table

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在需要管理多個爬蟲真的情境下滿方便,但是,我在過程中經歷過一段陣痛期…,在安裝或是開發的過程中發生許許多多奇怪的錯誤,但在網路上的資料卻不多,或是說分散在各地,所以,我另外寫了一篇「踩坑篇」我遇到的問題,以及怎麼去解決,希望能讓各位網友少走點冤忘路。

最後,喜歡我的文章幫我拍拍手,給予我鼓勵我會很開心的,以上。

延伸閱讀

--

--