羅嬌敏,耿 茜
(南京航空航天大學 金城學院信息工程系,江蘇 南京 211156)
一種基于Redis的分布式爬蟲系統(tǒng)設計與實現(xiàn)
羅嬌敏,耿 茜
(南京航空航天大學 金城學院信息工程系,江蘇 南京 211156)
隨著互聯(lián)網(wǎng)技術的飛速發(fā)展,互聯(lián)網(wǎng)信息和資源呈指數(shù)級爆炸式增長。如何快速有效的從海量的網(wǎng)頁信息中獲取有價值的信息,用于搜索引擎和科學研究,是一個關鍵且重要的基礎工程。分布式網(wǎng)絡爬蟲較集中式網(wǎng)絡爬蟲具有明顯的速度與規(guī)模優(yōu)勢,能夠很好的適應數(shù)據(jù)的大規(guī)模增長,提供高效、快速、穩(wěn)定的Web數(shù)據(jù)爬取。本文采用Redis設計實現(xiàn)了一個主從式分布式網(wǎng)絡爬蟲系統(tǒng),用于快速、穩(wěn)定、可拓展地爬取海量的Web資源。系統(tǒng)實現(xiàn)了分布式爬蟲的核心框架,可以完成絕大多數(shù) Web內(nèi)容的爬取,并且節(jié)點易于拓展,爬取內(nèi)容可以定制,主從結構使得系統(tǒng)穩(wěn)定且便于維護。
Redis;分布式;主從式;爬蟲系統(tǒng)
互聯(lián)網(wǎng)的快速崛起極大的改變了人們的生活,互聯(lián)網(wǎng)上的資源和信息以一種爆炸式的方式增長。如此海量的數(shù)據(jù),如此快的增長速度,為搜索引擎提出了不小的挑戰(zhàn)。同時,海量的網(wǎng)頁中擁有的大量有價值的數(shù)據(jù),也需要通過爬蟲來抓取,為信息檢索和科學研究提供大量的數(shù)據(jù)支持[1]。網(wǎng)絡爬蟲作為一種被廣泛應用的信息獲取手段,早期使用的網(wǎng)絡爬蟲技術一般都是單機網(wǎng)絡爬蟲。爬蟲程序首先設置待爬取隊列,然后從待爬取隊列中獲取超鏈接URL,抓取該URL對應的頁面,最后取出新的鏈接放入待爬取隊列中,依次循環(huán)操作直到待爬取隊列為空[2]。隨著網(wǎng)頁數(shù)量呈現(xiàn)爆炸性增長,單機的爬蟲程序速度太慢,網(wǎng)絡爬蟲獲取信息的速度也遠遠跟不上信息增長的速度,無法滿足信息獲取的要求。因此,必須采用分布式的方法,使用多個節(jié)點并行地對這些數(shù)據(jù)進行抓取和處理[3]。但已有的開源分布式爬蟲系統(tǒng)實現(xiàn)復雜,應用起來較為困難。
目前,許多大型的互聯(lián)網(wǎng)公司(如:百度,谷歌等)都研發(fā)出了自己的復雜的分布式的網(wǎng)絡爬蟲,但是這項技術作為公司核心的技術,沒有對外界開放它的源碼。有些在使用的開源的爬蟲,基本上還是單機模式,很少采用分布式的方法。當然也存在一些分布式的爬蟲,如:Nutch,Igloo等,但是這些系統(tǒng)實現(xiàn)和部署起來比較復雜[3]。因此,設計和實現(xiàn)一個簡單穩(wěn)定的、可定制性高的、中小規(guī)模的分布式爬蟲具有很重要的意義,能夠適應網(wǎng)頁數(shù)據(jù)的指數(shù)式增長,幫助我們快速的獲取海量的網(wǎng)頁數(shù)據(jù),為搜索引擎的檢索,實驗室大數(shù)據(jù)方面的研究提供數(shù)據(jù)源。
本文主要的研究內(nèi)容是設計和實現(xiàn)一個基于Redis的分布式爬蟲系統(tǒng)。采用主從的架構模式,用戶向系統(tǒng)提交任務(需要爬取的種子 URL),主節(jié)點(Master)調度從節(jié)點(Slave)分布式并行地完成多個爬取任務,將爬取的網(wǎng)頁數(shù)據(jù)存儲于數(shù)據(jù)庫和本地硬盤上。同時,對于每個頁面的爬取提供接口函數(shù)以完成個性化的定制。
1.1 爬蟲的基本工作原理
對于互聯(lián)網(wǎng)來說,就相當于一張大的圖,爬蟲的搜索就是圖的廣度優(yōu)先遍歷[4]。從一系列的種子節(jié)點出發(fā),提取 HTML頁面的子節(jié)點(超鏈接),放入待處理的列表里面。被處理過的鏈接需要放到一張表(visited)里。每次從待處理列表中取出一個鏈接,需要判斷它是否已被訪問過(即是否存在于 visited表中),如果是,則跳過不處理,否則,進行下一步的處理。爬蟲的工作過程示意圖如圖 1所示:
圖1 爬蟲的工作過程示意圖Fig.1 Crawler working process diagram
初始化種子URL由用戶或者系統(tǒng)設定,然后從種子URL出發(fā),解析該頁面的超鏈接,得到下一步將要處理的URL鏈接。接著,進行如下的工作:
(1)將解析的新URL鏈接放入TODO(待處理)隊列。
(2) 處理完畢后,放入visited表,再次從TODO隊列中取出一個URL鏈接。
(3) 針對這個鏈接,重復上述過程,直到TODO隊列為空結束。
而分布式爬蟲,其原理也是如此。只是抓取頁面是在多個從節(jié)點上并行完成,各個節(jié)點之間相互通信,協(xié)同工作。
1.2 分布式爬蟲的分類
各大公司采用的分布式爬蟲,按照系統(tǒng)架構來分的話,主要分為三大類:主從模式,自治模式和混合模式[5]。
1.2.1 主從模式
主從模式是指由一臺主機作為 Master控制節(jié)點,負責對所有運行網(wǎng)絡爬蟲的 Slave節(jié)點進行管理,爬蟲只需要從控制節(jié)點那里接收任務,并把新生成任務提交給控制節(jié)點就可以了,在這個過程中不必與其他爬蟲通信,這種方式實現(xiàn)簡單利于管理。而控制節(jié)點則需要與所有爬蟲進行通信,它需要一個地址列表來保存系統(tǒng)中所有爬蟲的信息。當系統(tǒng)中的爬蟲數(shù)量發(fā)生變化時,協(xié)調者需要更新地址列表里的數(shù)據(jù),這一過程對于系統(tǒng)中的爬蟲是透明的。這種模式結構清新簡單,便于拓展從機節(jié)點,任務分配效率高。但是隨著爬蟲網(wǎng)頁數(shù)量的增加,控制節(jié)點會成為整個系統(tǒng)的瓶頸而導致整個分布式網(wǎng)絡爬蟲系統(tǒng)性能下降[6]。主從模式的整體結構如圖 2所示:
圖2 主從模式結構圖Fig.2 Master-slave diagram
1.2.2 自治模式
自治模式是指系統(tǒng)中沒有控制者,所有的爬蟲都必須相互通信。所有爬蟲都可以相互發(fā)送信息,每個網(wǎng)絡爬蟲會維護一個地址列表,表中存儲著整個系統(tǒng)中所有爬蟲的位置,每次通信時可以直接把數(shù)據(jù)發(fā)送給需要此數(shù)據(jù)的爬蟲[7]。當系統(tǒng)中的爬蟲數(shù)量發(fā)生變化時,每個爬蟲的地址列表都需要進行更新。這種模式系統(tǒng)的健壯性比較高,不會因為某個節(jié)點出現(xiàn)故障而導致系統(tǒng)無法工作。但是,它的結構比較復雜,節(jié)點之間的大量通信,影響了爬蟲的工作效率。并且容易造成負載的不均衡。
1.2.3 混合模式
混合模式是結合上面兩種模式的特點的一種折衷[8]。該模式所有的爬蟲都可以相互通信同時都具有任務分配功能。爬蟲中有個特殊的節(jié)點,該節(jié)點主要功能對已經(jīng)經(jīng)過爬蟲任務分配后無法分配的任務進行集中分配。使用這個方式的每個網(wǎng)絡爬蟲只需維護自己采集范圍的地址列表。特殊節(jié)點需除了保存自己采集范圍的地址列表外還保存需要進行集中分配的地址列表[9]。
本系統(tǒng)從流程圖、數(shù)據(jù)庫表結構、代碼實現(xiàn)三部分來闡述系統(tǒng)實現(xiàn),鑒于篇幅,這部分列出了實現(xiàn)本系統(tǒng)各模塊的部分流程圖、關鍵代碼及實現(xiàn)后的截圖。
2.1 系統(tǒng)架構
我們設計的分布式爬蟲采用主從式架構,系統(tǒng)分為 Client,Master和 Slave三個主要部分。其中Client負責向Master提交爬取任務和獲取任務的執(zhí)行結果;Master負責任務調度和集群資源的管理,將任務分配到Slave節(jié)點執(zhí)行,并同時與Slave通信,實時監(jiān)測任務的執(zhí)行和調度情況;Slave節(jié)點負責管理各自節(jié)點的資源,完成 Mater分配的爬蟲任務,將爬取的數(shù)據(jù)存入MongoDB數(shù)據(jù)庫。另外,Redis負責存儲所有Slave節(jié)點的待爬取URL隊列和已爬取URL隊列,由Master和Slave共同維護和存取,同時記錄每個爬取任務的執(zhí)行狀態(tài)。其主要的架構如圖3所示。
在Master上,由Master維護,直接放在數(shù)據(jù)庫Redis上,所有的Slave節(jié)點和Master節(jié)點均可以通過互聯(lián)網(wǎng)訪問Redis數(shù)據(jù)庫。之所以采用Redis數(shù)據(jù)庫來存取極其重要的 URL隊列,主要是考慮到其存取速度快、可拓展、操作簡單的特點[10-11]。這樣的設計,就大大減少了Master節(jié)點維護URL隊列所需要付出的資源,減少了與Slave節(jié)點的通信量。Master節(jié)點只需要將種子 URL存入 Redis待爬取隊列,然后分配任務給 Slave節(jié)點,Slave節(jié)點接受到任務后,啟動爬蟲進程,從Redis獲取URL開始爬取工作。同時,Slave節(jié)點可以完全按照自己的負載能力,按需從Redis取出URL,而不用 Master采取復雜的管控策略,既達到負載均衡的目的,又大大簡化了系統(tǒng)的復雜性,使得系統(tǒng)更加穩(wěn)定。
圖3 系統(tǒng)結構圖Fig.3 System structure diagram
2.2 系統(tǒng)的工作機制
系統(tǒng)任務的工作過程,大體可以簡化成如步驟:用戶提交爬取任務→Master管理任務隊列→調度任務給 Slave→Slave執(zhí)行爬蟲工作→返回工作結果→任務完成。圖4給出了系統(tǒng)詳細的工作流程圖。
Client主要是提供給用戶的一個系統(tǒng)接口,方便用戶使用該系統(tǒng),它的主要功能如下:
(1)向Master提交爬取任務(種子URL)。
(2)查看任務的執(zhí)行狀態(tài)。
(3)查看Slave節(jié)點的系統(tǒng)狀態(tài)。
Master節(jié)點是系統(tǒng)最為重要的一個組成部分,它主要負責為Client提供使用接口,與Slave通信,管理整個系統(tǒng),分配和調度 Slave節(jié)點工作等,主要功能如下:
(1)與Client進行交互,為其提供功能接口。
(2)與Slave節(jié)點心跳通信。
(3)管理任務隊列,初始化爬取URL隊列。
(4)監(jiān)測各個節(jié)點的工作情況和系統(tǒng)狀態(tài),管理Slave節(jié)點。
(5)根據(jù) Slave節(jié)點的狀況,動態(tài)地分配爬蟲任務給Slave節(jié)點。
Slave作為任務執(zhí)行的節(jié)點,其最主要的工作就是與Master通信,獲取任務分片,然后啟動爬蟲爬取頁面,并將爬取的頁面寫入數(shù)據(jù)庫和本地磁盤,
主要功能如下:
(1)與Master心跳通信。
(2)管理本地資源,監(jiān)測自身狀態(tài)。
(3)接受Master分配的任務分片。
(4)啟動爬蟲,進行頁面爬取,并將爬取的頁面數(shù)據(jù)寫入數(shù)據(jù)庫和本地磁盤。
(5)向Master匯報自己的任務執(zhí)行情況。
2.3 系統(tǒng)主要核心模塊
基于篇幅的原因,本文主要介紹整個系統(tǒng)的核
心功能模塊:爬蟲模塊。爬蟲模塊由 Slave啟動調
用。其結構如圖5所示。
其基本的流程圖如圖6所示。
其中,由于是分布式爬蟲,所以URL去重是提
圖4 系統(tǒng)工作流程圖Fig.4 System workflow diagram
圖5 爬蟲模塊結構圖Fig.5 Crawler module structure diagram
升爬蟲效率的一個關鍵手段,即所有的爬蟲節(jié)點在接收到任務分片后,不會重復的爬取同一個頁面。它的實現(xiàn)方式是將所有爬蟲需要爬取的 URL隊列和已爬取的URL隊列放在共享的Redis數(shù)據(jù)庫中,爬蟲節(jié)點從該共享隊列中按需取出URL進行爬取,已經(jīng)爬過的頁面不會重復爬取,這樣就保證了URL
隊列的一致性,提高爬蟲效率。
圖6 爬蟲工作流程圖Fig.6 Crawler workflow chart
網(wǎng)絡爬蟲一直作為互聯(lián)網(wǎng)抓取信息的一個重要手段,在現(xiàn)今這個互聯(lián)網(wǎng)高速發(fā)展的時代,互聯(lián)網(wǎng)數(shù)據(jù)急劇膨脹的時代,我們更需要性能更加優(yōu)良,效率更高,可以定制化的分布式網(wǎng)絡爬蟲,來獲取更多、更有價值的數(shù)據(jù),用于信息檢索、科學研究、大數(shù)據(jù)分析等等。本文采用 Redis設計實現(xiàn)了一個主從式分布式網(wǎng)絡爬蟲系統(tǒng),用于快速、穩(wěn)定、可拓展地爬取海量的Web資源。系統(tǒng)實現(xiàn)了分布式爬蟲的核心框架,可以完成絕大多數(shù)Web內(nèi)容的爬取,并且節(jié)點易于拓展,爬取內(nèi)容可以定制,主從結構使得系統(tǒng)穩(wěn)定且便于維護。
當然,本系統(tǒng)也存在著不足之處:(1)主節(jié)點對系統(tǒng)資源、Slave節(jié)點的管理任務分配的策略并非最優(yōu);(2)還沒有完成全自動化腳本,做到一鍵部署整個系統(tǒng);(3)只能抓取靜態(tài)的HTML頁面,對于動態(tài)請求的,非HTML類型的網(wǎng)頁數(shù)據(jù)不能抓取;(4)沒有實現(xiàn)增量式的爬蟲策略,對于較大規(guī)模的web,系統(tǒng)會出現(xiàn)一些小的錯誤,并且還是會存在資源浪費的情況。
以后的工作可以從以下幾個方面著手:(1)改進任務調度和分配策略,加強對Slave節(jié)點的管理;(2)實現(xiàn)半自動化部署;(3)考慮動態(tài)的、其他類型的頁面,增加爬蟲的覆蓋率;(4)結合增量爬蟲的相關理論,減少爬取資源的浪費,提高爬取效率。
[1] 周京暉. 集成消息服務和定時通知的分布式內(nèi)存數(shù)據(jù)庫[J].軟件, 2013, 34(1): 89-92.
[2] 劉曉婉, 胡燕祝, 艾新波. 開源中文分詞器在web搜索引擎中的應用[J]. 軟件, 2013, 34(3): 80-83.
[3] 鄭力明, 李曉冬, 羅建祿. 服務器與集群系統(tǒng)節(jié)能技術研究[J]. 軟件, 2013, 34(4): 59-61.
[4] 庫勞里斯(英). 分布式系統(tǒng)概念與設計(原書第5版)[M].北京: 機械工業(yè)出版社, 2012.李婷. 分布式爬蟲任務調度和AJAX頁面抓取[D]. 成都電子科技大學碩士學位論文, 2015.
[5] 黃志敏, 曾學文. 一種基于Kademlia的全分布式爬蟲集群方法[J]. 計算機科學, 2014.3.
[6] 袁威, 薛安榮, 周小梅. 基于Nutch的分布式爬蟲的優(yōu)化研究[J]. 無線通信技術, 2014. 08.
[7] 吳黎兵, 柯亞林, 何炎祥. 分布式網(wǎng)絡爬蟲的設計與實現(xiàn)[J]. 計算機應用與軟件, 2011.11.
[8] 范珊珊, 李石君. 基于優(yōu)先級隊列的分布式多主題爬蟲[J].計算機工程與設計, 2015.06.
[9] Yun Qi Gao, Chun Lin Peng. Design and Implementation of Distributed Crawler System for Opinion Mining[J]. Applied Mechanics and Materials., 2013(347).
[10] Shaojun Zhong. A Web Crawler System Design Based on Distributed Technology. Journal of Networks[J], 2011.12.
Design and Implementation of a Distributed Crawler System Based on Redis
LUO Jiao-min, GENG Qian
(Department of information engineering, Nanhang Jicheng College, Nanjing Jiangshu, 211156)
With the rapid development of Internet technology, the Internet information and resources are exponentially explosive growth. How to quickly and effectively obtain valuable information from a large amount of web pages for search engines and scientific research is a key and important infrastructure project. Distributed web crawler has obvious advantages in speed and scale, which can adapt to the massive growth of data, and provide efficient, fast and stable Web data crawling. In this paper, Redis is used to design and implement a master-slave distributed network crawler system, which can be used for fast, stable and scalable crawling Web resources. The system realizes the core framework of the distributed crawler, which can complete the crawling of the vast majority of Web content, and the nodes are easy to expand, the crawling content can be customized, and the master-slave structure makes the system stable and easy to maintain.
: Redis; Distribute; Master-slave; Crawler system
TP393.07
A
10.3969/j.issn.1003-6970.2017.10.015
本文著錄格式:羅嬌敏,耿茜. 一種基于Redis的分布式爬蟲系統(tǒng)設計與實現(xiàn)[J]. 軟件,2017,38(10):83-87
湖北省自然科學基金資助項目“面向數(shù)字取證的數(shù)據(jù)約簡技術研究”(2015CFB764)
羅嬌敏(1984-),女,講師,主要研究方向:數(shù)據(jù)挖掘、分布式系統(tǒng);耿茜(1963-),女,副教授,主要研究方向:信息技術。