資料匹配
首先先研究最關鍵的資料抓取。從形式各異的資料中將內容“扒”下來。
當然得依賴我們的強力工具 Regex了(個人覺得基於DOM樹分析很麻煩,很不靈活)
分析了幾個BOKECC頁面後,總結如下:
1. 各頁面有一定差別,可能是基於不同版本。HTML寫的很不正規,基於HTML標籤來匹配肯定不合適。
2. 頁面帶動態內容,需要分析,類比AJAX去請求。
在基於HTML源碼的資料爬取中,如果單純的想基於HTML標籤做挖掘,肯定正確率很低。還是需要返璞歸真,人怎麼看的,就怎麼挖。
於是我大多是採用基於頁面視覺(比如文字、或者地區)的匹配方法。將一些不太重要的HTML標籤過濾掉。然後進行資料匹配。
這裡用到了python的re模組。
先寫了寫幾個程式用來測試,測試了來自20個不同網站的頁面,基本能夠抓取正確。
接下來說說AJAX內容。
為什麼動態內容需要類比AJAX請求呢?
因為你以HTTP流的方式去擷取網頁內容,是不帶動態打出的內容的。(比如div標籤裡是空的),但是當你以瀏覽器的形式去訪問,能夠看到資料,這是因為瀏覽器的javascript引擎執行了其中的JS代碼,去非同步請求資料,動態打出在頁面上。
WEB介面
每個節點需要暴露WEB介面,在上一篇的設計中,我提到了SOAP協議。實際實現的時候,在此系統中我們還是使用的基於HTTP GET的介面。(編碼比較簡單,:D),為了方便部署、也為了體現python一切都那麼簡單的原則,我沒有使用apache等知名Web伺服器,而是使用了python的BaseHTTPServer模組。重載 do_GET方法來實現我們的WEB介面暴露。
為什麼WEB介面需要設計同步和非同步兩種返回?由於我們的分布式節點是基於任務形式的,所以我們節點任務邏輯反饋包括2步:
1. 確認任務收到
2. 任務完成回調
這樣控制者方面的程式就很好編寫了:對於所有的節點發送任務,同時附帶任務號,在節點同步反饋接收任務後,等待,若某節點任務回調了,則認為該節點閑置,再分配任務。。。(當然,實際情況可能每個節點是多線程跑的,還可以由節點、或者控制者來維護一個任務隊列和線程池)
非同步如何??
起線程。(當然你也可以管理線程池,我這兒就沒管這麼多了)
資料庫操作
沒啥好說的,我這用的MYSQL,直接SQL語句。簡單明了。
如何部署?
由於我這隻有在WINDOWS平台部署的需求,所以我用py2exe打成EXE包發布。
若想實現自動化部署也很簡單,自己在每個節點上寫個“後門”,可以統一調度所有機器的後門即可。(控制其下載、重啟)