李健,張克亮
(信息工程大學洛陽校區(qū),洛陽471003)
網絡爬蟲不僅作為搜索引擎的關鍵組件,而且在其他領域也有廣泛應用[1]。借助網絡爬蟲,語言學家可以下載大量文本以研究語言現象,銷售人員可以搜集產品的價格和銷量以分析市場行情,領域愛好者能夠將某個網站或欄目的內容收藏到本地,AI研究者能夠采集各類數據作為機器學習的素材。
國內外眾多機構和個人開發(fā)了多款爬蟲工具軟件,如Nutch、Heritrix、SOUP、ParseHub、GooSeeker、八爪魚、火車頭等;常用的爬蟲框架包括WebCollector、Nutch、WebMagic、Heritrix、Scrapy和PySpider等[2-4]。這些爬蟲軟件和框架在很大程度上便利了人們對網絡數據的獲取,但還具有某些局限性:有的功能相對單一,使用方式受限,可定制化程度不夠;有的安裝配置繁瑣,框架結構復雜,使用門檻較高;有的采用封閉式框架,不提供開源代碼,難以進行二次開發(fā);有的抓取速度慢,解析和抽取能力弱,性能表現不佳。總之,基于現有框架快速開發(fā)個性化爬蟲仍然具有一定難度。因此,為開發(fā)者提供一個輕量級、模塊化、免費開源、高效易用的網絡爬蟲框架十分重要。
網絡爬蟲(Web Crawler)是按照一定規(guī)則自動獲取Web信息資源的計算機程序[5]?!芭老x”是一種形象的比喻,有時也被稱為網絡蜘蛛(Web Spider)或網絡機器人(Web Robot)。網絡爬蟲主要是面向Web的,這是由Web資源的開放性和豐富性所決定的。網絡爬蟲通常會對Web原始數據進行二次抽取,以提高目標數據的結構化程度和價值密度。爬蟲的規(guī)則一方面是指爬蟲所采用的搜索策略(如深度優(yōu)先、廣度優(yōu)先等),另一方面是指爬蟲要遵循的行業(yè)規(guī)范(如Robot協(xié)議)。
根據數據采集的范圍和精度不同,網絡爬蟲可分為“漫爬型”和“垂直型”。前者用于搜索引擎的廣泛采集,也被稱通用爬蟲;后者用于領域數據的精準采集,也被稱聚焦爬蟲。通用爬蟲對網頁中所有超鏈接進行無差別搜索,得到一棵完整的生成樹;聚焦爬蟲則按照一定條件進行篩選,得到一棵被剪枝的生成樹。聚焦爬蟲面向特定主題和應用,是行業(yè)人員獲取領域數據的重要工具,也是文本關注的對象。網絡爬蟲的必要技術包括:Web訪問、信息抽取、數據存儲、爬蟲控制等,其基本工作流程如圖1所示。

圖1爬蟲基本工作流程
首先將種子URL放入任務隊列,然后循環(huán)檢測隊列是否為空,若不為空則取出下一個URL進行數據下載,若為空則結束爬蟲任務。Web資源下載完成后,對其進行目標數據抽取和擴展鏈接過濾,目標數據存入存儲系統(tǒng),擴展鏈接添加到任務隊列。在URL不斷出列的同時又有新的URL補充進來,這樣就實現了自動采集。為了避免重復采集,我們通常借助一個Visited數組來記錄那些已被訪問的URL。
面向個性化需求的輕量級爬蟲框架應當采用模塊化設計,能夠下載各類網絡資源,并支持異步下載、編碼檢測、提交表單、壓縮傳輸、使用代理等機制;能夠解析和抽取HTML、XML、JSON等多種數據;能夠提供靈活的爬蟲控制方式,內置常用搜索算法;能夠管理和分配線程資源和代理資源,支持分布式部署。根據上述需求,我們設計了如圖2所示的爬蟲框架,主要組件包括:控制器、下載器、解析器、線程池、代理池等、分布式部署器和智能化工具包。

圖2輕量級爬蟲框架
框架中的“智能化工具包”通過人機交互技術實現可視化模板配置,使用戶不必掌握Web專業(yè)知識就能完成模板配置,從而降低爬蟲使用門檻[6]。通過智能抽取技術實現對網頁內容(如正文、日期、目錄等)的自動抽取,進一步減少配置工作量。通過主題模型計算網頁內容的相關度,從而提高主題爬蟲的采集精度[7]。
通常情況下,框架中的控制器、解析器、下載器為必選組件,其余為可選組件,用戶可根據需要進行組裝。爬蟲框架的基本應用模式如圖3所示。

圖3爬蟲框架應用模式
引用爬蟲框架后,開發(fā)者只需幾行代碼即可完成對簡單任務的爬?。粚τ谳^復雜的任務,亦可通過參數化定制或二次開發(fā)來實現。當需要規(guī)劃新的爬蟲路線時,開發(fā)者通常只須重寫控制器的相關方法,從而最大程度復用框架功能。
作為爬蟲框架的核心部件,控制器的設計尤其重要。它對外提供操作接口,對內控制整個爬蟲的運行過程。簡單爬蟲控制器的組成結構如圖4所示。

圖4簡單爬蟲控制器
爬蟲控制器的具體功能包括:①提供數據接口:接
收用戶輸入的種子URL,并將結果返回;②控制爬行路線:按照一定策略(深度優(yōu)先、廣度優(yōu)先等)進行網頁爬??;③維護訪問列表:對于已經訪問過的URL不再重復訪問;④設置過濾條件:對于擴展URL進行條件過濾;⑤控制任務總量:設置最大采集數量、最大搜索層數等。


上述代碼通過實現了對“洛陽政府網站”的站內爬?。菏紫?,創(chuàng)建一個BFSController對象;其次,限定最大采集任務量為100個頁面;再次,通過設置URL過濾器要求擴展鏈接中必須包含“l(fā)y.gov.cn”字符串,從而保證“站內搜索”;最后,將網站首頁(http://www.ly.gov.cn/)作為起始種子開啟爬蟲任務。執(zhí)行上述代碼,運行結果如圖5所示。

圖5爬蟲運行結果
此前的爬蟲控制器要等任務全部完成后才能返回結果,這并不符合實際需求。由于爬蟲在開放的網絡環(huán)境中運行,任何意外情況都可能發(fā)生,例如斷網、停電、死機、誤操作、服務器故障等。若爬蟲程序在結果返回之前就異常退出或無法繼續(xù)運行,那么此前的工作也就變成徒勞。當采集任務量很大時,即使采集過程沒有遇到異常情況,爬蟲控制器也不可能一次性返回所有結果,這就需要對下載內容進行實時保存。
根據上述分析,我們對控制器提出以下改進:①采集結果不再等任務全部完成后一并返回,而是每下載一個任務就觸發(fā)回調機制(回調方法由用戶指定,可進行實時保存或進一步抽?。?。②可以保存當前任務場景(Save),也可以從已保存的場景中恢復任務并繼續(xù)執(zhí)行(Restore)。③由用戶設置一個自動保存數量(M),爬蟲每采集M個任務就自動保存一次任務場景;即使有異常情況發(fā)生,需要重新下載的任務最多也不會超過M個。改進后的爬蟲控制器具有一定的實時處理能力,我們稱之為“實時爬蟲控制器”(如圖6所示)。

圖6實時爬蟲控制器




圖7爬蟲任務存放目錄
筆者在項目實踐中發(fā)現:Web新技術層出不窮,網頁結構千差萬別,業(yè)務數據多種多樣,采集目標各不相同。面對個性化的數據采集需求,沒有哪一款網絡爬蟲能包打天下。在已有爬蟲框架的基礎上進行二次開發(fā),是一種高效可行的方法。實驗結果表明:本文所提出的輕量級爬蟲框架是功能完備的,所設計的實時爬蟲控制器是高效易用的。在控制器的實現過程中也涉及到了下載器和解析器,但由于篇幅所限文中未能詳細介紹。若需要完整的實現代碼,可通過電子郵箱聯(lián)系作者。