石恩名,肖曉軍,盧宇
(廣州優億信息科技有限公司,廣東 廣州 510630)
基于云平臺的分布式高性能網絡爬蟲的研究與設計
石恩名,肖曉軍,盧宇
(廣州優億信息科技有限公司,廣東 廣州 510630)
隨著大數據時代的到來,數據成為最寶貴的資源,而網絡爬蟲技術作為外部數據采集的重要手段,已然成為數據分析的標配。介紹了一種高性能、靈活和便捷的基于云平臺的爬蟲架構設計和實現。從爬蟲的整體架構、分布式設計以及各模塊的設計等角度進行了詳細的闡述。爬蟲各模塊用 Docker封裝,Kubernetes做集群的資源調度和管理,在性能優化上采用了MD5去重樹算法、DNS優化和異步I/O等多種策略組合的形式。實驗表明,對比未優化的方案,爬蟲在性能上具有較明顯的優勢。
分布式系統架構;網絡爬蟲;Docker;高性能
大數據時代,數據是最豐富也是最寶貴的,網絡信息量快速增長,面對這樣海量的數據,如何快速、精確和低成本地收集到所需數據是目前企業所關注的熱點。網絡爬蟲作為一種重要的數據采集手段,既是各類應用的外部數據來源(如內容聚合類應用:今日頭條、百度新聞等),也是搜索引擎的重要組成部分。特別隨著數據分析技術逐漸在各類互聯網企業的應用,加上網上應用開放API的缺乏,作為外部數據主要來源的網絡爬蟲技術已經逐漸成為數據分析類應用產品的標配。因此不管是在學術界還是工業界, 對它的研究和改良從未間斷過。
一個好的爬蟲設計可以從以下幾點來評價。
2.1 整體架構
爬蟲系統的整體框架主要包括四大模塊:調度模塊、采集模塊、解析模塊、存儲模塊,如圖1所示。爬蟲系統接收一個初始配置信息如起始URL,交遞給調度模型進行處理,調度模型根據調度策略的設置將調度請求發送給采集模塊,采集模塊響應請求,通過HTTP下載網頁信息,并將網頁信息傳遞給頁面解析模塊,解析模型調用解析規則對頁面進行特定解析,并將數據存入數據庫,同時將解析的URL傳回調度器。

圖1 系統整體框架
2.2 云平臺設計
本系統的云平臺底層架構采用Docker容器集群代替虛擬機進行構建。Docker是一個基于輕量級虛擬化技術的容器引擎項目,其采用LXC(新版的基于Libcontainter)基于內核的虛擬化技術隔離進程、資源和網絡,相比傳統的虛擬機技術具備更高的性能和效率,同時具有輕量化、快速啟動等優點。
本系統的分布式架構構建在 Kubernetes集群上,Kubernetes是一個管理跨主機容器化應用的系統,實現了包括部署、運維和應用彈性伸縮在內的一系列基礎功能[1]。爬蟲各模塊為一個Pod容器組,集群通過Replication Controller(副本控制器)創建、維護和彈性伸縮 Pod集,爬蟲各模塊的通信通過Kafka分布式消息隊列進行,如圖2所示。
調度模塊主要包括了調度器和調度策略兩大組件,調度器是調度模塊的核心,主要負責URL的調度和去重等工作,調度策略組件主要為調度器提供策略規則,解釋URL根據何種方式進行調度和更新,調度策略組件可以根據初始配置進行修改,從而實現不同任務采用不同調度策略。調度模型是爬蟲系統性能優化的關鍵點之一,分布式爬蟲任務調度模型核心包括兩個部分:URL的分發服務和去重。

圖2 Kubernetes分布式框架
3.1 爬蟲任務調度策略
對于爬蟲系統來說,大量重復的鏈接將給搜索引擎帶來巨大的負面影響,不但會造成索引存儲的內存負擔,同時將大大增加索引檢索的時間消耗。因此,去重算法的選擇是爬蟲性能優化的關鍵。傳統的去重算法包括散列算法、布隆過濾器[2]及其各種變形[3,4],散列算法所需的存儲空間大,檢索速度慢,但錯判率低,可對指定URL進行刪除;布隆過濾器所需存儲空間小,檢索速度快,但具有一定幾率的錯判,其只能判斷沖突,不能對指定URL進行刪除。
由于本系統在設計之初既要兼顧性能,又要兼顧其靈活性和錯判率,去重算法上采用嚴磊提出的基于MD5去重樹算法[5]進行去重。基于MD5去重樹是通過將URL進行MD5壓縮,然后構建樹結構存儲MD5值,如圖3所示。由于其結合了散列算法和樹結構的特征,其即具有普通散列算法的低錯判率(16位MD5碰撞概率為又具有樹結構的空間占用小、檢索速度快等特點,基于 MD5去重樹在性能和錯判率上取得較好的平衡,同時可以滿足對指定 URL的刪除功能。

圖3 基于MD5去重樹算法
3.2 分布式分發策略
Google早在1998年就提出了mater-slave(主從)分布式爬蟲模型[6]提供URL的分發服務。為了保證抓取服務器間的負載均衡,Ubicrawler提出一種一致性散列的方法來分配任務,抓取服務器負責散列環的一個片段URL下載,當某一臺服務器發生異常時,它負責將地址片段上的任務由沿順時針方向尋找到的第一臺服務器處理。一致性散列算法滿足了分布式系統中的平衡性、單調性、分散性和負載均衡性。本系統采用MD5去重樹做URL索引,因此在做URL服務分發的時候可以直接將去重的MD5的值構建一致性散列值,從而將去重和分發結合起來。
采集模塊負責抓取網頁,是整個系統的基本與關鍵部分,直接影響爬行效果。采集模塊分為兩個子模塊,一個是下載器,一個是下載中間件。下載器主要是發送下載請求,下載中間件是指對訪問網頁的請求做加工和處理。
4.1 下載器
下載器主要通過HTTP與Web服務器進行通信。采用socket方式下載的網絡編程模型主要有同步I/O、非阻塞I/O和異步I/O。本系統下載器采用Tornado Web Server開發,支持多線程異步I/O,每個線程的I/O連接數維持在100個。
對于利用AJAX技術動態生產數據的網頁,下載器將請求發給 PhantomJS進行渲染,在PhantomJS完成網頁JavaScript腳本的解析、DOM樹的重構以及瀏覽器事件觸發的模擬,最后PhantomJS將渲染后的頁面返回。
4.2 下載中間件
下載中間件是利用鉤子技術對下載器進行截獲,從而構建新的下載請求,本系統的下載中間件包括DNS優化器、IP代理模塊等。
(1)DNS優化器
由于URL中域名的大量重復使用,為了提高DNS解析效率,本系統引入了DNS本地緩存模塊,并對DNS本地緩存檢索、添加、刪除進行優化。本系統為DNS緩存構建了一個域名散列樹主表和一個域名—IP地址映射表,首先通過散列樹將域名的散列值壓縮成樹結構,然后通過散列值指向域名—IP地址映射單元,沖突域中按照域名的權重值進行排序,可以定期對IP地址做更新。
(2)IP地址代理模塊
IP地址代理模塊主要由3部分組成:IP地址采集器、IP地址池管理模塊、IP地址代理池。IP地址采集器負責采集代理網站上的IP地址,然后對其進行測試和校驗,將可用的IP地址、響應時間和運營商等信息存入IP地址代理池中。IP地址池管理模塊是IP地址代理模塊的核心,主要負責IP地址調度和IP地址校驗工作。為了滿足高并發的采集需求,本文設計了一種基于域名的IP地址代理調度模型。首先將IP地址池中的IP地址按照響應時間、運營商進行排序,然后首位相連構建成一個環形鏈表,同一域名下的代理調度從環形鏈表頭部開始,逐級循環下去,這樣既可以保證優質IP地址被優先使用,同時也保證了同一域名下代理IP地址盡可能分散,從而實現了host控制的功能。IP地址池管理模塊除了負責IP地址的調度工作,還負責IP地址的校驗更新,IP地址池管理模塊會定時對IP地址代理池中的IP地址進行校驗,并對響應時間進行更新,將不能使用的IP地址進行剔除。
解析模塊主要負責內容分析和鏈接抽取。網頁中包含各種各樣不同格式的信息,比如文本信息、圖片、視頻,解析模塊就是負責將這些信息抽取出來。解析模塊有兩個子模塊:通用解析子模塊和規則解析子模塊。
5.1 通用解析器子模塊
此模塊是指對一些通用的采集、解析任務進行頁面解析,通用解析模塊內容包括網頁正文、圖片、視頻等,從常用的文本格式如PDF、txt中抽取文本信息。正文抽取技術主要采用了朱澤德等人[7]提出的文本密度模型,按行計算網頁文本密度,根據鄰近行的內容連續性運用高斯平滑獲取文本密度,最后利用最大子序列分割的方法抽取正文內容。對于視頻和圖像等文件,一般是通過鏈接的錨文本和相關的文件注釋鎖定解析目標位置。
5.2 規則解析子模塊
此模塊負責網頁分析和信息抽取,根據解析規則對頁面進行解析和抽取。解析規則由用戶進行設定,圖4(a)是本系統的解析文檔示意。解析規則文檔主要包括了三大部分:URL-pattern、數據解析、外鏈解析。URL-pattern主要是提供過濾器的作用,判斷哪些URL使用該模板,URL-pattern支持正則表達式進行匹配。通過URL-pattern匹配的頁面會被交給數據解析模塊,數據解析模塊構建DOM樹,通過CSS語法或Xpath語法抽取頁面內容,根據字段描述信息將解析所得信息存入數據庫中,外鏈解析從頁面解析出 URL,通過消息隊列將 URL傳回調度器,如圖4(b)所示。值得注意的是,在設計之初考慮到數據解析的靈活性問題,數據解析子模塊不僅可以采用CSS語法或Xpath語法進行解析,同時支持正則表達式解析和特定腳本語言進行解析,如Python、JavaScript。規則解析可視化界面如圖5所示。

圖4 規則解析模塊

圖5 規則解析可視化界面
本文以hao123網站作為起始URL,測試該系統爬蟲在各方面的性能指標。測試環境為 3臺CPU24核,內存32 GB的機器,運行環境為CentOS 6.5,集群共運行6 h,采集速率如圖6所示。3臺機器6 h共采集數據500多萬個頁面,平均采集速率為14 099頁/min,每臺機器的平均采集速率在4 699 頁/min。
由于整個系統采用了多種優化方案對爬蟲的性能進行優化,為了對比各種性能的優化的效果,采用控制變量方法對各指標優化前后做對比,其結果如圖7所示。
從圖7可以看出,Hash去重樹算法相對于普通的Hash表去重的方法具有非常大的提升,提升了近30倍,同時相對于布隆過濾器在性能上并沒有受到顯著的影響。與未通過DNS優化的爬蟲相比,性能上也得到了一定的提升。

圖6 爬蟲系統6 h采集速率

圖7 各優化項控制變量下對比結果
本文介紹了一種高性能的分布式云平臺爬蟲框架,底層分布式架構利用Kubernetes實現了基于Docker的跨主機容器集群自動伸縮,并利用集群對資源進行監控和分配。為構建一個高性能的爬蟲,本文采用了MD5去重樹對URL做去重,同時利用 MD5樹所得到的散列值構建一致性散列作為URL分發算法實現負載均衡。爬蟲的下載器采用異步I/O請求,并對DNS緩存進行了優化,針對IP地址限制網站,本文設計了一種基于域名的IP地址代理調度模型,使IP地址代理池可以被高效利用。在靈活性方面,爬蟲設計了一套通用的解析規則,解決了多種類型頁面的解析需求。
[1]NEGUS C. Docker containers from start to enterprise (includes content update program): build and deploy with Kubernetes, Flannel, Cockpit and Atomic[J]. Vaccine, 2016(19):S87-S95.
[2]嚴華云,關佶紅. Bloom Filter研究進展[J]. 電信科學,2010, 26(2):31-36. YAN H Y, GUAN J H. Survey of Bloom Filter[J]. Telecommunications Science, 2010, 26(2):31-36.
[3]吳樺,龔儉,楊望. 一種基于雙重Counter Bloom Filter的長流識別算法[J]. 軟件學報,2010, 21(5):1115-1126. WU H, GONG J, YANG W. Algorithm based on double Counter Bloom Filter for large flows identification[J]. Journal of Software, 2010, 21(5):1115-1126.
[4]張進,鄔江興,劉勤讓. 4種計數型Bloom Filter的性能分析與比較[J]. 軟件學報, 2010, 21(5):1098-1114. ZHANG J, WU J X, LIU Q R. Performance evaluation and comparison of four Counting Bloom filter schemes[J]. Journal of Software, 2010, 21(5):1098-1114.
[5]嚴磊,丁賓,姚志敏,等. 基于 MD5去重樹的網絡爬蟲的設計與優化[J]. 計算機應用與軟件, 2015(2):325-329, 333. YAN L, DING B, YAO Z M, et al. Design and optimisation of md5 duplicate elimination tree-based network crawler[J]. Computer Application and Software, 2015(2):325-329, 333.
[6]BRIN S, PAGE J.The anatomy of a large-scale hypertextual web search engine[J].Computer Networks and Isdn Systems, 1998,98 (30) : 107-117.
[7]朱澤德,李淼,張健,等. 基于文本密度模型的Web正文抽取[J].模式識別與人工智能,2013(7):667-672. ZHU Z D, LI M, ZHANG J, et al. Web content extraction based on text density model[J]. Pattern Recognition and Artificial Intelligence, 2013(7):667-672.
Research and design of distributed high-performance network reptiles based on cloud platform
SHI Enming, XIAO Xiaojun, LU Yu
Guangzhou Useease Information Technology Co., Ltd., Guangzhou 510630, China
With the arrival of large data age, data has become the most valuable resource. And web crawler technology as an important means of external data collection, has become a standard tool for data analysis. A high-performance, convenient cloud-based crawler architecture design was introduced. The overall structure of the reptile to the distributed design and the design of the sub-module was described in detail. Each module of the crawler was encapsulated in Docker, and Kubernetes was used as the resource scheduling and management of the cluster. In the performance of optimization, the MD5 reset tree algorithm, DNS optimization and asynchronous I/O were adopted. Experimental results show that the performance of crawler has obvious advantages compared with the UN optimized scheme.
distributed system architecture, web crawler, Docker, high-performance
TP393
A
10.11959/j.issn.1000?0801.2017234

石恩名(1991?),男,現就職于廣州優億信息科技有限公司,主要研究方向為數據挖掘、人工智能和地理信息系統等。

肖曉軍(1970?),男,博士,廣州優億信息科技有限公司高級工程師,主要研究方向為大數據、數據挖掘和電信行業應用等。

盧宇(1983?),男,現就職于廣州優億信息科技有限公司,主要研究方向為大數據、機器學習和人工智能等。
2017?04?18;
2017?07?27