[爬蟲]社會(huì)化海量數(shù)據(jù)采集爬蟲框架搭建

社會(huì)化海量數(shù)據(jù)采集爬蟲框架搭建 | 嚴(yán)瀾(lanceyan)的博客 - 技術(shù)分享 框架交流 大數(shù)據(jù)處理 架構(gòu)搭建 機(jī)器人
http://www.lanceyan.com/tech/arch/snscrawler.html

Paste_Image.png
Paste_Image.png

隨著BIG DATA大數(shù)據(jù)概念逐漸升溫困食,如何搭建一個(gè)能夠采集海量數(shù)據(jù)的架構(gòu)體系擺在大家眼前灰粮。如何能夠做到所見即所得的無阻攔式采集初嘹、如何快速把不規(guī)則頁面結(jié)構(gòu)化并存儲(chǔ)、如何滿足越來越多的數(shù)據(jù)采集還要在有限時(shí)間內(nèi)采集荔烧。這篇文章結(jié)合我們自身項(xiàng)目經(jīng)驗(yàn)談一下。
我們來看一下作為人是怎么獲取網(wǎng)頁數(shù)據(jù)的呢隅居?
1徐鹤、打開瀏覽器,輸入網(wǎng)址url訪問頁面內(nèi)容颂碘。2异赫、復(fù)制頁面內(nèi)容的標(biāo)題、作者头岔、內(nèi)容塔拳。3、存儲(chǔ)到文本文件或者excel峡竣。
從技術(shù)角度來說整個(gè)過程主要為 網(wǎng)絡(luò)訪問靠抑、扣取結(jié)構(gòu)化數(shù)據(jù)、存儲(chǔ)适掰。我們看一下用java程序如何來實(shí)現(xiàn)這一過程颂碧。
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(); //1、網(wǎng)絡(luò)請(qǐng)求 GetMethod method = new GetMethod("http://www.baidu.com" ); int statusCode = httpClient.executeMethod(method); if (statusCode == HttpStatus. SC_OK) { content = method.getResponseBodyAsString(); //結(jié)構(gòu)化扣取 String title = StringUtils.substringBetween(content, "<title>" , "</title>" ); //存儲(chǔ) System. out .println(title); } } catch (HttpException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { } }}

通過這個(gè)例子类浪,我們看到通過httpclient獲取數(shù)據(jù)载城,通過字符串操作扣取標(biāo)題內(nèi)容,然后通過system.out輸出內(nèi)容费就。大家是不是感覺做一個(gè)爬蟲也還是蠻簡(jiǎn)單呢诉瓦。這是一個(gè)基本的入門例子,我們?cè)僭敿?xì)介紹怎么一步一步構(gòu)建一個(gè)分布式的適用于海量數(shù)據(jù)采集的爬蟲框架力细。
整個(gè)框架應(yīng)該包含以下部分睬澡,資源管理、反監(jiān)控管理眠蚂、抓取管理煞聪、監(jiān)控管理∈呕郏看一下整個(gè)框架的架構(gòu)圖:


資源管理指網(wǎng)站分類體系昔脯、網(wǎng)站、網(wǎng)站訪問url等基本資源的管理維護(hù)馋艺;
反監(jiān)控管理指被訪問網(wǎng)站(特別是社會(huì)化媒體)會(huì)禁止爬蟲訪問栅干,怎么讓他們不能監(jiān)控到我們的訪問時(shí)爬蟲軟件,這就是反監(jiān)控機(jī)制了捐祠;

一個(gè)好的采集框架碱鳞,不管我們的目標(biāo)數(shù)據(jù)在哪兒,只要用戶能夠看到都應(yīng)該能采集到踱蛀。所見即所得的無阻攔式采集窿给,無論是否需要登錄的數(shù)據(jù)都能夠順利采集。現(xiàn)在大部分社交網(wǎng)站都需要登錄率拒,為了應(yīng)對(duì)登錄的網(wǎng)站要有模擬用戶登錄的爬蟲系統(tǒng)崩泡,才能正常獲取數(shù)據(jù)。不過社會(huì)化網(wǎng)站都希望自己形成一個(gè)閉環(huán)猬膨,不愿意把數(shù)據(jù)放到站外角撞,這種系統(tǒng)也不會(huì)像新聞等內(nèi)容那么開放的讓人獲取。這些社會(huì)化網(wǎng)站大部分會(huì)采取一些限制防止機(jī)器人爬蟲系統(tǒng)爬取數(shù)據(jù),一般一個(gè)賬號(hào)爬取不了多久就會(huì)被檢測(cè)出來被禁止訪問了谒所。那是不是我們就不能爬取這些網(wǎng)站的數(shù)據(jù)呢热康?肯定不是這樣的,只要社會(huì)化網(wǎng)站不關(guān)閉網(wǎng)頁訪問劣领,正常人能夠訪問的數(shù)據(jù)姐军,我們也能訪問。說到底就是模擬人的正常行為操作尖淘,專業(yè)一點(diǎn)叫“反監(jiān)控”奕锌。
那一般網(wǎng)站會(huì)有什么限制呢?
一定時(shí)間內(nèi)單IP訪問次數(shù)村生,沒有哪個(gè)人會(huì)在一段持續(xù)時(shí)間內(nèi)過快訪問惊暴,除非是隨意的點(diǎn)著玩,持續(xù)時(shí)間也不會(huì)太長(zhǎng)趁桃〗墒兀可以采用大量不規(guī)則代理IP來模擬。
一定時(shí)間內(nèi)單賬號(hào)訪問次數(shù)镇辉,這個(gè)同上屡穗,正常人不會(huì)這么操作『龈兀可以采用大量行為正常的賬號(hào)村砂,行為正常就是普通人怎么在社交網(wǎng)站上操作,如果一個(gè)人一天24小時(shí)都在訪問一個(gè)數(shù)據(jù)接口那就有可能是機(jī)器人了屹逛。
如果能把賬號(hào)和IP的訪問策略控制好了础废,基本可以解決這個(gè)問題了。當(dāng)然對(duì)方網(wǎng)站也會(huì)有運(yùn)維會(huì)調(diào)整策略罕模,說到底這是一個(gè)戰(zhàn)爭(zhēng)评腺,躲在電腦屏幕后的敵我雙方,爬蟲必須要能感知到對(duì)方的反監(jiān)控策略進(jìn)行了調(diào)整淑掌,通知管理員及時(shí)處理蒿讥。未來比較理想應(yīng)該是通過機(jī)器學(xué)習(xí)算法自動(dòng)完成策略調(diào)整,保證抓取不間斷抛腕。
抓取管理指通過url芋绸,結(jié)合資源、反監(jiān)控抓取數(shù)據(jù)并存儲(chǔ)担敌;我們現(xiàn)在大部分爬蟲系統(tǒng)摔敛,很多都需要自己設(shè)定正則表達(dá)式,或者使用htmlparser全封、jsoup等軟件來硬編碼解決結(jié)構(gòu)化抓取的問題马昙。不過大家在做爬蟲也會(huì)發(fā)現(xiàn)桃犬,如果爬取一個(gè)網(wǎng)站就去開發(fā)一個(gè)類,在規(guī)模小的時(shí)候還可以接受行楞,如果需要抓取的網(wǎng)站成千上萬疫萤,那我們不是要開發(fā)成百上千的類。為此我們開發(fā)了一個(gè)通用的抓取類敢伸,可以通過參數(shù)驅(qū)動(dòng)內(nèi)部邏輯調(diào)度。比如我們?cè)趨?shù)里指定抓取新浪微博恒削,抓取機(jī)器就會(huì)調(diào)度新浪微博網(wǎng)頁扣取規(guī)則抓取節(jié)點(diǎn)數(shù)據(jù)池颈,調(diào)用存儲(chǔ)規(guī)則存儲(chǔ)數(shù)據(jù),不管什么類型最后都調(diào)用同一個(gè)類來處理钓丰。對(duì)于我們用戶只需要設(shè)置抓取規(guī)則躯砰,相應(yīng)的后續(xù)處理就交給抓取平臺(tái)了。

整個(gè)抓取使用了 xpath携丁、正則表達(dá)式琢歇、消息中間件、多線程調(diào)度框架(參考)梦鉴。xpath 是一種結(jié)構(gòu)化網(wǎng)頁元素選擇器李茫,支持列表和單節(jié)點(diǎn)數(shù)據(jù)獲取,他的好處可以支持規(guī)整網(wǎng)頁數(shù)據(jù)抓取肥橙。我們使用的是google插件 XPath Helper魄宏,這個(gè)玩意可以支持在網(wǎng)頁點(diǎn)擊元素生成xpath,就省去了自己去查找xpath的功夫存筏,也便于未來做到所點(diǎn)即所得的功能宠互。正則表達(dá)式補(bǔ)充xpath抓取不到的數(shù)據(jù),還可以過濾一些特殊字符椭坚。消息中間件予跌,起到抓取任務(wù)中間轉(zhuǎn)發(fā)的目的,避免抓取和各個(gè)需求方耦合善茎。比如各個(gè)業(yè)務(wù)系統(tǒng)都可能抓取數(shù)據(jù)券册,只需要向消息中間件發(fā)送一個(gè)抓取指令,抓取平臺(tái)抓完了會(huì)返回一條消息給消息中間件垂涯,業(yè)務(wù)系統(tǒng)在從消息中間件收到消息反饋汁掠,整個(gè)抓取完成。多線程調(diào)度框架之前提到過集币,我們的抓取平臺(tái)不可能在同一時(shí)刻只抓一個(gè)消息的任務(wù)考阱;也不可能無限制抓取,這樣資源會(huì)耗盡,導(dǎo)致惡性循環(huán)。這就需要使用多線程調(diào)度框架來調(diào)度多線程任務(wù)并行抓取月匣,并且任務(wù)的數(shù)量桑阶,保證資源的消耗正常胧沫。
不管怎么模擬總還是會(huì)有異常的行嗤,這就需要有個(gè)異常處理模塊双霍,有些網(wǎng)站訪問一段時(shí)間需要輸入驗(yàn)證碼臭猜,如果不處理后續(xù)永遠(yuǎn)返回不了正確數(shù)據(jù)鹦倚。我們需要有機(jī)制能夠處理像驗(yàn)證碼這類異常河质,簡(jiǎn)單就是有驗(yàn)證碼了人為去輸入,高級(jí)一些可以破解驗(yàn)證碼識(shí)別算法實(shí)現(xiàn)自動(dòng)輸入驗(yàn)證碼的目的震叙。
擴(kuò)展一下 :所見即所得我們是不是真的做到掀鹅?規(guī)則配置也是個(gè)重復(fù)的大任務(wù)?重復(fù)網(wǎng)頁如何不抓让铰ァ乐尊?
1、有些網(wǎng)站利用js生成網(wǎng)頁內(nèi)容划址,直接查看源代碼是一堆js扔嵌。 可以使用mozilla、webkit等可以解析瀏覽器的工具包解析js夺颤、ajax痢缎,不過速度會(huì)有點(diǎn)慢。2世澜、網(wǎng)頁里有一些css隱藏的文字牺弄。使用工具包把css隱藏文字去掉。3宜狐、圖片flash信息势告。 如果是圖片中文字識(shí)別,這個(gè)比較好處理抚恒,能夠使用ocr識(shí)別文字就行咱台,如果是flash目前只能存儲(chǔ)整個(gè)url。4俭驮、一個(gè)網(wǎng)頁有多個(gè)網(wǎng)頁結(jié)構(gòu)回溺。如果只有一套抓取規(guī)則肯定不行的,需要多個(gè)規(guī)則配合抓取混萝。5遗遵、html不完整,不完整就不能按照正常模式去扣取逸嘀。這個(gè)時(shí)候用xpath肯定解析不了车要,我們可以先用htmlcleaner清洗網(wǎng)頁后再解析。6崭倘、 如果網(wǎng)站多起來翼岁,規(guī)則配置這個(gè)工作量也會(huì)非常大类垫。如何幫助系統(tǒng)快速生成規(guī)則呢?首先可以配置規(guī)則可以通過可視化配置琅坡,比如用戶在看到的網(wǎng)頁想對(duì)它抓取數(shù)據(jù)悉患,只需要拉開插件點(diǎn)擊需要的地方,規(guī)則就自動(dòng)生成好了榆俺。另在量比較大的時(shí)候可視化還是不夠的售躁,可以先將類型相同的網(wǎng)站歸類,再通過抓取的一些內(nèi)容聚類茴晋,可以統(tǒng)計(jì)學(xué)陪捷、可視化抓取把內(nèi)容扣取出幾個(gè)版本給用戶去糾正,最后確認(rèn)的規(guī)則就是新網(wǎng)站的規(guī)則晃跺。這些算法后續(xù)再講。這塊再補(bǔ)充一下(多謝zicjin建議):
背景:如果我們需要抓取的網(wǎng)站很多毫玖,那如果靠可視化配置需要耗費(fèi)大量的人力掀虎,這是個(gè)成本。并且這個(gè)交給不懂html的業(yè)務(wù)去配置準(zhǔn)確性值得考量付枫,所以最后還是需要技術(shù)做很多事情烹玉。那我們能否通過技術(shù)手段可以幫助生成規(guī)則減少人力成本,或者幫助不懂技術(shù)的業(yè)務(wù)準(zhǔn)確的把數(shù)據(jù)扣取下來并大量復(fù)制阐滩。
方案:先對(duì)網(wǎng)站分類二打,比如分為新聞、論壇掂榔、視頻等继效,這一類網(wǎng)站的網(wǎng)頁結(jié)構(gòu)是類似的。在業(yè)務(wù)打開需要扣取的還沒有錄入我們規(guī)則庫的網(wǎng)頁時(shí)装获,他先設(shè)定這個(gè)頁面的分類(當(dāng)然這個(gè)也可以機(jī)器預(yù)先判斷瑞信,他們來選擇,這一步必須要人判斷下)穴豫,有了分類后凡简,我們會(huì)通過“統(tǒng)計(jì)學(xué)、可視化判斷”識(shí)別這一分類的字段規(guī)則精肃,但是這個(gè)是機(jī)器識(shí)別的規(guī)則秤涩,可能不準(zhǔn)確,機(jī)器識(shí)別完后司抱,還需要人在判斷一下筐眷。判斷完成后,最后形成規(guī)則才是新網(wǎng)站的規(guī)則
7习柠、對(duì)付重復(fù)的網(wǎng)頁浊竟,如果重復(fù)抓取會(huì)浪費(fèi)資源怨喘,如果不抓需要一個(gè)海量的去重判斷緩存。判斷抓不抓振定,抓了后存不存必怜,并且這個(gè)緩存需要快速讀寫。常見的做法有bloomfilter后频、相似度聚合梳庆、分類海明距離判斷。
監(jiān)控管理指不管什么系統(tǒng)都可能出問題卑惜,如果對(duì)方服務(wù)器宕機(jī)膏执、網(wǎng)頁改版、更換地址等我們需要第一時(shí)間知道露久,這時(shí)監(jiān)控系統(tǒng)就起到出現(xiàn)了問題及時(shí)發(fā)現(xiàn)并通知聯(lián)系人更米。

目前這樣的框架搭建起來基本可以解決大量的抓取需求了。通過界面可以管理資源毫痕、反監(jiān)控規(guī)則征峦、網(wǎng)頁扣取規(guī)則、消息中間件狀態(tài)消请、數(shù)據(jù)監(jiān)控圖表栏笆,并且可以通過后臺(tái)調(diào)整資源分配并能動(dòng)態(tài)更新保證抓取不斷電。不過如果一個(gè)任務(wù)的處理特別大臊泰,可能需要抓取24個(gè)小時(shí)或者幾天蛉加。比如我們要抓取一條微博的轉(zhuǎn)發(fā),這個(gè)轉(zhuǎn)發(fā)是30w缸逃,那如果每頁線性去抓取耗時(shí)肯定是非常慢了针饥,如果能把這30w拆分很多小任務(wù),那我們的并行計(jì)算能力就會(huì)提高很多需频。不得不提的就是把大型的抓取任務(wù)hadoop化打厘,廢話不說直接上圖:


今天先寫到這里,后續(xù)再介紹下 日均千萬大型采集項(xiàng)目實(shí)戰(zhàn)贺辰。


實(shí)戰(zhàn)低成本服務(wù)器搭建千萬級(jí)數(shù)據(jù)采集系統(tǒng) - Java Dynamic的專欄 - 博客頻道 - CSDN.NET
http://blog.csdn.net/qbg19881206/article/details/9817277


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末户盯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子饲化,更是在濱河造成了極大的恐慌莽鸭,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吃靠,死亡現(xiàn)場(chǎng)離奇詭異硫眨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)巢块,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門礁阁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巧号,“玉大人,你說我怎么就攤上這事姥闭〉ず瑁” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵棚品,是天一觀的道長(zhǎng)靠欢。 經(jīng)常有香客問我,道長(zhǎng)铜跑,這世上最難降的妖魔是什么门怪? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮锅纺,結(jié)果婚禮上掷空,老公的妹妹穿的比我還像新娘。我一直安慰自己囤锉,他們只是感情好坦弟,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嚼锄,像睡著了一般减拭。 火紅的嫁衣襯著肌膚如雪蔽豺。 梳的紋絲不亂的頭發(fā)上区丑,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音修陡,去河邊找鬼沧侥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛魄鸦,可吹牛的內(nèi)容都是我干的宴杀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼拾因,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼旺罢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绢记,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤扁达,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蠢熄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跪解,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年签孔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叉讥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窘行。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖图仓,靈堂內(nèi)的尸體忽然破棺而出罐盔,到底是詐尸還是另有隱情,我是刑警寧澤透绩,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布翘骂,位于F島的核電站,受9級(jí)特大地震影響帚豪,放射性物質(zhì)發(fā)生泄漏碳竟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一狸臣、第九天 我趴在偏房一處隱蔽的房頂上張望莹桅。 院中可真熱鬧,春花似錦烛亦、人聲如沸诈泼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铐达。三九已至,卻和暖如春檬果,著一層夾襖步出監(jiān)牢的瞬間瓮孙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工选脊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杭抠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓恳啥,卻偏偏與公主長(zhǎng)得像偏灿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钝的,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容