網路爬蟲詳細設計方案
目錄
網路爬蟲設計方案
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發現使用者未登入,跳轉至sso認證中心,並將自己的地址作為引數
- sso認證中心發現使用者未登入,將使用者引導至登入頁面
- 使用者輸入使用者名稱密碼提交登入申請
- sso認證中心校驗使用者資訊,建立使用者與sso認證中心之間的會話,稱為全域性會話,同時建立授權令牌
- sso認證中心帶著令牌跳轉會最初的請求地址(系統1)
- 系統1拿到令牌,去sso認證中心校驗令牌是否有效
- sso認證中心校驗令牌,返回有效,註冊系統1
- 系統1使用該令牌建立與使用者的會話,稱為區域性會話,返回受保護資源
- 使用者訪問系統2的受保護資源
- 系統2發現使用者未登入,跳轉至sso認證中心,並將自己的地址作為引數
- sso認證中心發現使用者已登入,跳轉回系統2的地址,並附上令牌
- 系統2拿到令牌,去sso認證中心校驗令牌是否有效
- sso認證中心校驗令牌,返回有效,註冊系統2
- 系統2使用該令牌建立與使用者的區域性會話,返回受保護資源
使用者登入成功後,會與sso認證中心及各個子系統建立會話,使用者與sso認證中心建立的會話稱為全域性會話,使用者與各個子系統建立的會話稱為區域性會話,區域性會話建立之後,使用者訪問子系統受保護資源將不再通過sso認證中心,全域性會話與區域性會話有如下約束關係:
- 區域性會話存在,全域性會話一定存在
- 全域性會話存在,區域性會話不一定存在
- 全域性會話銷燬,區域性會話必須銷燬
3.1.2 登出
單點登入自然也要單點登出,在一個子系統中登出,所有子系統的會話都將被銷燬,用下面的圖來說明:
sso認證中心一直監聽全域性會話的狀態,一旦全域性會話銷燬,監聽器將通知所有註冊系統執行登出操作。
簡要說明上圖:
- 使用者向系統1發起登出請求
- 系統1根據使用者與系統1建立的會話id拿到令牌,向sso認證中心發起登出請求
- sso認證中心校驗令牌有效,銷燬全域性會話,同時取出所有用此令牌註冊的系統地址
- sso認證中心向所有註冊系統發起登出請求
- 各註冊系統接收sso認證中心的登出請求,銷燬區域性會話
- 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 資料服務
新聞、公告資訊爬取步驟:
- tomcat啟動
- 爬取新聞資訊和公告資訊
- 獲取繫結使用者數,根據繫結使用者數計算使用的執行緒數
- 為執行緒分配使用者
- 開始爬取,並刪除臨時表資訊
- 資料入臨時表
- 資料驗證,用於處理爬取失敗的使用者,正式表的資料不刪除
- 刪除正式表資料
- 臨時表資料同步至正式
- 判斷所有執行緒結束後,返回3
- 需要記錄日誌,直接寫入檔案,記錄內容:啟動時間、執行緒數、使用者數、成功使用者數、成功資料量、失敗使用者數
4.2.3 解析服務
步驟:
- 使用者session資訊判斷,使用者session存在的直接使用session訪問,不存在的登入
- 登入至雲門戶
- 登入至業務系統
- 爬取頁面資訊
- 解析頁面
- 形成json資料
- 實時獲得工單列表條目數和工單詳細資訊大致流程與解析服務一致,其實就是多爬取了一次工單列表頁面,不進行入庫處理,實時返回工單列表數量。上述解析服務流程基本可以滿足常見的頁面資料爬取工作,對於涉及互動方面的則需根據具體情況來分析。
4.3 tomcat監控
需要使用shell指令碼對其進行管理,主要有以下兩點:
- 每天定時重啟,初步定為凌晨0點
- 10分鐘掃描一次tomcat程式,發現掛掉了立即重啟
5、檢視層詳細設計
5.1 開發工具與框架
Hbuilder開發平臺, mui框架,jQuery框架
5.2 開發流程
- 頁面設計
- 靜態頁面 -- 根據畫好的頁面效果圖,寫出靜態頁面,以及部分按鈕的實現。注意 css的編寫 及 後期 頁面 之間引數的傳遞。
- 資料解析 -- 從後臺人員處獲取介面,然後js中通過jQuery.ajax({})呼叫介面,通過固定引數測試是否能獲取到資料,注意遮罩及回撥函式。
- 資料渲染 -- 根據獲取的資料型別,往頁面填充資料。通過js便利填充 或者用 mui內部外掛引入angular.min.js,通過 $scope賦值。
6、總結
使用爬蟲在獲取資料過程中確實提供了方便,在第三方不提供介面的情況下,使用網路爬蟲是一種很好的資料獲取機制。網路網蟲的好處大致有以下幾點:
- 準確定位,資料獲取方便
- 資料篩選,精煉海量資訊
- 資料庫角色扮演者
但是網路爬蟲也存在不少缺點,我們在開發過程中發現使用網路爬蟲其實還是存在很多短板的,不足之處如下:
- 不規則網頁處理,頁面結構混亂導致爬蟲程式碼冗餘
- 反爬策略,網站反爬策略導致爬取資料失敗
- 動態載入網站,抓取動態載入的資料,需要分析大量的原始檔
- 大規模,海量資料計算能力與記憶體容量無法形成正比
吉林專案最初使用爬蟲的方式獲取資料,在測試過程中發現資料載入較慢,對於實時抓取的資料顯示的尤為突出。目前該專案已調整開發,計劃使用介面的形式從第三方來進行資料的獲得。
相關文章
- 爬蟲抓取網頁的詳細流程爬蟲網頁
- 反網路爬蟲以及解決方案爬蟲
- 網路爬蟲爬蟲
- 網路爬蟲——爬蟲實戰(一)爬蟲
- 網路爬蟲基本原理詳解爬蟲
- Python 網路爬蟲入門詳解Python爬蟲
- 網路爬蟲精要爬蟲
- 網路爬蟲示例爬蟲
- 課程設計:python_網路爬蟲專案Python爬蟲
- 爬蟲那些事-爬蟲設計思路爬蟲
- 網路爬蟲的原理爬蟲
- 網路爬蟲專案爬蟲
- 傻傻的網路爬蟲爬蟲
- python網路爬蟲(7)爬取靜態資料詳解Python爬蟲
- [Python] 網路爬蟲與資訊提取(1) 網路爬蟲之規則Python爬蟲
- 《用Python寫網路爬蟲》--編寫第一個網路爬蟲Python爬蟲
- 爬蟲代理 Scrapy 框架詳細介紹 2爬蟲框架
- python網路爬蟲_Python爬蟲:30個小時搞定Python網路爬蟲視訊教程Python爬蟲
- 網路爬蟲設計中需要注意的幾個問題爬蟲
- python網路爬蟲應用_python網路爬蟲應用實戰Python爬蟲
- 什麼是Python網路爬蟲?常見的網路爬蟲有哪些?Python爬蟲
- 端動態化方案詳細設計
- python網路爬蟲(14)使用Scrapy搭建爬蟲框架Python爬蟲框架
- 爬蟲學習之基於Scrapy的網路爬蟲爬蟲
- python DHT網路爬蟲Python爬蟲
- 網路爬蟲的反扒策略爬蟲
- 什麼是網路爬蟲爬蟲
- 什麼是網路爬蟲?爬蟲
- 網路爬蟲是什麼?爬蟲
- 網路爬蟲如何運作?爬蟲
- 網路爬蟲流程總結爬蟲
- 網路爬蟲大型教程(二)爬蟲
- 網路爬蟲專案蒐集爬蟲
- 網路爬蟲三大特性爬蟲
- 網路爬蟲(六):實戰爬蟲
- 網路爬蟲——爬百度貼吧爬蟲
- Python3 大型網路爬蟲實戰 — 給 scrapy 爬蟲專案設定為防反爬Python爬蟲
- python網路爬蟲(9)構建基礎爬蟲思路Python爬蟲