奇酷大數(shù)據(jù)培訓(xùn):海量數(shù)據(jù)抓取
來源:
奇酷教育 發(fā)表于:
現(xiàn)如今大數(shù)據(jù)是個(gè)非常熱門的話題,大數(shù)據(jù)時(shí)代基于互聯(lián)網(wǎng)+的背景下,利用并行計(jì)算系統(tǒng)和分布式爬蟲系統(tǒng),結(jié)合獨(dú)特的語義分析技術(shù)進(jìn)行全
現(xiàn)如今
大數(shù)據(jù)是個(gè)非常熱門的話題,
大數(shù)據(jù)時(shí)代基于互聯(lián)網(wǎng)+的背景下,利用并行計(jì)算系統(tǒng)和分布式
爬蟲系統(tǒng),結(jié)合獨(dú)特的語義分析技術(shù)進(jìn)行全網(wǎng)數(shù)據(jù)抓取。圍繞著大數(shù)據(jù)的存儲(chǔ)、計(jì)算等方面展開。今天奇酷大數(shù)據(jù)培訓(xùn)老師圍繞如何獲取垂直海量數(shù)據(jù)做六大詳細(xì)闡述。
一.引言
數(shù)據(jù)的作用不言而喻,在各行各業(yè)中,分門別類的數(shù)據(jù)為用戶的在線生活體驗(yàn)提供了基本的素材,附近的餐館、即將上映的電影、最近熱門新聞等等能夠涵蓋我們生活的方方面面。同時(shí)所有的這一切也成就了今天在各個(gè)垂直領(lǐng)域諸如大眾點(diǎn)評、豆瓣、今日頭條等專業(yè)的公司。具體到搜索業(yè)務(wù)來說,無論是多么優(yōu)秀的架構(gòu)、精準(zhǔn)的算法,最終也是需要依賴完備、準(zhǔn)確、及時(shí)的數(shù)據(jù)作為落地基礎(chǔ)。
從搜索業(yè)務(wù)來看,數(shù)據(jù)的價(jià)值主要體現(xiàn)在如下3個(gè)方面:
1.直接提供搜索數(shù)據(jù)源。海量的數(shù)據(jù)為檢索提供了必不可少的素材。為此數(shù)據(jù)工作的一個(gè)基本目標(biāo)是數(shù)據(jù)完備性。完備性可以從兩方面來理解,一方面是實(shí)體本身的完備,是0和1的關(guān)系,這是剛性需求,例如你搜索《來自星星的你》,如果沒有這部片子,那么結(jié)果顯然不能滿足用戶需求;另一方面是實(shí)體內(nèi)部信息的完備,例如《來自星星的你》如果缺少了演員字段,那么你搜索“金秀賢”的時(shí)候可能依然得不到想要的結(jié)果。另外要提的一點(diǎn)是完備性通常還對時(shí)間有約束,熱點(diǎn)資訊、突發(fā)事件等如果不能在第一時(shí)間呈現(xiàn),那么對于用戶來說都是個(gè)硬傷。
2.改善相關(guān)性質(zhì)量。干凈、精確的數(shù)據(jù)可以使得在相關(guān)性計(jì)算階段減少歧義,改善召回品質(zhì),互聯(lián)網(wǎng)中的數(shù)據(jù)魚龍混雜,各個(gè)網(wǎng)站的水平也是良莠不齊,不做去噪直接使用的話往往會(huì)適得其反。通過高質(zhì)量的數(shù)據(jù)補(bǔ)充,對最終結(jié)果的排序也有良好的輔助作用。例如豆瓣的影評分?jǐn)?shù)、熱度因子可以在視頻搜索中輔助結(jié)果排序,并且可以改善數(shù)據(jù)剛上架時(shí)由于點(diǎn)擊量缺失造成排序上不來這種冷啟動(dòng)的過程。
3.豐富搜索產(chǎn)品特性,滿足搜索直達(dá)需求。當(dāng)數(shù)據(jù)完備、及時(shí)、準(zhǔn)確之后就可以對數(shù)據(jù)做關(guān)聯(lián)聚合,在這個(gè)時(shí)候超越文本本身的各種語義特征、知識關(guān)聯(lián)等一些高階應(yīng)用相繼涌現(xiàn),大家常常聽到的Google的Knowledge Graph、Facebook的Graph Search以及百度知心搜索等都是建立在這一個(gè)基礎(chǔ)之上。將散落在互聯(lián)網(wǎng)上碎片化的知識整合起來形成直觀答案顯然是一種更“懂”你的方式。
總的來說,數(shù)據(jù)獲取工作主要圍繞快、準(zhǔn)、全三個(gè)要素以及一個(gè)高階的關(guān)聯(lián)需求展開。今天重點(diǎn)分析數(shù)據(jù)如何發(fā)現(xiàn)、抓取、更新等方面做一個(gè)介紹。
二.數(shù)據(jù)發(fā)現(xiàn)
互聯(lián)網(wǎng)中的數(shù)據(jù)良莠不齊,如何從紛繁復(fù)雜的互聯(lián)網(wǎng)中發(fā)現(xiàn)有價(jià)值的數(shù)據(jù)是一個(gè)頭痛的問題。通常數(shù)據(jù)發(fā)現(xiàn)的過程中存在以下4個(gè)難點(diǎn):
1.數(shù)據(jù)海量,無法遍歷窮舉;
2.魚龍混雜,需要甄別出高價(jià)值的數(shù)據(jù);
3.存在死鏈、無效參數(shù)、作弊、陷阱等頁面使得數(shù)據(jù)獲取的過程中存在各種坑。
4.從哪個(gè)網(wǎng)站獲?。咳绾蔚玫竭@個(gè)網(wǎng)站內(nèi)有價(jià)值的鏈接?
那么:如何獲取有效站點(diǎn)?通常有以下2個(gè)辦法:
1.垂直榜單數(shù)據(jù),一般領(lǐng)域內(nèi)的熱門站點(diǎn)都會(huì)存在于各大垂直榜單數(shù)據(jù)中,以視頻站點(diǎn)為例,可以監(jiān)控類似類似 www.hao123.com 上的垂直分類數(shù)據(jù)做提取收集
2.關(guān)鍵字提取,通??梢岳藐P(guān)鍵字到綜合搜索引擎(google、百度等)中獲取。這里有個(gè)問題就是關(guān)鍵字如何獲取,一方面可以垂直引擎中的零結(jié)果的關(guān)鍵字或者其他低CTR關(guān)鍵字,另一方面可以利用已經(jīng)積累的數(shù)據(jù)構(gòu)造,例如想要獲取音樂鈴聲類的站點(diǎn),可以以“最炫民族風(fēng) 鈴聲”構(gòu)造出特定特征的關(guān)鍵字。
3.關(guān)鍵字獲取,同類垂直綜合站點(diǎn)中爬取,以獲取新聞?wù)军c(diǎn)為例,可以到 http://news.baidu.com 中將其中的鏈接抽取匯聚成特定的一些站點(diǎn)。
4.綜合類站點(diǎn)頁面
那又是如何從網(wǎng)站內(nèi)得到高價(jià)值的鏈接呢?
一般的url都有一些顯著特征,通常可以利用前面的方法2,利用大量的query到綜合搜索引擎中做site檢索獲取大量同站點(diǎn)內(nèi)url,這里基于一個(gè)假設(shè)就是搜索引擎能召回的數(shù)據(jù)都是億萬鏈接中盡量有價(jià)值的展現(xiàn)給用戶,召回的結(jié)果已經(jīng)融合了用戶點(diǎn)擊、數(shù)據(jù)本身質(zhì)量、站點(diǎn)權(quán)威等因子在這里,是一個(gè)綜合權(quán)威的結(jié)果。得到同站點(diǎn)url后我們可以分析其特征,對于一些顯著特征占比的url可以認(rèn)為是高價(jià)值鏈接的特征,例如百度百科http://baike.baidu.com/subview/(d+)/(d+).htm和http://baike.baidu.com/view/(d+).htm 類似這種特殊的片段。在得到高質(zhì)量的特征的url后可以對庫內(nèi)已經(jīng)抓取的數(shù)據(jù)做鏈接分析,反轉(zhuǎn)父鏈子鏈關(guān)系匯聚出一些能產(chǎn)生高價(jià)值數(shù)據(jù)的父鏈作為種子持續(xù)發(fā)現(xiàn)高價(jià)值數(shù)據(jù)。
三、數(shù)據(jù)抓取
以上我們介紹了如何獲取有價(jià)值的url,得到url后通常需要將其抓取下來做后續(xù)的處理,如果量小可以使用curl庫或者wget直接搞定,這里面臨兩個(gè)比較大的問題:
速度如果控制不好會(huì)導(dǎo)致被目標(biāo)站點(diǎn)封禁;
wget或者直接構(gòu)造http請求只能獲取到靜態(tài)頁面,對于動(dòng)態(tài)頁面只能獲取到原始的一些js代碼。
為此,我們需要一種爬蟲引擎能夠優(yōu)雅、柔性的抓取,同時(shí)盡可能模擬瀏覽器的行為,使得抓取的結(jié)果能盡可能的完整。對于問題1可以有兩種辦法:
有效的壓力控制,這里的壓力是指單位時(shí)間內(nèi)對目標(biāo)站點(diǎn)的訪問量,一是壓力的計(jì)算需要根據(jù)對方站點(diǎn)規(guī)模(參考alexa排名)、pv量以及當(dāng)前爬蟲的規(guī)模做一個(gè)適當(dāng)?shù)挠?jì)算,同時(shí)可以根據(jù)不同時(shí)間段做合適的調(diào)整,例如晚上通常目標(biāo)網(wǎng)站的pv小我們可以適當(dāng)提高我們抓取壓力;
提高出口代理,盡量復(fù)用出口ip,由于外網(wǎng)ip的資源非常珍貴,需要提高出口ip的管理,按照運(yùn)營商、地域、ip段進(jìn)行分散管理,同時(shí)可以從外網(wǎng)獲取一些公用的代理地址做補(bǔ)充。
對于問題2,則通常需要模擬瀏覽器的行為,研究瀏覽器js的解析、運(yùn)行的一些行為,通??梢匝芯縲ebkit做一些ajax異步拉取的填充,使得抓取的頁面盡可能的和瀏覽器中訪問看到的一致,這里并不展開webkit引擎的開發(fā)使用。
在回答了前面這兩個(gè)問題后,介紹我們目前爬蟲引擎的一個(gè)基本結(jié)構(gòu),主要由以下幾部分組成:
access:接入模塊,主要用于屏蔽多業(yè)務(wù)入口,在這里主要做屏蔽多業(yè)務(wù)入口,對外屏蔽后臺(tái)各種處理邏輯,同時(shí)將url歸一化后按照子域hash到對應(yīng)的lcs模塊中處理;
dns server和robots server:主要是存放請求dns解析的結(jié)果和robots解析的結(jié)果,采用key-value 的存儲(chǔ)方式加上LRU淘汰策略,另外后臺(tái)有邏輯定期更新。
lcs:引擎核心控制模塊,控制了url下發(fā)的速度,lcs在收到請求后會(huì)先請求dns和robots,用以獲得目標(biāo)網(wǎng)站ip以及是否在robots范圍內(nèi)允許下載,對允許下載的url送入到排隊(duì)隊(duì)列中進(jìn)行排隊(duì),同時(shí)對上游access發(fā)送的超額url做過載截?cái)?,使得系統(tǒng)滿足壓力控制,同時(shí)在這里對排隊(duì)長度做一定的控制,降低排隊(duì)時(shí)長,使得系統(tǒng)可以盡量的滿足實(shí)時(shí)抓取的需求。
cs:純粹的抓取模塊,負(fù)責(zé)處理抓取中存在的各種問題,例如死鏈、跳轉(zhuǎn)、壓縮解壓、chunck接受等問題,同時(shí)帶有webkit的解析引擎會(huì)負(fù)責(zé)模擬瀏覽器行為對動(dòng)態(tài)頁面做解析抓取。
主控master:負(fù)責(zé)各個(gè)模塊心跳檢測,配置下發(fā)等一些控制模塊,整個(gè)系統(tǒng)是一個(gè)完全無狀態(tài)設(shè)計(jì),盡量多邏輯做簡單,除了一些系統(tǒng)內(nèi)必備的重試之外其余的出錯(cuò)盡量在上層做重試。
四.數(shù)據(jù)抽取
有了抓取的數(shù)據(jù)之后需要對原始網(wǎng)頁中的信息進(jìn)行有效信息的加工提取,源于部門多年技術(shù)積累,我們對爬取的數(shù)據(jù)可以做兩類抽?。?/div>
1.基于機(jī)器學(xué)習(xí)+規(guī)則實(shí)現(xiàn)的通用抽取方案,該方案通過預(yù)處理、Dom建樹和css渲染等過程先對html進(jìn)行dom解析,之后根據(jù)事先訓(xùn)練好的模型對網(wǎng)頁進(jìn)行分型操作,例如識別出新聞、論壇、小說等網(wǎng)頁結(jié)構(gòu),最后根據(jù)文本長度、文本位置、標(biāo)簽名稱等特征對網(wǎng)頁進(jìn)行分塊抽取得到相關(guān)的信息。該方法是一個(gè)通用的解決方案,主要能夠?qū)崿F(xiàn)標(biāo)題、正文抽取,網(wǎng)頁結(jié)構(gòu)分類等一些基礎(chǔ)的抽取需求。對于一般常見的抽取服務(wù)即可滿足需求。
2.基于url模板的結(jié)構(gòu)化抽取方案,前面基于機(jī)器學(xué)習(xí)的方案只能滿足通用的、相對粗糙的信息提取,無法對精準(zhǔn)的字段做抽取。為此我們提供一種精確到字段的結(jié)構(gòu)化抽取的方法,該方法的主要思路是事先配置好需要抽取內(nèi)容的模版(模版可以是正則表達(dá)式或XPATH),然后基于html進(jìn)行精確的模版匹配,最后將匹配結(jié)果輸出即可。這里主要的難點(diǎn)在于xpath的配置的便捷性以及后續(xù)一些噪音的處理過程,這里不再展開贅述。
五.數(shù)據(jù)更新
通過前面的步驟我們可以完成數(shù)據(jù)的發(fā)現(xiàn)、抓取到入庫,通常這個(gè)時(shí)候已經(jīng)可以滿足使用需求,但是對于影視類、知識類等數(shù)據(jù)常常是在更新變化的,對于此類數(shù)據(jù)為了保證數(shù)據(jù)的時(shí)新性、權(quán)威性需要進(jìn)行不斷的更新。更新的難點(diǎn)通常還是由于庫內(nèi)的數(shù)量巨大,如果需要全量短時(shí)間內(nèi)更新的話在現(xiàn)有的資源規(guī)?;旧想y以實(shí)現(xiàn),通常主流的辦法都是按照一定的策略做選取,選取出候選更新集做更新,之后再同步到全量數(shù)據(jù)集合中。
選取策略通常需要結(jié)合不同的業(yè)務(wù)特性做不同的策略。以視頻為例,通常視頻的劇集更新都是在一定的時(shí)間范圍,國產(chǎn)劇集一般是每天凌晨24點(diǎn),美劇則是周一周二,綜藝則是周六周日。為此每次新抓取的數(shù)據(jù)都記錄一個(gè)更新時(shí)間,通過分析庫內(nèi)連續(xù)劇集更新時(shí)間我們可以推斷出下一次更新的時(shí)間,那么我們可以經(jīng)過一輪大的選取,從全量數(shù)據(jù)中選取出當(dāng)天可能會(huì)更新的數(shù)據(jù),對這一批量小的數(shù)據(jù)進(jìn)行更新。
另外對于一些劇集,各大視頻播放網(wǎng)站正在熱播的數(shù)據(jù)則需要做到分鐘級別的更新,一般這種量比較小,但是由于熱度很高,所以其更新頻率需要做到更高,為此對于榜單數(shù)據(jù),我們通過分析抓取各垂直站點(diǎn)的熱門榜單及分析微博數(shù)據(jù),得到熱門資源列表。
更新則主要是體現(xiàn)在兩個(gè)方面:一是頁面發(fā)生變化,例如字段發(fā)生更新等情況;二是頁面失效,變成死鏈。頁面變化更新通常例如電視劇追劇、app應(yīng)用版本的升級相應(yīng)的內(nèi)容發(fā)生變化。一般這里重新走一遍之前結(jié)構(gòu)化抽取的流程即可。對于頁面失效、死鏈這種可以從頁面展現(xiàn)形態(tài)區(qū)分為頁面級死鏈和內(nèi)容級死鏈。頁面級死鏈可以通過http返回碼404直接識別。對于內(nèi)容級死鏈我們通常有兩個(gè)步驟同步進(jìn)行驗(yàn)證:
死鏈特征提取,通過分析出死鏈樣本學(xué)習(xí)出一定死鏈特征模型
競品交叉驗(yàn)證,例如古劍奇譚如果檢測到風(fēng)行這個(gè)站點(diǎn)死鏈,那么可以到風(fēng)行、soku、百度這些視頻站點(diǎn)進(jìn)行搜索比對,做一次競品間的比對。
通過前面這兩個(gè)步驟基本可以完成一輪失效檢測。為了進(jìn)一步修正模型,提高失效置信度,我們外加了一層人工抽樣審核,并且將結(jié)果反饋到模型中,指導(dǎo)下一輪迭代運(yùn)行。
六.篩選總結(jié)
總的來說,對于一個(gè)垂直的數(shù)據(jù)獲取平臺(tái)我們構(gòu)建了如下的一個(gè)流程,主要分為下載發(fā)現(xiàn)、離線存儲(chǔ)、抽取清洗三大塊。調(diào)度發(fā)現(xiàn)包括了前面提到的頁面發(fā)現(xiàn)、
數(shù)據(jù)抓取、壓力控制等內(nèi)容,抓取后的數(shù)據(jù)主要由tbase、cfs等存儲(chǔ)介質(zhì)進(jìn)行存儲(chǔ),之后我們有一套結(jié)構(gòu)化抽取平臺(tái)和通用抽取平臺(tái)對數(shù)據(jù)進(jìn)行規(guī)整、關(guān)聯(lián)聚合形成獨(dú)立供業(yè)務(wù)使用的結(jié)構(gòu)化數(shù)據(jù)。