李 敏,趙 君 (長江大學計算機科學學院,湖北荊州434023)
在某些專業領域,如房地產、電子商務領域等,傳統搜索引擎已經無法滿足用戶的需求,為解決該問題,研究者提出垂直搜索引擎的設計構想。垂直搜索是針對某一行業的專業搜索引擎方式,其對互聯網海量信息中的某類專門信息的搜集和整合。爬蟲系統負責獲取互聯網中的海量數據,是垂直搜索引擎的核心,對整個引擎的運行效率有著重大影響。為此,筆者就如何設計高效率的垂直搜索引擎爬蟲系統進行了詳細探討。
垂直搜索引擎首先委派爬蟲系統到目的網站下載相應信息,并將這些信息存入網頁庫,然后由索引模塊對網頁庫進行索引結構化處理,形成相應的索引文件 (索引庫)[1]。當用戶在網頁終端查詢信息時,系統會檢索索引文件,并將最終結果呈現給用戶,其工作模式如圖1所示。

圖1 垂直搜索引擎的工作模式圖
因為爬蟲系統的運行和管理是整個系統的核心,所以,對抓取龐大數據的爬蟲系統而言,設計一個科學的運行流程至關重要,因為該流程直接影響著整個搜索引擎的工作效率。在爬蟲系統的運行過程當中,要充分考慮共享資源的互斥訪問和運行效率之間的矛盾,應盡量減少爬蟲在訪問隊列中的等待時間,并適當地運用緩沖區 (如隊列緩沖區或棧緩沖區)[2]。根據效率優先的設計原則,筆者所設計的該爬蟲系統的運行流程圖如圖2所示。

圖2 爬蟲系統運行流程圖
爬蟲系統的主要業務邏輯包括爬蟲運行過程當中的配置參數及其數據結構,筆者僅就配置參數的相關內容加以闡述。
爬蟲運行過程當中的配置參數包括授權參數、頻道配置參數、數據庫配置參數、任務配置參數和爬蟲抓取參數[2]。其中授權參數包括頻道數量、單個頻道數據量上限、總數據量上限、頻道內任務數上限、工作線程數上限、深度上限、是否啟用抓圖功能、是否啟用視頻批量抓取功能、是否啟用任務調度功能。
為了用戶操作方便,一般將數據庫配置參數集成到頻道配置參數中。因此,頻道配置參數包括頻道數量、頻道名、頻道字段屬性 (字段名、字段是否為空)、頻道數據庫連接配置、數據表配置和任務基本信息配置。頻道數據庫連接配置中,根據目前的業務需要,數據庫類型暫時設置為 SqlServer、MySql和Oracle,并預留好接口,以便隨時增加數據庫類型。用戶在此設置服務器地址、用戶名、密碼和數據庫。在數據表配置里,用戶可以進行如下操作:①定義多個信息儲存表和每個表的最大記錄數,以分散單個表的訪問負荷;②設定每個字段的字段名和長度,根據其需要設置去重字段和增加從表;③根據預先設置的字段定義字段的名稱和長度 (為保證容錯性,字段的類型均為字符串型),對某個大容量字段設定從表 (如視頻采集中的URL地址)。此外,任務基本信息配置包括任務的ID和任務名,用于樹形菜單的顯示。
任務配置參數包括任務基本屬性、路徑配置、抓取規則配置和任務調度配置。軟件啟動后,將讀取頻道配置信息和任務配置信息。任務基本屬性選項卡中可以配置任務名稱、所屬頻道、爬蟲抓取延遲[3](為避開大網站反抓取機制,需要設置延遲)、工作線程數、爬行深度 (入口頁面的深度為1)、有效數據抓取深度[3](為提高爬蟲抓取效率,可以設定目標數據所在頁面的深度,以避開無效頁面的干擾)。爬蟲抓取延遲有3項選擇:沒有延時、固定延時和隨機延時,用戶可以根據實際情況選擇。在路徑配置和抓取規則配置中,將動態路徑規則、靜態路徑規則和固定字段值等功能放在同一個窗口里,以減少操作步驟,從而增加操作友好性。同時增加數據抽取測試頁面,讓用戶可以實時查看配置的正確性。爬蟲系統還可對抓取后的數據進行分析和處理,即添加數據分析功能,用戶能夠根據實際需要對每個字段對應的抽取值進行替換、篩選和補充。任務調度配置的內容包括用戶可以設置是否啟用任務調度以及調度起始時間、調度終止時間。如果起始時間小于當前時間,則當前時間為起始時間;如果終止時間小于當前時間,則調度無效,此外,還可以設置調度頻率。
爬蟲抓取參數為非可視化技術內核,是爬蟲抓取功能的實現部分,將根據各塊配置進行數據抓取。爬蟲抓取參數包括主控制臺和分析爬蟲。該模塊可實現如下功能:①主控制臺線程負責抓取全站URL,并根據用戶的設置過濾掉無效的和重復的URL,同時控制分析線程的運行狀態。根據用戶的配置,將符合要求的URL記錄到文件或數據庫中,已記錄者不再記錄。當所有URL讀取完成,自動按用戶定義的規則處理還沒有內容抽取的URL。②根據用戶配置可以采集JavaScript中的網址。③采集需要登錄后才能查看的信息。④入口網址規則中可設定多個變化參數,如Test.aspx?param1=a¶m2=b,其中參數值a和b都可以設為動態參數;⑤用戶可以使用可視化正則規則生成器 (動態路徑生成器)。⑥通過加入代理 (自定義代理,采集過程中可自動定時切換成代理模式)等功能突破網站防采集機制,代理的配置放在入口URL中。⑦設定網址讀取上限時間,如超過5s讀取不成功的網址,自動丟棄該網址。
在該系統設計中,使用的模式有單件模式、觀察者模式、工廠模式和抽象工廠模式。在上述模式中,觀察者模式最為常用,其目的是降低各個對象之間的耦合度,使各個組件更利于維護。觀察者模式包括觀察者接口IObserver、被觀察主體接口IObservable、被觀察主體抽象類SubjectBase,其模型圖分別見圖3和圖4。凡是需要拋出事件的對象 (即被觀察的對象)均繼承IObservable接口或SubjectBase抽象類;凡是根據外部事件更新的對象 (即觀察者)均繼承IObserver接口,并實現Update方法,這樣就形成了一種松散耦合的方式,降低了觀察者對被觀察對象的依賴。

圖3 觀察者接口的類模型圖
該設計模塊 (解決方案)包含7個子項目,從低層到高層分別是 DevHelper、Common、Kernel、DataProvider、Components、 Configuration(Controls)和 App。其中,DevHelper為第三方開源工具項目,包含眾多功能強大的第三方工具源代碼。
Common為通用項目,包含各種通用功能,各種通用模式均定義在這個項目中。該項目中還包括線程管理器接口IThreadManager,任務狀態枚舉 TaskStateEnum,通用參數類CommontArgs(解決方案中被觀察對象拋出的數據均為CommontArgs的對象),線程管理器抽象工廠類 AbsThreadManagerFactory(用以制造線程管理器對象),同步隊列類SyncQueue,同步字典類SyncDictionary,運行時錯誤處理委托RuntimeErrorEventHandler(用以定義運行時錯誤處理事件,是一種特殊的觀察者模式,和普通觀察者模式有所區別),通用事件處理委托CommonEventHandler(用以定義普通事件)。可視化XPath生成器模塊也在該項目中定義和實現。

圖4 被觀察對象的類模型圖
Kernel為爬蟲系統的業務核心項目,所有的接口和核心業務類,包括配置文件的數據結構、數據讀取和保存函數的實現,此外,還包括配置類ConfigData的定義、多線程中線程池管理器CrawlerThreadManagerPool、多線程管理器CrawlerThreadManager的實現、線程運行類CrawlerWork的定義、頁面信息類PageInfo、頁面信息管理器類PageInfoManager和運行時信息處理類 RuntimeSaveInfo。爬蟲運行時RuntimeSaveInfo類只有一個對象,爬蟲每解析一條合格數據,都要通知該對象,以記錄運行時的信息。
DataProvider為數據訪問模塊,其功能是將采集到的數據寫入到數據庫中 (包括數據處理接口IDataProvider的實現);Components為與運行時有關的通用功能模塊;Configuration為控件模塊,所有與配置相關的用戶控件均定義在該項目中;App為運行項目。7個項目的邏輯依賴關系如圖5所示。

圖5 項目邏輯依賴關系圖
從垂直搜索引擎的工作模式入手,根據搜索效率優先和功能模塊之間高內聚低耦合的原則,對如何設計高效率的爬蟲系統的進行了詳細探討,并論述了該方案的業務邏輯和主要設計模式,進而在此基礎上構建了爬蟲系統項目邏輯依賴關系圖。經測試,在網絡不擁堵的情況下,單日24h可采集并分析40萬條數據,因而該系統具有非常好的運行效率。此外,該設計方案還具有良好的可維護性和伸縮性,為今后進一步開展再編程和擴展的研究工作提供了方便。
[1]胡燕.基于Web信息抽取的專業知識獲取方法研究[D].武漢:武漢理工大學,2007.
[2]楊堅爭,李朝平.垂直搜索引擎及其應用 [J].遙感信息,2005,(10):23~25.
[3]呂林濤,陳麗萍,周紅芳.面向垂直搜索引擎的主題提取算法[J].計算機工程,2009,35(15):24~26.