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