隨着BIG DATA大數據概念逐漸升溫,如何搭建一個可以採集海量數據的架構體系擺在你們眼前。如何可以作到所見即所得的無阻攔式採集、如何快速把不規則頁面結構化並存儲、如何知足愈來愈多的數據採集還要在有限時間內採集。這篇文章結合咱們自身項目經驗談一下。css
咱們來看一下做爲人是怎麼獲取網頁數據的呢?html
一、打開瀏覽器,輸入網址url訪問頁面內容。
二、複製頁面內容的標題、做者、內容。
三、存儲到文本文件或者excel。java
從技術角度來講整個過程主要爲 網絡訪問、扣取結構化數據、存儲。咱們看一下用java程序如何來實現這一過程。web
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 |
import
java.io.IOException
;
import org.apache.commons.httpclient.HttpClient ; import org.apache.commons.httpclient.HttpException ; import org.apache.commons.httpclient.HttpStatus ; import org.apache.commons.httpclient.methods.GetMethod ; import org.apache.commons.lang.StringUtils ; public class HttpCrawler { public static void main ( String [ ] args ) { String content = null ; try { HttpClient httpClient = new HttpClient ( ) ; //一、網絡請求 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輸出內容。你們是否是感受作一個爬蟲也仍是蠻簡單呢。這是一個基本的入門例子,咱們再詳細介紹怎麼一步一步構建一個分佈式的適用於海量數據採集的爬蟲框架。ajax
整個框架應該包含如下部分,資源管理、反監控管理、抓取管理、監控管理。看一下整個框架的架構圖:正則表達式
一個好的採集框架,無論咱們的目標數據在哪兒,只要用戶可以看到都應該能採集到。所見即所得的無阻攔式採集,不管是否須要登陸的數據都可以順利採集。如今大部分社交網站都須要登陸,爲了應對登陸的網站要有模擬用戶登陸的爬蟲系統,才能正常獲取數據。不過社會化網站都但願本身造成一個閉環,不肯意把數據放到站外,這種系統也不會像新聞等內容那麼開放的讓人獲取。這些社會化網站大部分會採起一些限制防止機器人爬蟲系統爬取數據,通常一個帳號爬取不了多久就會被檢測出來被禁止訪問了。那是否是咱們就不能爬取這些網站的數據呢?確定不是這樣的,只要社會化網站不關閉網頁訪問,正常人可以訪問的數據,咱們也能訪問。說到底就是模擬人的正常行爲操做,專業一點叫「反監控」。算法
那通常網站會有什麼限制呢?chrome
必定時間內單IP訪問次數,沒有哪一個人會在一段持續時間內過快訪問,除非是隨意的點着玩,持續時間也不會太長。能夠採用大量不規則代理IP來模擬。apache
必定時間內單帳號訪問次數,這個同上,正常人不會這麼操做。能夠採用大量行爲正常的帳號,行爲正常就是普通人怎麼在社交網站上操做,若是一我的一天24小時都在訪問一個數據接口那就有多是機器人了。瀏覽器
若是能把帳號和IP的訪問策略控制好了,基本能夠解決這個問題了。固然對方網站也會有運維會調整策略,說到底這是一個戰爭,躲在電腦屏幕後的敵我雙方,爬蟲必需要能感知到對方的反監控策略進行了調整,通知管理員及時處理。將來比較理想應該是經過機器學習算法自動完成策略調整,保證抓取不間斷。
整個抓取使用了 xpath、正則表達式、消息中間件、多線程調度框架(參考)。xpath 是一種結構化網頁元素選擇器,支持列表和單節點數據獲取,他的好處能夠支持規整網頁數據抓取。咱們使用的是google插件 XPath Helper,這個玩意能夠支持在網頁點擊元素生成xpath,就省去了本身去查找xpath的功夫,也便於將來作到所點即所得的功能。正則表達式補充xpath抓取不到的數據,還能夠過濾一些特殊字符。消息中間件,起到抓取任務中間轉發的目的,避免抓取和各個需求方耦合。好比各個業務系統均可能抓取數據,只須要向消息中間件發送一個抓取指令,抓取平臺抓完了會返回一條消息給消息中間件,業務系統在從消息中間件收到消息反饋,整個抓取完成。多線程調度框架以前提到過,咱們的抓取平臺不可能在同一時刻只抓一個消息的任務;也不可能無限制抓取,這樣資源會耗盡,致使惡性循環。這就須要使用多線程調度框架來調度多線程任務並行抓取,而且任務的數量,保證資源的消耗正常。
無論怎麼模擬總仍是會有異常的,這就須要有個異常處理模塊,有些網站訪問一段時間須要輸入驗證碼,若是不處理後續永遠返回不了正確數據。咱們須要有機制可以處理像驗證碼這類異常,簡單就是有驗證碼了人爲去輸入,高級一些能夠破解驗證碼識別算法實現自動輸入驗證碼的目的。
擴展一下 :所見即所得咱們是否是真的作到?規則配置也是個重複的大任務?重複網頁如何不抓取?
一、有些網站利用js生成網頁內容,直接查看源代碼是一堆js。 可使用mozilla、webkit等能夠解析瀏覽器的工具包解析js、ajax,不過速度會有點慢。
二、網頁裏有一些css隱藏的文字。使用工具包把css隱藏文字去掉。
三、圖片flash信息。 若是是圖片中文字識別,這個比較好處理,可以使用ocr識別文字就行,若是是flash目前只能存儲整個url。
四、一個網頁有多個網頁結構。若是隻有一套抓取規則確定不行的,須要多個規則配合抓取。
五、html不完整,不完整就不能按照正常模式去扣取。這個時候用xpath確定解析不了,咱們能夠先用htmlcleaner清洗網頁後再解析。
六、 若是網站多起來,規則配置這個工做量也會很是大。如何幫助系統快速生成規則呢?首先能夠配置規則能夠經過可視化配置,好比用戶在看到的網頁想對它抓取數據,只須要拉開插件點擊須要的地方,規則就自動生成好了。另在量比較大的時候可視化仍是不夠的,能夠先將類型相同的網站歸類,再經過抓取的一些內容聚類,能夠統計學、可視化抓取把內容扣取出幾個版本給用戶去糾正,最後確認的規則就是新網站的規則。這些算法後續再講。
七、對付重複的網頁,若是重複抓取會浪費資源,若是不抓須要一個海量的去重判斷緩存。判斷抓不抓,抓了後存不存,而且這個緩存須要快速讀寫。常見的作法有bloomfilter、類似度聚合、分類海明距離判斷。
目前這樣的框架搭建起來基本能夠解決大量的抓取需求了。經過界面能夠管理資源、反監控規則、網頁扣取規則、消息中間件狀態、數據監控圖表,而且能夠經過後臺調整資源分配並能動態更新保證抓取不斷電。不過若是一個任務的處理特別大,可能須要抓取24個小時或者幾天。好比咱們要抓取一條微博的轉發,這個轉發是30w,那若是每頁線性去抓取耗時確定是很是慢了,若是能把這30w拆分不少小任務,那咱們的並行計算能力就會提升不少。不得不提的就是把大型的抓取任務hadoop話,廢話不說直接上圖:
今天先寫到這裏,後續再介紹下 日均千萬大型採集項目實戰。
原創文章,轉載請註明: 轉載自LANCEYAN.COM
本文連接地址: 社會化海量數據採集爬蟲框架搭建