大資料開源輿情分析系統-資料採集技術架構淺析

語言: CN / TW / HK

輿情繫統 中資料採集是一個關鍵部分,此部分核心技術雖然由爬蟲技術框架構建,但抓取海量的網際網路資料絕不是靠一兩個爬蟲程式能搞定,特別是抓取大量網站的情況下,每天有大量網站的狀態和樣式發生變化以後,爬蟲程式能快速的反應和維護。

一旦分散式的爬蟲規模大了以後會出現很多問題,都是種種技術挑戰,會有很多門檻,例如:

1.檢測出你是爬蟲,拉黑你IP(人家究竟是通過你的ua、行為特則還是別的檢測出你是爬蟲的?你怎麼規避?)

2人家給你返回髒資料,你怎麼辨認?

3對方被你爬死,你怎麼設計排程規則?

4要求你一天爬完10000w資料,你一臺機器頻寬有限,你如何用分散式的方式來提高效率?

5資料爬回來,要不要清洗?對方的髒資料會不會把原有的資料弄髒?

6對方的部分資料沒有更新,這些未更新的你也要重新下載嗎?怎麼識別?怎麼優化你的規則?

7資料太多,一個數據庫放不下,要不要分庫?

8對方資料是JavaScript渲染,那你怎麼抓?要不要上PhantomJS?

9對方返回的資料是加密的,你怎麼解密?

10對方有驗證碼,你怎麼破解?

11對方有個APP,你怎麼去得到人家的資料介面?

12資料爬回來,你怎麼展示?怎麼視覺化?怎麼利用?怎麼發揮價值?

13等等...

在大規模網際網路資料採集時,必須要構建一個完整的資料採集系統。否則,你的專案開發效率和資料採集效率會很低下。同時,還會很多讓你意想不到的問題發生。

開源輿情繫統

專案地址:https://gitee.com/stonedtx/yuqing

線上體驗系統

開源技術棧

  • 開發平臺:Java EE & SpringBoot
  • 爬蟲框架:Spider-flow & WebMagic & HttpClient
  • APP爬蟲:Xposed框架
  • URL倉庫:Redis
  • web應用伺服器:Nginx&Tomcat
  • 資料處理和儲存任務傳送:Kafka&Zookeeper
  • 抓取任務傳送:RabbitMQ
  • 配置管理:MySQL
  • 前端展示:Bootstrap & VUE

總體架構

輸入圖片說明 (這是最早期系統架構圖)

資料處理流程

輸入圖片說明 (這是最早期系統設計圖)

信源管理

信源,資訊來源的簡稱。\ \ 我們需要對採集 型別,內容,平臺,地區 等多種屬性進行管理。我們對此開發了三代信源管理平臺。

一代產品形態

輸入圖片說明

二代產品形態

輸入圖片說明

三代產品形態

輸入圖片說明

站點畫像

採用模擬瀏覽器請求技術實現深度和廣度抓取演算法,總體分3個環節,對整個站點進行 1)全站掃描、2)資料儲存、3)特性分析。

  • siteMeta\ 識別整個網站的結構,並且解析儲存,給每一個抓取的網站都建立一個“小檔案”庫。\  

  • siteIndex\ 在識別基礎上把所有網頁都預儲存下來,並且提取各種特徵值進行分析計算,從站點目錄,到站點欄目,以及每個抓取目標頁面都會標記不同的特性引數。\  

  • siteFeatures\ 最後將整體分析演算的結果,還原成這個網站的抓取畫像和特性,以便於機器將會知道採用哪種抓取策略自動去匹配這個網站的特性抓取,基於這樣的設計可以實現大規模資料採集無人值守的效果,也就是百度、谷歌 這些大型搜尋引擎實現的資料效果。

    用“探頭機器人”對整個網站預抓取一遍,相當於一個先頭部隊,把抓取網站的情況搞清楚以後,很快機器就知道採取哪種採集策略,大量需要採集的網站,只有極小的部分需要人工干預採集,而且更不需要編寫一行爬蟲採集程式碼,完全是自動化及低程式碼化大規模資料採集。

資料抓取

  • 自動抓取\ 有了網站的畫像屬性,就知道匹配那種採集抓取策略了,大部分網站就能自動抓取就自動識別抓取資料,無需人工干預。
  • 人工配置\ 有的網站抓取難度大,採用視覺化技術將整個站點的標籤提取出來給開發工程師,他們將可以快速的對網站的抓取進行配置。 我們在採集任何一個網站的時候將會有各種“探頭”對網站的結構,廣告位,關鍵性內容,導航欄,分頁,列表,站點特性,站點資料量,抓取難易度,站點更新頻率,等等。

  • 採集模板\ 為了簡化人工操作,提高工作效率,我們還提供了爬蟲模板。爬蟲模板的意義在於,使用者遇到一個配置繁瑣的站點,不用從頭開始,只需要到爬蟲模板庫裡面找類似的模板即可,如圖所示: 輸入圖片說明

資料暫存

  • 暫存\ 如果把資料直接儲存到系統大資料庫裡,一旦有大量採集的髒資料下來就是浪費時間和精力,所有資料都會預演儲存一遍,儲存完成後會有程式對此核對監測,以免資料欄位漏存,錯存。
  • 預警\ 如果在暫存環節發現儲存錯誤,將會及時通過郵件傳送對研發工程師提醒,告知錯誤內容,讓其對此修正。

低程式碼開發

  • 配置\ 目前的爬蟲工廠已經一個低程式碼化開發的平臺了,更準確的說,我們不是在上面開發,而且在上面進行爬蟲配置對資料採集抓取。如圖所示: 輸入圖片說明
  • 維護\ 通過低程式碼的方式的開發,我們對爬蟲的維護更加方便,只需要在web管理介面中,修改爬蟲抓取配置即可,同時還可以線上除錯,檢視具體的抓取錯誤日誌。否則某一個站點抓取出現問題,都不知道是哪臺伺服器上的哪個爬蟲抓取錯誤。各種站點爬蟲的量一旦大起來,維護成本極高。 輸入圖片說明

分散式採集

  • 控制器(master)

    爬蟲工廠有一個web控制管理後臺,開發者可以在上面新增需要採集的任務計劃和資料採集抓取的規則策略,控制器只對採集任務下發抓取指令,不做任何抓取操作。

  • 分發器(dispatch)

    控制器(master)通過rabbitMQ訊息將抓取的任務下發給任何一臺執行端, 訊息中包含抓取的策略指令及採集目標,分發器只管傳送指令和策略。

  • 執行器 (downloader)

    執行端可以部署在全世界任何一臺能連線網際網路的機器上,只要這臺機器能上網,能接受分發器下發的採集任務 就能把資料採集下來,同時把採集的資料回傳給中央資料倉庫。  

    爬蟲管理

  • 爬蟲狀態

    爬蟲分散式在很多臺伺服器上,不知道在哪個伺服器上的哪個爬蟲程式出了問題是很痛苦的事情,甚至抓取資料量猛增導致伺服器掛掉都不知道。所以,需要能對伺服器監控,對伺服器上每一個爬蟲程式進行監控。監控每個爬蟲執行是否正常,監控每個執行爬蟲的伺服器是否正常。

  • 採集狀態

    抓取的站點時常發生變化,我們就需要知道每個目標採集的站點抓取的資料是否都正常的採集下來了,通過給每個爬蟲編上採集任務編號,展示在web介面上,就可以直觀的看見資料採集下來的效果。通過郵件告警和每天傳送郵件統計資料,可以實時對採集狀態進行監控。

採集分類

  • 網站採集

    一般採取兩種模式,直接http請求檢視HTML程式碼;另一種是模擬瀏覽器技術,把請求的JS渲染結果還原成HTML程式碼,找到HTML標籤和URL路徑進行抓取。

  • 公眾號採集

    目前基本上就兩個路徑:通過搜狗微信 和 通過公眾號管理後臺。但是這兩個都封的實在太厲害了,經過多種嘗試採用RPA的模式模擬請求人工的操作+代理IP地址,對公眾號資料抓取。但是同時需要有大量的微信公眾號,因為,這種抓取方法是根據公眾號的號進行採集的,沒有公眾號就不知道抓取的目標。

  • app 採集

    之前採用在開發環境的電腦上搭建一個WIFI共享讓手機APP連線電腦就能看見傳輸的資料了。目前app的資料採集代價越來越高,上檔次的APP幾乎沒有不加密的。所以,採用Xposed框架對資料採集是最穩定的採集方案了。

反爬策略

  • 模擬請求頭

    專門有一個數據表記錄儲存及更新各種瀏覽器請求的模擬請求頭,例如:Host、Connection、Accept、User-Agent、Referrer、Accept-Encoding、Accept-Language 等各種組合請求頭引數。

  • 代理IP池

    光是有代理IP是不夠的,一般穩定的ip池都很貴,而且代理IP資源對於需要採集的資料來源來說永遠是匱乏的。換句話說,就需要能充分的利用好代理IP資源。主要實現兩大功能:1)實時檢查代理IP的有效性,拋棄無效的IP,提高爬蟲 請求效率。2) IP_1抓取過 A_網站被封掉了,但是不代表IP_1馬上抓取 B_網站和N_網站也會被封掉,這樣就充分的利用了代理IP。

採集日誌

  • 日誌收集

    系統採用了一臺獨立強勁的伺服器專門做日誌處理的伺服器。這臺伺服器收集來自四面八方爬蟲執行端和各個不同電信機房傳輸過來的錯誤日誌資訊。每個應用程式通過logback的kafak外掛,寫入訊息佇列,再批量寫入專門的 Elasticsearch 日誌分析伺服器。

  • 跟蹤ID

    為了能更加有效對問題排查,我們從抓取請求開始到資料儲存完畢。系統就給每個作業打上了唯一的日誌標號,這樣的話,無論中間出了什麼問題,上一步做了什麼操作,執行了什麼程式,都能有效的跟蹤和追溯。

  • 日誌分析

    通過資料分析能看出目前哪類採集的資料有問題,當天或者這段時間內大面積的問題主要集中在什麼地方,以及具體是哪些網站出了問題,這些抓取出問題的網站是不是重點關注的物件,等等。從面到點的去分析問題。

資料解析

  • 自動解析

    自動解析主要是用於資訊、招標、招聘,系統採用文字密度演算法實現。因為這3個型別的資料雖然大致相同,但是網站多了以後還是千差萬別。如果依靠人工的方式一個個配置或者編寫程式碼,將會是一場災難。

  • 手動解析

    只有在機器無法自動識別的情況下,採用人工配置,將網頁上的欄位一一對應的填寫到低程式碼爬蟲開發平臺。