用python進行分布式網頁資料抓取(二)—— 核心問題討論

來源:互聯網
上載者:User

資料匹配

 

首先先研究最關鍵的資料抓取。從形式各異的資料中將內容“扒”下來。

當然得依賴我們的強力工具 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包發布。

若想實現自動化部署也很簡單,自己在每個節點上寫個“後門”,可以統一調度所有機器的後門即可。(控制其下載、重啟)

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.