隨著BIG DATA大資料概念逐漸升溫,如何搭建一個能夠採集海量資料的架構體系擺在大家眼前。如何能夠做到所見即所得 (WYSIWYG)的無阻攔式採集、如何快速把不規則頁面結構化並儲存、如何滿足越來越多的資料擷取還要在有限時間內採集。這篇文章結合我們自身項目經驗談一下。
我們來看一下作為人是怎麼擷取網頁資料的呢?
1、開啟瀏覽器,輸入網址url訪問頁面內容。
2、複製頁面內容的標題、作者、內容。
3、儲存到文字檔或者excel。
從技術角度來說整個過程主要為 網路訪問、扣取結構化資料、儲存。我們看一下用java程式如何來實現這一過程。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
importjava.io.IOException; importorg.apache.commons.httpclient.HttpClient; importorg.apache.commons.httpclient.HttpException; importorg.apache.commons.httpclient.HttpStatus; importorg.apache.commons.httpclient.methods.GetMethod; importorg.apache.commons.lang.StringUtils;
publicclass HttpCrawler { publicstaticvoid main(String[] args){
String content =null; try{ HttpClient httpClient =new HttpClient(); //1、網路請求 GetMethod method =new GetMethod("http://www.baidu.com"); int statusCode = httpClient.executeMethod(method); if(statusCode == HttpStatus. SC_OK){ content = method.getResponseBodyAsString(); //結構化扣取 String title = StringUtils.substringBetween(content, "<title>" , "</title>"); //儲存 System. out .println(title); }
}catch(HttpException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); }finally{ } } } |
通過這個例子,我們看到通過httpclient擷取資料,通過字串操作扣取標題內容,然後通過system.out輸出內容。大家是不是感覺做一個爬蟲也還是蠻簡單呢。這是一個基本的入門例子,我們再詳細介紹怎麼一步一步構建一個分布式的適用于海量資料擷取的爬蟲架構。
整個架構應該包含以下部分,資源管理、反監控管理、抓取管理、監控管理。看一下整個架構的架構圖:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131229/1I60345L-0.jpg" alt="社會化海量資料抓取元件圖表" width="400" height="397" class="alignleft size-medium wp-image-500" style="max-width:100%;height:auto;vertical-align:middle;border:0px;margin:0px auto 20px;display:block;" />
資源管理指網站分類體系、網站、網站訪問url等基本資源的管理維護;
反監控管理指被訪問網站特別是社會化媒體)會禁止爬蟲訪問,怎麼讓他們不能監控到我們的訪問時爬蟲軟體,這就是反監控機制了;
一個好的採集架構,不管我們的目標資料在哪兒,只要使用者能夠看到都應該能採集到。所見即所得 (WYSIWYG)的無阻攔式採集,無論是否需要登入的資料都能夠順利採集。現在大部分社交網站都需要登入,為了應對登入的網站要有類比使用者登入的爬蟲系統,才能正常擷取資料。不過社會化網站都希望自己形成一個閉環,不願意把資料放到站外,這種系統也不會像新聞等內容那麼開放的讓人擷取。這些社會化網站大部分會採取一些限制防止機器人爬蟲系統爬取資料,一般一個帳號爬取不了多久就會被檢測出來被禁止訪問了。那是不是我們就不能爬取這些網站的資料呢?肯定不是這樣的,只要社會化網站不關閉網頁訪問,正常人能夠訪問的資料,我們也能訪問。說到底就是類比人的正常行為操作,專業一點叫“反監控”。
那一般網站會有什麼限制呢?
一定時間內單IP訪問次數,沒有哪個人會在一段期間內過快訪問,除非是隨意的點著玩,期間也不會太長。可以採用大量不規則代理IP來類比。
一定時間內單帳號訪問次數,這個同上,正常人不會這麼操作。可以採用大量行為正常的帳號,行為正常就是普通人怎麼在社交網站上操作,如果一個人一天24小時都在訪問一個資料介面那就有可能是機器人了。
如果能把帳號和IP的存取原則控制好了,基本可以解決這個問題了。當然對方網站也會有營運會調整策略,說到底這是一個戰爭,躲在電腦螢幕後的敵我雙方,爬蟲必須要能感知到對方的反監控策略進行了調整,通知管理員及時處理。未來比較理想應該是通過機器學習演算法自動完成策略調整,保證抓取不間斷。
抓取管理指通過url,結合資源、反監控抓取資料並儲存;我們現在大部分爬蟲系統,很多都需要自己設定Regex,或者使用htmlparser、jsoup等軟體來寫入程式碼解決結構化抓取的問題。不過大家在做爬蟲也會發現,如果爬取一個網站就去開發一個類,在規模小的時候還可以接受,如果需要抓取的網站成千上萬,那我們不是要開發成百上千的類。為此我們開發了一個通用的抓取類,可以通過參數驅動內部邏輯調度。比如我們在參數裡指定抓取新浪微博,抓取機器就會調度新浪微博網頁扣取規則抓取節點資料,調用儲存規則儲存資料,不管什麼類型最後都調用同一個類來處理。對於我們使用者只需要設定抓取規則,相應的後續處理就交給抓取平台了。
整個抓取使用了 xpath、Regex、訊息中介軟體、多線程調度架構參考)。xpath 是一種結構化網頁元素選取器,支援列表和單節點資料擷取,他的好處可以支援規整網頁資料抓取。我們使用的是google外掛程式 XPath Helper,這個玩意可以支援在網頁點擊元素產生xpath,就省去了自己去尋找xpath的功夫,也便於未來做到所點即所得的功能。Regex補充xpath抓取不到的資料,還可以過濾一些特殊字元。訊息中介軟體,起到抓取任務中間轉寄的目的,避免抓取和各個需求方耦合。比如各個業務系統都可能抓取資料,只需要向訊息中介軟體發送一個抓取指令,抓取平台抓完了會返回一條訊息給訊息中介軟體,業務系統在從訊息中介軟體收到訊息反饋,整個抓取完成。多線程調度架構之前提到過,我們的抓取平台不可能在同一時刻只抓一個訊息的任務;也不可能無限制抓取,這樣資源會耗盡,導致惡性迴圈。這就需要使用多線程調度架構來調度多線程任務並行抓取,並且任務的數量,保證資源的消耗正常。
不管怎麼類比總還是會有異常的,這就需要有個異常處理模組,有些網站訪問一段時間需要輸入驗證碼,如果不處理後續永遠返回不了正確資料。我們需要有機制能夠處理像驗證碼這類異常,簡單就是有驗證碼了人為去輸入,進階一些可以破解驗證碼識別演算法實現自動輸入驗證碼的目的。
擴充一下 :所見即所得 (WYSIWYG)我們是不是真的做到?規則配置也是個重複的大任務?重複網頁如何不抓取?
1、有些網站利用js產生網頁內容,直接查看原始碼是一堆js。 可以使用mozilla、webkit等可以解析瀏覽器的工具包解析js、ajax,不過速度會有點慢。
2、網頁裡有一些css隱藏的文字。使用工具包把css隱藏文字去掉。
3、圖片flash資訊。 如果是圖片中文字識別,這個比較好處理,能夠使用ocr識別文字就行,如果是flash目前只能儲存整個url。
4、一個網頁有多個網頁結構。如果只有一套抓取規則肯定不行的,需要多個規則配合抓取。
5、html不完整,不完整就不能按照正常模式去扣取。這個時候用xpath肯定解析不了,我們可以先用htmlcleaner清洗網頁後再解析。
6、 如果網站多起來,規則配置這個工作量也會非常大。如何協助系統快速建置規則呢?首先可以配置規則可以通過可視化配置,比如使用者在看到的網頁想對它抓取資料,只需要拉開外掛程式點擊需要的地方,規則就自動產生好了。另在量比較大的時候可視化還是不夠的,可以先將類型相同的網站歸類,再通過抓取的一些內容聚類,可以統計學、可視化抓取把內容扣取出幾個版本給使用者去糾正,最後確認的規則就是新網站的規則。這些演算法後續再講。
7、對付重複的網頁,如果重複抓取會浪費資源,如果不抓需要一個海量的去重判斷緩衝。判斷抓不抓,抓了後存不存,並且這個緩衝需要快速讀寫。常見的做法有bloomfilter、相似性彙總、分類海明距離判斷。
監控管理指不管什麼系統都可能出問題,如果對方伺服器宕機、網頁改版、更換地址等我們需要第一時間知道,這時監控系統就起到出現了問題及時發現並通知連絡人。
目前這樣的架構搭建起來基本可以解決大量的抓取需求了。通過介面可以管理資源、反監控規則、網頁扣取規則、訊息中介軟體狀態、資料監控圖表,並且可以通過後台調整資源分派並能動態更新保證抓取不斷電。不過如果一個任務的處理特別大,可能需要抓取24個小時或者幾天。比如我們要抓取一條微博的轉寄,這個轉寄是30w,那如果每頁線性去抓取耗時肯定是非常慢了,如果能把這30w拆分很多小任務,那我們的並行計算能力就會提高很多。不得不提的就是把大型的抓取任務hadoop話,廢話不說直接:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131229/1I6034234-1.jpg" alt="社會化海量資料抓取元件圖表" width="400" height="328" class="alignleft size-medium wp-image-499" style="max-width:100%;height:auto;vertical-align:middle;border:0px;margin:0px auto 20px;display:block;" />
今天先寫到這裡,後續再介紹下 日均千萬大型採集項目實戰。
原創文章,轉載請註明: 轉載自LANCEYAN.COM
本文連結地址:社會化海量資料擷取爬蟲架構搭建