網路爬蟲詳細設計方案

虛懷若谷FM發表於2018-08-17

目錄

網路爬蟲設計方案

1、網路爬蟲簡介

2、Java爬蟲的開發和使用流程

2.1 下載

2.2 分析

3、單點登陸與Jsoup解析

3.1 單點登陸簡介

3.1.1 登陸

3.1.2 登出

3.2 Jsoup網頁解析

4、網路爬蟲詳細設計

4.1 業務流程圖

4.2 業務流程

4.2.1 模擬登陸服務

4.2.2 資料服務

4.2.3 解析服務

4.3 tomcat監控

5、檢視層詳細設計

5.1 開發工具與框架

5.2 開發流程

6、總結


 

 

網路爬蟲設計方案

1、網路爬蟲簡介

網頁爬蟲,是一種按照一定的規則,自動地抓取全球資訊網資訊的程式或者指令碼;其使用場景極其廣泛,各大搜尋引擎(如百度,谷歌,Bing)中都有他們的身影。網路爬蟲按照系統結構和實現技術,大致分為以下幾種型別:通用網路爬蟲,聚焦網路爬蟲,增量式網路爬蟲,深層網路爬蟲。

2、Java爬蟲的開發和使用流程

2.1 下載

(1)選擇並使用網路工具包(例如HttpClient)下載指定url的網頁原始碼

(2)使用get/post的方式提交請求

(3)設定請求的headers引數

(4)置請求的cookies引數

(5)設定請求的query/formData引數

(6)使用代理IP

(7)分析目的請求的各種必要引數的來源

(8)對於分析和解決成本過大的請求,可以使用模擬瀏覽器進行下載(推薦無介面瀏覽器phantomjs+selenium)

2.2 分析

(1)對於Html形式的文字,使用Jsoup等工具包解析;

(2)對於json格式的文字,使用Gson等工具包解析;

(3)對於沒有固定格式,無法用特定工具解析的文字,使用正規表示式工具獲取目標資料。

3、單點登陸與Jsoup解析

河南的應用場景與吉林的應用場景基本相似,都是訪問第三方門戶系統,根據相應需求抓取相關網頁資料。依據吉林的開發情況,河南開發也需要有單點登陸與使用Jsoup進行頁面解析重要的兩個部分。目前單點登陸有兩套方案,吉林前期使用的單點登陸方案使用過程需要進行相關引數的修改,後期使用的單點登陸方案操作起來比較方便,但業務邏輯相對複雜一點,這個在河南部署的時候綜合考慮。

3.1 單點登陸簡介

單點登入全稱Single Sign On(以下簡稱SSO),是指在多系統應用群中登入一個系統,便可在其他所有系統中得到授權而無需再次登入,包括單點登入與單點登出兩部分。

3.1.1 登陸

相比於單系統登入,sso需要一個獨立的認證中心,只有認證中心能接受使用者的使用者名稱密碼等安全資訊,其他系統不提供登入入口,只接受認證中心的間接授權。間接授權通過令牌實現,sso認證中心驗證使用者的使用者名稱密碼沒問題,建立授權令牌,在接下來的跳轉過程中,授權令牌作為引數傳送給各個子系統,子系統拿到令牌,即得到了授權,可以藉此建立區域性會話,區域性會話登入方式與單系統的登入方式相同。如圖示:

  1. 使用者訪問系統1的受保護資源,系統1發現使用者未登入,跳轉至sso認證中心,並將自己的地址作為引數
  2. sso認證中心發現使用者未登入,將使用者引導至登入頁面
  3. 使用者輸入使用者名稱密碼提交登入申請
  4. sso認證中心校驗使用者資訊,建立使用者與sso認證中心之間的會話,稱為全域性會話,同時建立授權令牌
  5. sso認證中心帶著令牌跳轉會最初的請求地址(系統1)
  6. 系統1拿到令牌,去sso認證中心校驗令牌是否有效
  7. sso認證中心校驗令牌,返回有效,註冊系統1
  8. 系統1使用該令牌建立與使用者的會話,稱為區域性會話,返回受保護資源
  9. 使用者訪問系統2的受保護資源
  10. 系統2發現使用者未登入,跳轉至sso認證中心,並將自己的地址作為引數
  11. sso認證中心發現使用者已登入,跳轉回系統2的地址,並附上令牌
  12. 系統2拿到令牌,去sso認證中心校驗令牌是否有效
  13. sso認證中心校驗令牌,返回有效,註冊系統2
  14. 系統2使用該令牌建立與使用者的區域性會話,返回受保護資源

使用者登入成功後,會與sso認證中心及各個子系統建立會話,使用者與sso認證中心建立的會話稱為全域性會話,使用者與各個子系統建立的會話稱為區域性會話,區域性會話建立之後,使用者訪問子系統受保護資源將不再通過sso認證中心,全域性會話與區域性會話有如下約束關係:

  1. 區域性會話存在,全域性會話一定存在
  2. 全域性會話存在,區域性會話不一定存在
  3. 全域性會話銷燬,區域性會話必須銷燬

3.1.2 登出

單點登入自然也要單點登出,在一個子系統中登出,所有子系統的會話都將被銷燬,用下面的圖來說明:

sso認證中心一直監聽全域性會話的狀態,一旦全域性會話銷燬,監聽器將通知所有註冊系統執行登出操作。

簡要說明上圖:

  1. 使用者向系統1發起登出請求
  2. 系統1根據使用者與系統1建立的會話id拿到令牌,向sso認證中心發起登出請求
  3. sso認證中心校驗令牌有效,銷燬全域性會話,同時取出所有用此令牌註冊的系統地址
  4. sso認證中心向所有註冊系統發起登出請求
  5. 各註冊系統接收sso認證中心的登出請求,銷燬區域性會話
  6. sso認證中心引導使用者至登入頁面

注:單點登陸目前有兩套系統,其原始碼都將以附件的形式呈送。

3.2 Jsoup網頁解析

Jsoup使用起來比較簡單,有過Jquery使用經歷的會很快上手。使用Jsoup進行頁面解析,其實就是使用選擇器針對大資料量的網頁進行篩選,獲得所需要的資料。

常用選擇器語法如下:

Elements links = doc.select("a[href]"); //帶有href屬性的a元素

Elements pngs = doc.select("img[src$=.png]");//副檔名為.png的圖片

Element masthead = doc.select("div.masthead").first();//class等於masthead的div標籤

Elements resultLinks = doc.select("h3.r > a"); //在h3元素之後的a元素

Selector選擇器概述:

tagname: 通過標籤查詢元素,比如:a

ns|tag: 通過標籤在名稱空間查詢元素,比如:可以用 fb|name 語法來查詢 <fb:name> 元素

#id: 通過ID查詢元素,比如:#logo

.class: 通過class名稱查詢元素,比如:.masthead

[attribute]: 利用屬性查詢元素,比如:[href]

[^attr]: 利用屬性名字首來查詢元素,比如:可以用[^data-] 來查詢帶有HTML5 Dataset屬性的元素

[attr=value]: 利用屬性值來查詢元素,比如:[width=500]

[attr^=value], [attr$=value], [attr*=value]: 利用匹配屬性值開頭、結尾或包含屬性值來查詢元素,比如:[href*=/path/]

[attr~=regex]: 利用屬性值匹配正規表示式來查詢元素,比如: img[src~=(?i)\.(png|jpe?g)]

*: 這個符號將匹配所有元素

4、網路爬蟲詳細設計

4.1 業務流程圖

4.2 業務流程

爬蟲服務可拆分為3個服務:

4.2.1 模擬登陸服務

提供對外介面,使用者傳入使用者名稱、密碼、URL、待訪問系統、返回型別,系統根據返回型別返回HTML程式碼或者Cookie資訊

4.2.2 資料服務

新聞、公告資訊爬取步驟:

  1. tomcat啟動
  2. 爬取新聞資訊和公告資訊
  3. 獲取繫結使用者數,根據繫結使用者數計算使用的執行緒數
  4. 為執行緒分配使用者
  5. 開始爬取,並刪除臨時表資訊
  6. 資料入臨時表
  7. 資料驗證,用於處理爬取失敗的使用者,正式表的資料不刪除
  8. 刪除正式表資料
  9. 臨時表資料同步至正式
  10. 判斷所有執行緒結束後,返回3
  • 需要記錄日誌,直接寫入檔案,記錄內容:啟動時間、執行緒數、使用者數、成功使用者數、成功資料量、失敗使用者數 

4.2.3 解析服務

步驟:

  1. 使用者session資訊判斷,使用者session存在的直接使用session訪問,不存在的登入
  2. 登入至雲門戶
  3. 登入至業務系統
  4. 爬取頁面資訊
  5. 解析頁面
  6. 形成json資料
  • 實時獲得工單列表條目數和工單詳細資訊大致流程與解析服務一致,其實就是多爬取了一次工單列表頁面,不進行入庫處理,實時返回工單列表數量。上述解析服務流程基本可以滿足常見的頁面資料爬取工作,對於涉及互動方面的則需根據具體情況來分析。

4.3 tomcat監控

需要使用shell指令碼對其進行管理,主要有以下兩點:

  1. 每天定時重啟,初步定為凌晨0點
  2. 10分鐘掃描一次tomcat程式,發現掛掉了立即重啟

 

5、檢視層詳細設計

5.1 開發工具與框架

Hbuilder開發平臺, mui框架,jQuery框架

5.2 開發流程

  1. 頁面設計
  2. 靜態頁面 -- 根據畫好的頁面效果圖,寫出靜態頁面,以及部分按鈕的實現。注意 css的編寫 及 後期 頁面 之間引數的傳遞。
  3. 資料解析 -- 從後臺人員處獲取介面,然後js中通過jQuery.ajax({})呼叫介面,通過固定引數測試是否能獲取到資料,注意遮罩及回撥函式。
  4. 資料渲染 -- 根據獲取的資料型別,往頁面填充資料。通過js便利填充 或者用 mui內部外掛引入angular.min.js,通過 $scope賦值。

 

6、總結

使用爬蟲在獲取資料過程中確實提供了方便,在第三方不提供介面的情況下,使用網路爬蟲是一種很好的資料獲取機制。網路網蟲的好處大致有以下幾點:

  • 準確定位,資料獲取方便
  • 資料篩選,精煉海量資訊
  • 資料庫角色扮演者

但是網路爬蟲也存在不少缺點,我們在開發過程中發現使用網路爬蟲其實還是存在很多短板的,不足之處如下:

  1. 不規則網頁處理,頁面結構混亂導致爬蟲程式碼冗餘
  2. 反爬策略,網站反爬策略導致爬取資料失敗
  3. 動態載入網站,抓取動態載入的資料,需要分析大量的原始檔
  4. 大規模,海量資料計算能力與記憶體容量無法形成正比

吉林專案最初使用爬蟲的方式獲取資料,在測試過程中發現資料載入較慢,對於實時抓取的資料顯示的尤為突出。目前該專案已調整開發,計劃使用介面的形式從第三方來進行資料的獲得。

 

相關文章