【文智背後的奧祕】系列篇——海量數據抓取

版權聲明:本文由文智原創文章,轉載請註明出處: 
文章原文連接:https://www.qcloud.com/community/article/138css

來源:騰雲閣 https://www.qcloud.com/communityhtml

 

大數據已是個很是熱門的話題,文智平臺正是基於大數據的背景,利用並行計算系統和分佈式爬蟲系統,結合獨特的語義分析技術, 一站式知足用戶NLP、轉碼、抽取、全網數據抓取等中文語義分析需求的開放平臺。現有的研究、工程應用方向基本上都是圍繞着大數據的存儲、計算等方面展開,可是對於一個基礎環節——數據獲取卻不多有相關的介紹。本文重點圍繞如何獲取垂直海量數據展開討論。web

一.引言

數據的做用不言而喻,在各行各業中,分門別類的數據爲用戶的在線生活體驗提供了基本的素材,附近的餐館、即將上映的電影、最近熱門新聞等等可以涵蓋咱們生活的方方面面。同時全部的這一切也成就了今天在各個垂直領域諸如大衆點評、豆瓣、今日頭條等專業的公司。具體到搜索業務來講,不管是多麼優秀的架構、精準的算法,最終也是須要依賴完備、準確、及時的數據做爲落地基礎。ajax

從搜索業務來看,數據的價值主要體如今以下幾個方面:正則表達式

  1. 直接提供搜索數據源。海量的數據爲檢索提供了必不可少的素材。爲此數據工做的一個基本目標是數據完備性。完備性能夠從兩方面來理解,一方面是實體自己的完備,是0和1的關係,這是剛性需求,例如你搜索《來自星星的你》,若是沒有這部片子,那麼結果顯然不能知足用戶需求;另外一方面是實體內部信息的完備,例如《來自星星的你》若是缺乏了演員字段,那麼你搜索「金秀賢」的時候可能依然得不到想要的結果。另外要提的一點是完備性一般還對時間有約束,熱點資訊、突發事件等若是不能在第一時間呈現,那麼對於用戶來講都是個硬傷。算法

  2. 改善相關性質量。乾淨、精確的數據可使得在相關性計算階段減小歧義,改善召回品質,互聯網中的數據魚龍混雜,各個網站的水平也是參差不齊,不作去噪直接使用的話每每會拔苗助長。經過高質量的數據補充,對最終結果的排序也有良好的輔助做用。例如豆瓣的影評分數、熱度因子能夠在視頻搜索中輔助結果排序,而且能夠改善數據剛上架時因爲點擊量缺失形成排序上不來這種冷啓動的過程。瀏覽器

  3. 豐富搜索產品特性,知足搜索直達需求。當數據完備、及時、準確以後就能夠對數據作關聯聚合,在這個時候超越文本自己的各類語義特徵、知識關聯等一些高階應用相繼涌現,你們經常聽到的Google的Knowledge Graph、Facebook的Graph Search以及百度知心搜索等都是創建在這一個基礎之上。將散落在互聯網上碎片化的知識整合起來造成直觀答案顯然是一種更「懂」你的方式。如圖1,搜索王菲老公的體重,知識圖譜搜索能夠直接輸出想要的結果。

    圖一、搜狗知識圖譜搜索結果架構

整體而言,數據獲取工做主要圍繞快、準、全三個要素以及一個高階的關聯需求展開。本文重點分析數據如何發現、抓取、更新等方面作一個介紹。app

二.數據發現

互聯網中的數據參差不齊,如何從紛繁複雜的互聯網中發現有價值的數據是一個有趣的問題。一般數據發現的過程當中存在幾個難點:dom

  1. 數據海量,沒法遍歷窮舉;

  2. 魚龍混雜,須要甄別出高價值的數據;

  3. 存在死鏈、無效參數、做弊、陷阱等頁面使得數據獲取的過程當中存在各類坑。

問題3這裏咱們須要結合不一樣的場景作一些不一樣的策略,通常在目標對象很清晰的狀況下能夠經過人工手段作一些規避,所以這裏不展開討論。咱們重點討論1和2這種海量網頁中發現高價值數據的問題,有了這個清晰的目標後,接下來就轉換爲另外兩個問題:

  1. 從哪一個網站獲取?

  2. 如何獲得這個網站內有價值的連接?

問題1:如何獲取有效站點?一般有下面幾個辦法:

  1. 垂直榜單數據,通常領域內的熱門站點都會存在於各大垂直榜單數據中,以視頻站點爲例,能夠監控相似www.hao123.com上的垂直分類數據作提取收集

    圖2.垂直榜單數據
  2. 關鍵字提取,一般能夠利用關鍵字到綜合搜索引擎(google、百度等)中獲取。這裏有個問題就是關鍵字如何獲取,一方面能夠垂直引擎中的零結果的關鍵字或者其餘低CTR關鍵字,另外一方面能夠利用已經積累的數據構造,例如想要獲取音樂鈴聲類的站點,能夠以「最炫民族風 鈴聲」構造出特定特徵的關鍵字。

    圖三、關鍵字獲取
  3. 同類垂直綜合站點中爬取,以獲取新聞站點爲例,能夠到http://news.baidu.com中將其中的連接抽取匯聚成特定的一些站點。

    圖四、綜合類站點頁面

問題2:如何從網站內獲得高價值的連接呢?

通常的url都有一些顯著特徵,一般能夠利用前面的方法2,利用大量的query到綜合搜索引擎中作site檢索獲取大量同站點內url,這裏基於一個假設就是搜索引擎能召回的數據都是億萬連接中儘可能有價值的展示給用戶,召回的結果已經融合了用戶點擊、數據自己質量、站點權威等因子在這裏,是一個綜合權威的結果。獲得同站點url後咱們能夠分析其特徵,對於一些顯著特徵佔比的url能夠認爲是高價值連接的特徵,例如百度百科http://baike.baidu.com/subview/(d+)/(d+).htmhttp://baike.baidu.com/view/(d+).htm 相似這種特殊的片斷。在獲得高質量的特徵的url後能夠對庫內已經抓取的數據作連接分析,反轉父鏈子鏈關係匯聚出一些能產生高價值數據的父鏈做爲種子持續發現高價值數據。圖5展現了經過庫內連接關係能夠分析出http://news.163.com/latest/做爲一個高質量種子頁持續發現高價值數據。

圖五、高質量種子頁面

3、數據抓取

前面咱們介紹瞭如何獲取有價值的url,獲得url後一般須要將其抓取下來作後續的處理,若是量小可使用curl庫或者wget直接搞定,這裏面臨兩個比較大的問題:

  1. 速度若是控制很差會致使被目標站點封禁;
  2. wget或者直接構造http請求只能獲取到靜態頁面,對於動態頁面只能獲取到原始的一些js代碼。

爲此,咱們須要一種爬蟲引擎可以優雅、柔性的抓取,同時儘量模擬瀏覽器的行爲,使得抓取的結果能儘量的完整。對於問題1能夠有兩種辦法:

  1. 有效的壓力控制,這裏的壓力是指單位時間內對目標站點的訪問量,一是壓力的計算須要根據對方站點規模(參考alexa排名)、pv量以及當前爬蟲的規模作一個適當的計算,同時能夠根據不一樣時間段作合適的調整,例如晚上一般目標網站的pv小咱們能夠適當提升咱們抓取壓力;

  2. 提升出口代理,儘可能複用出口ip,因爲外網ip的資源很是珍貴,須要提升出口ip的管理,按照運營商、地域、ip段進行分散管理,同時能夠從外網獲取一些公用的代理地址作補充。

對於問題2,則一般須要模擬瀏覽器的行爲,研究瀏覽器js的解析、運行的一些行爲,一般能夠研究webkit作一些ajax異步拉取的填充,使得抓取的頁面儘量的和瀏覽器中訪問看到的一致,這裏並不展開webkit引擎的開發使用。

在回答了前面這兩個問題後,介紹咱們目前爬蟲引擎的一個基本結構,主要由如下幾部分組成:

  1. access:接入模塊,主要用於屏蔽多業務入口,在這裏主要作屏蔽多業務入口,對外屏蔽後臺各類處理邏輯,同時將url歸一化後按照子域hash到對應的lcs模塊中處理;

  2. dns server和robots server:主要是存放請求dns解析的結果和robots解析的結果,採用key-value 的存儲方式加上LRU淘汰策略,另外後臺有邏輯按期更新。

  3. lcs:引擎核心控制模塊,控制了url下發的速度,lcs在收到請求後會先請求dns和robots,用以得到目標網站ip以及是否在robots範圍內容許下載,對容許下載的url送入到排隊隊列中進行排隊,同時對上游access發送的超額url作過載截斷,使得系統知足壓力控制,同時在這裏對排隊長度作必定的控制,下降排隊時長,使得系統能夠儘可能的知足實時抓取的需求。

  4. cs:純粹的抓取模塊,負責處理抓取中存在的各類問題,例如死鏈、跳轉、壓縮解壓、chunck接受等問題,同時帶有webkit的解析引擎會負責模擬瀏覽器行爲對動態頁面作解析抓取。

  5. 主控master:負責各個模塊心跳檢測,配置下發等一些控制模塊

整個系統是一個徹底無狀態設計,儘可能多邏輯作簡單,除了一些系統內必備的重試以外其他的出錯儘可能在上層作重試。

圖六、爬蟲引擎結構

四.數據抽取

有了抓取的數據以後須要對原始網頁中的信息進行有效信息的加工提取,源於部門多年技術積累,咱們對爬取的數據能夠作兩類抽取:

1.基於機器學習+規則實現的通用抽取方案,該方案經過預處理、Dom建樹和css渲染等過程先對html進行dom解析,以後根據事先訓練好的模型對網頁進行分型操做,例如識別出新聞、論壇、小說等網頁結構,最後根據文本長度、文本位置、標籤名稱等特徵對網頁進行分塊抽取獲得相關的信息。該方法是一個通用的解決方案,主要可以實現標題、正文抽取,網頁結構分類等一些基礎的抽取需求。對於通常常見的抽取服務便可知足需求。

圖七、通用抽取部分抽取結果

2.基於url模板的結構化抽取方案,前面基於機器學習的方案只能知足通用的、相對粗糙的信息提取,沒法對精準的字段作抽取。爲此咱們提供一種精確到字段的結構化抽取的方法,該方法的主要思路是事先配置好須要抽取內容的模版(模版能夠是正則表達式或XPATH),而後基於html進行精確的模版匹配,最後將匹配結果輸出便可。這裏主要的難點在於xpath的配置的便捷性以及後續一些噪音的處理過程,這裏再也不展開贅述。

圖八、結構化抽取結果

五.數據更新

經過前面的步驟咱們能夠完成數據的發現、抓取到入庫,一般這個時候已經能夠知足使用需求,可是對於影視類、知識類等數據經常是在更新變化的,對於此類數據爲了保證數據的時新性、權威性須要進行不斷的更新。更新的難點一般仍是因爲庫內的數量巨大,若是須要全量短期內更新的話在現有的資源規模基本上難以實現,一般主流的辦法都是按照必定的策略作選取,選取出候選更新集作更新,以後再同步到全量數據集合中。

圖九、數據更新

選取策略一般須要結合不一樣的業務特性作不一樣的策略。以視頻爲例,一般視頻的劇集更新都是在必定的時間範圍,國產劇集通常是天天凌晨24點,美劇則是週一週二,綜藝則是週六週日。爲此每次新抓取的數據都記錄一個更新時間,經過分析庫內連續劇集更新時間咱們能夠推斷出下一次更新的時間,那麼咱們能夠通過一輪大的選取,從全量數據中選取出當天可能會更新的數據,對這一批量小的數據進行更新。

圖十、視頻更新策略

另外對於一些劇集,各大視頻播放網站正在熱播的數據則須要作到分鐘級別的更新,通常這種量比較小,可是因爲熱度很高,因此其更新頻率須要作到更高,爲此對於榜單數據,咱們經過分析抓取各垂直站點的熱門榜單及分析微博數據,獲得熱門資源列表。

圖十一、榜單數據

更新則主要是體如今兩個方面:一是頁面發生變化,例如字段發生更新等狀況;二是頁面失效,變成死鏈。頁面變化更新一般例如電視劇追劇、app應用版本的升級相應的內容發生變化。通常這裏從新走一遍以前結構化抽取的流程便可。對於頁面失效、死鏈這種能夠從頁面展示形態區分爲頁面級死鏈和內容級死鏈。頁面級死鏈能夠經過http返回碼404直接識別。對於內容級死鏈咱們一般有兩個步驟同步進行驗證:

  1. 死鏈特徵提取,經過分析出死鏈樣本學習出必定死鏈特徵模型
  2. 競品交叉驗證,例如古劍奇譚若是檢測到風行這個站點死鏈,那麼能夠到風行、soku、百度這些視頻站點進行搜索比對,作一次競品間的比對。

經過前面這兩個步驟基本能夠完成一輪失效檢測。爲了進一步修正模型,提升失效置信度,咱們外加了一層人工抽樣審覈,而且將結果反饋到模型中,指導下一輪迭代運行。

圖十二、失效檢測

六.總結

整體而言,對於一個垂直的數據獲取平臺咱們構建了以下的一個流程,主要分爲下載發現、離線存儲、抽取清洗三大塊。調度發現包括了前面提到的頁面發現、數據抓取、壓力控制等內容,抓取後的數據主要由tbase、cfs等存儲介質進行存儲,以後咱們有一套結構化抽取平臺和通用抽取平臺對數據進行規整、關聯聚合造成獨立供業務使用的結構化數據。

圖1三、垂直數據獲取流程

數據抓取平臺是咱們一個基礎平臺,後續咱們也會開放出相應的服務,而且持續對體驗作優化,但願咱們的服務可以更普遍的應用,爲業務提供更大的價值。

相關文章
相關標籤/搜索