1 網絡爬蟲的歷史及現狀
網絡爬蟲是一個自動提取網頁的程序,如果把互聯網比喻成一個蜘蛛網,那么爬蟲就是在網上爬來爬去的蜘蛛。傳統爬蟲從一個或若干初始網頁的 URL 開始,獲得初始網頁上的URL,在抓取網頁的過程中,不斷從當前頁面上抽取新的 URL放入隊列,直到滿足系統的一定停止條件。如果把整個互聯網當成一個網站,那么網絡蜘蛛就可以用這個原理把互聯網上所有的網頁都抓取下來。隨著互聯網全面從 Web1.0 時代迅速進入Web2.0 時代,由于 Ajax 異步加載的特性,為減輕服務器壓力,基于 Ajax 的動態加載技術方案成為了個大公司的首選。然而隨著移動互聯網的興起 JavaScript 在移動端和 PC 客戶端的優良特性被廣泛挖掘,基于前端 MVC/MVVM 的模式逐漸進入各大互聯網公司的首選解決方案。
數據顯示 2011 年互聯網上動態網頁與靜態網頁的比例為12.1:1 到 2014 年動態網頁與靜態網頁的比例攀升到 22:1.
動態網頁的急劇攀升讓各大搜索引擎公司愈發感覺到基于動態Web 頁面的網絡爬蟲將越來越重要。
2 問題現狀及解決方案
2.1 問題現狀
傳統的網絡爬蟲技術主要應用于抓取靜態 web 網頁,由于Ajax 改變了以往的單純的 HTTP 請求 / 響應協議機制。傳統的爬蟲根據 url 抓取頁面并解析頁面內容提取新的 url 進行下一步抓取的機制很難完成。其次,如今互聯網中存在許多對實時性要求比較高的網站,如股票、火車票等。這些網站包含大量的數據信息,并且在隨著服務器端不斷的更新。當搜索引擎抓取這些數據時,由于需要將數據下載到本地,因此永遠存在數據的同步性的問題,然而這些實時性數據的商業價值卻非常大。
因此簡單的講,當前的搜索引擎爬蟲系統遇到動態 web 頁面時的主要問題集中在:(1) 無法提取 Ajax 加載的動態頁中的url.(2) 無法抓取實時性數據。
2.2 網絡爬蟲關鍵技術
(1)基于 HTTP 請求響應模型。用戶在瀏覽器中輸入一個web 頁面的 url, 客戶端向服務器端發出一個請求,服務器在接收到該請求后,如果沒有錯誤將頁面返回。
(2)HTML 標簽及結構。用戶在頁面上看的展示都是基于HTML 進行展示的,因此爬蟲需要對 html 頁面進行解析,提取頁面中的 url 信息。
(3)文本對象模型 (DOM)。DOM 是用來訪問和處理HTML 和 XML 文檔的。它可以將 HTML 和 XML 文檔結構化。
(4)正則表達式。根據正則表達式的優良特性,可以根據條件快速提取 HTML 文本中的指定元素。
2.3 解決方案
AJAX 采用了 JavaScript 驅動的異步請求 / 響應機制。并且,在 Ajax 應用中,JavaScript 會對 DOM 結構進行大量的變動,甚至頁面所有內容都是通過 JavaScript 直接從服務端讀取并動態繪制出來的。因此爬蟲引擎不能僅僅是基于 HTTP 的協議驅動,而必須是基于事件驅動的。
針對實時性數據, 系統的實時特性主要體現在兩個方面:數據更新的實時性;數據變化后通過其它服務的實時性。
在海量的數據面前,由于抓取能力有限,根本無法滿足快速地更新所有的數據信息,為了保證用戶對于數據高實時性的要求,應該盡可能地優先保證熱門數據的數據更新,所以實時抓取的數據點選擇是比較關鍵的。在這里我們使用購物助手的瀏覽記錄以及購物搜索的查詢記錄當作熱門商品為例說明。具體流程為:用戶瀏覽某商品,購物助手獲取該用戶所瀏覽的商品 URL 以及其它商城該商品的 URL 列表發送到任務調度服務器,任務調度服務器根據上一次抓取的價格時間等信息來進行調度,將任務分配至抓取服務器,抓取服務器解析到新的價格后發送到結果入庫服務器。結果入庫服務器完成數據的更新,并通知其它價格事件監聽程序。這就完成了整個基于查詢驅動的實時抓取的過程。這種實時抓取策略就叫做“查詢驅動抓取”(簡稱 QTC,Query Triggered Crawling)。價格服務器除了實時抓取和管理所有商品的價格之外,還需要向其它服務(如降價提醒、全網比價等)提供價格變化的更新事件。如何使得其它服務可以實時地得到商品的價格變化信息呢?我們首先介紹一下觀察者模式。
觀察者模式(也被稱為發布 / 訂閱模式)是軟件設計模式的一種。在此種模式中,一個目標對象管理所有相依于它的觀察者對象,并且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實作事件處理系統。觀察者模式已經在數據變化的實時通知方面被廣泛地應用,它使得服務具有高類聚、低耦合的特點。
根據不同的應用,爬蟲系統在許多方面存在差異,大體而言,可以將爬蟲劃分為如下三種類型 :批量型爬蟲(Batch Crawler):批量型爬蟲有比較明確的抓取范圍和目標,當爬蟲達到這個設定的目標后,即停止抓取過程。至于具體目標可能各異,也許是設定抓取一定數量的網頁即可,也許是設定抓取消耗的時間等。
增量型爬蟲(Incremental Crawler):增量型爬蟲與批量型爬蟲不同,會保持持續不斷的抓取,對于抓取到的網頁,要定期更新,因為互聯網的網頁處于不斷變化中,新增網頁、網頁被刪除或者網頁內容更改都很常見,而增量型爬蟲需要及時反映這種變化,所以處于持續不斷的抓取過程中,不是在抓取新網頁,就是在更新已有網頁。通用的商業搜索引擎爬蟲基本都屬此類。
垂直型爬蟲 (Focused Crawter):垂直型爬蟲關注特定主題內容或者屬于特定行業的網頁,比如對于在線旅游來說,只需要從互聯網頁而里找到與在線旅游相關的頁面內容即可,其他行業的內容不在考慮范圍。垂直型爬蟲一個最大的特點和難點就是:如何識別網頁內容是否屬于指定行業或者主題。從節省系統資源的角度來說,不太可能把所有互聯網頁面下載下來之后再去篩選,這樣浪費資源就太過分了,往往需要爬蟲在抓取階段就能夠動態識別某個網址是否與主題相關,并盡量不去抓墩無關頁面,以達到節省資源的目的。垂直搜索網站或者垂直行業網站往往需要此種類型的爬蟲。
3 結語
針對使用 JavaScript 的動態頁面的抓取,主要采用的技術方案為:(1) 基于事件驅動的爬蟲機制。(2) 使用觀察者模式以及查詢驅動抓取方式來抓取實時性數據。并介紹了當前流行的爬蟲抓取方案。