方宇浩,倪勝巧(四川大學(xué)計(jì)算機(jī)學(xué)院,成都610065)
網(wǎng)頁監(jiān)控分布式爬蟲
方宇浩,倪勝巧
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都610065)
互聯(lián)網(wǎng)的飛速發(fā)展,改變?nèi)藗儷@取信息的方式,互聯(lián)網(wǎng)漸漸取代傳統(tǒng)媒體,現(xiàn)在每天都有海量的信息在互聯(lián)網(wǎng)上更新著,如今世界已經(jīng)進(jìn)入到以數(shù)據(jù)為中心的大數(shù)據(jù)時代。提出一種監(jiān)控這些數(shù)據(jù)的分布式爬蟲技術(shù),以及一種基于網(wǎng)頁結(jié)構(gòu)的提取網(wǎng)頁更新內(nèi)容的算法。
爬蟲;分布式系統(tǒng);消息隊(duì)列
隨著互聯(lián)網(wǎng)的發(fā)展,從互聯(lián)網(wǎng)獲取消息漸漸取代了傳統(tǒng)媒體,如電視、報紙等。但是互聯(lián)網(wǎng)的爆炸式增長導(dǎo)致消息也是爆炸式地增長,各種網(wǎng)站每天更新著海量的信息。要采集這些海量的信息,依賴計(jì)算機(jī)單機(jī)處理能力的集中式網(wǎng)絡(luò)爬蟲無法滿足快速獲取大量資源的需求[1],分布式網(wǎng)絡(luò)爬蟲有良好的擴(kuò)展性,可分布于不同地點(diǎn),能滿足人們對信息采集的實(shí)際需求[2]。
系統(tǒng)結(jié)構(gòu)見圖1,該分布式監(jiān)控系統(tǒng)使用一個消息隊(duì)列將各部分聯(lián)系起來,很好的解耦合。初始化模塊將任務(wù)寫入job_queue中,各個爬蟲客戶端從job_queue中獲取任務(wù),并采集信息,將采集好的信息寫入task_queue,最后由控制模塊將task_queue的數(shù)據(jù)處理后寫入到數(shù)據(jù)庫。并在各個模塊配置supervisor監(jiān)控各個模塊的進(jìn)程,如果出現(xiàn)異常進(jìn)程結(jié)束則重啟這個進(jìn)程。
1.1消息隊(duì)列
消息隊(duì)列是一種進(jìn)程間通信或同一進(jìn)程的不同線程間的通信方式,軟件的隊(duì)列用來處理一系列的輸入,通常是來自使用者。消息隊(duì)列提供了異步的通信協(xié)議,每一個隊(duì)列中的記錄包含詳細(xì)說明的資料,包含發(fā)生的時間、輸入裝置的種類,以及特定的輸入?yún)?shù),消息的發(fā)送者和接收者不需要同時與消息隊(duì)列互交[3]。消息會保存在隊(duì)列中,直到接收者取回它。
分布式監(jiān)控系統(tǒng)使用消息隊(duì)列進(jìn)行任務(wù)的分發(fā)和收集,job_queue為爬蟲客戶端的任務(wù)隊(duì)列,task_queue為爬蟲端完成任務(wù)后寫入數(shù)據(jù)的隊(duì)列,控制端從這里獲取數(shù)據(jù)并分析數(shù)據(jù)最后寫入數(shù)據(jù)庫[4]。
圖1
1.2爬蟲客戶端
從消息隊(duì)列的job_queue獲取任務(wù),見圖2,任務(wù)為json格式{“baseUrl”:http://xxx.com”,“id”:123}。爬蟲端獲取任務(wù)后執(zhí)行當(dāng)前任務(wù),從Web獲取baseUrl頁面的HTML源代碼,然后解析HTML源代碼提取出頁面中的所有a標(biāo)簽對應(yīng)的text和url屬性。并按json格式{“baseUrl”:http://xxx.com”,”id”:123,”context”:[ {“url”:”xxx”,”text”:”yyy”}…]}寫入到task_queue。寫入task_queu之后向job_queue發(fā)送ack表明這個任務(wù)已完成,如果沒有收到ack,job_queue會在一段時間后將這個任務(wù)重新發(fā)送給爬蟲客戶端。在成功完成當(dāng)前任務(wù)后爬蟲客戶端繼續(xù)從job_queue獲取任務(wù)。
圖2
1.3控制模塊
控制模塊的初始化模塊定時從數(shù)據(jù)庫讀取所有需要監(jiān)控的網(wǎng)頁的id和url然后寫入到j(luò)ob_queue中,保證每隔一定時間爬蟲客戶端就會去爬取相關(guān)信息。控制模塊的處理模塊會一直讀取task_queue中的數(shù)據(jù),如果有新數(shù)據(jù)就讀出,然后把url做短鏈接處理,將url作為key在key-value的數(shù)據(jù)庫中查找去重。如果這個url是新的,那么這個數(shù)據(jù)也是剛更新的,將其寫入到數(shù)據(jù)庫中。
1.4監(jiān)控模塊
在生產(chǎn)環(huán)境中會遇到各種奇怪的數(shù)據(jù)或者傳輸錯誤導(dǎo)致各個模塊因此而產(chǎn)生異常,該模塊可能沒有考慮到所有的異常,導(dǎo)致該模塊掛掉。該系統(tǒng)結(jié)構(gòu)的特殊性,可以直接重啟任何模塊而不影響最后的結(jié)果,所以可以直接用一個監(jiān)控模塊監(jiān)控各個已經(jīng)啟動的進(jìn)程,如果該進(jìn)程異常退出就直接重啟這個進(jìn)程。
2.1提取網(wǎng)頁更新內(nèi)容算法
網(wǎng)頁更新內(nèi)容,該系統(tǒng)主要關(guān)注各大門戶網(wǎng)站以及各單位網(wǎng)站,監(jiān)控其首頁,當(dāng)有更新的時候需要提取出更新內(nèi)容以及相關(guān)鏈接。整個網(wǎng)頁可以看作一個HTML DOM樹,樹的節(jié)點(diǎn)是每一個HTML標(biāo)簽,如〈head>、〈body>、〈a>等,基本所有的網(wǎng)站的更新內(nèi)容都出現(xiàn)在〈a>標(biāo)簽中,內(nèi)容為〈a>標(biāo)簽的text屬性,鏈接為〈a>標(biāo)簽的href屬性。
第一步就是對網(wǎng)頁HTML的解析,生成HTML DOM樹,對于一些常見的HTML標(biāo)簽不閉合的錯誤要進(jìn)行相應(yīng)的處理。然后用廣度優(yōu)先搜索方法遍歷HTML DOM樹,找出所有的〈a>標(biāo)簽將其放入到一個列表中,然后遍歷該列表提取出所有〈a>標(biāo)簽的text和href屬性。使用短鏈接算法將href屬性里面的url進(jìn)行處理[5],該系統(tǒng)使用的短鏈接算法為62進(jìn)制算法,每位由[a-z,A-z,0-9]62個字母組成,長度為6位,總共可以表示626=56800235584種組合。使用短鏈接算法的目的主要是為了加速key-value數(shù)據(jù)庫的查找,因?yàn)橐话鉼rl都比較長,而使用短鏈接算法處理過后只有6位,數(shù)據(jù)庫在查找時不管基于什么實(shí)現(xiàn)都要基于key字符串的長度,該短鏈接處理減少了key字符串的長度,因此大大減少key的查找時間。
第二步是將上一步處理后的短鏈接作為key在key-value數(shù)據(jù)庫中去查找,判斷該短鏈接是否已經(jīng)出現(xiàn)過,如果沒有則說明這個url是第一次出現(xiàn)在這個頁面上,也就是這條信息是新更新的[6],那么將這個key寫入數(shù)據(jù)庫,并標(biāo)記這個〈a>標(biāo)簽是新內(nèi)容,然后將該標(biāo)簽對應(yīng)的text作為更新內(nèi)容寫入到指定的數(shù)據(jù)庫[7]。
2.2系統(tǒng)容錯
該系統(tǒng)要做到的就是在無人監(jiān)管的情況下可以正常長時間運(yùn)行。該系統(tǒng)使用消息隊(duì)列將各個模塊解耦,各個模塊相互獨(dú)立。對于消息隊(duì)列來說要做到的就是數(shù)據(jù)持久化和數(shù)據(jù)重傳。持久化就是用于消息隊(duì)列服務(wù)宕機(jī)的時候保證重啟消息隊(duì)列數(shù)據(jù)還在,而數(shù)據(jù)重傳則用于某個爬蟲客戶端宕機(jī)時能夠?qū)砥淙蝿?wù)重新分配給其他爬蟲客戶端。持久化即將消息隊(duì)列按一定的格式寫入到硬盤或者數(shù)據(jù)庫,保證出錯后數(shù)據(jù)依然存在,可以從硬盤或者數(shù)據(jù)庫恢復(fù)。消息重傳要求各個從消息隊(duì)列獲取消息的客戶端在處理完之后必須向消息隊(duì)列返回一個消息,如果在一定時間內(nèi)沒返回說明該客戶端宕機(jī),該條消息應(yīng)該被重新發(fā)送給其他客戶端重新處理。
對于各個模塊來說必須配有監(jiān)控模塊,各個模塊都由監(jiān)控模塊啟動,并記錄它們進(jìn)程的PID,監(jiān)控模塊定期檢查這些進(jìn)程的PID是否存在,如果不存在說明進(jìn)程異常退出,重啟該模塊,重啟并不會對結(jié)果有任何影響。
本文給出了一種網(wǎng)頁監(jiān)控分布式爬系統(tǒng)架構(gòu),以及一種基于網(wǎng)頁結(jié)構(gòu)的網(wǎng)頁更新內(nèi)容的提取算法。該架構(gòu)具有很好的魯棒性,高效地運(yùn)行于大部分系統(tǒng),并且系統(tǒng)具有良好的擴(kuò)展性,滿足對于信息采集的不同需求。
[1]Novak B.A Survey of Focused Web Crawling Algorithms[J],2004
[2]Brewington BE,Cybenko G.2000b.Keeping up with the Changing Web[J].Computer,2000:52~58
[3]Campos R,Rojas O,Marin M,et al.Distributed Ontology-Driven Focused Crawling[C].Parallel,Distributed and Network-Based Processing(PDP),2013 21st Euromicro International Conference on.IEEE,2013:108~115
[4]De Bra P,Houben G J,Kornatzky Y,et al.Information Retrieval in Distributed Hypertexts[C].RIAO,1994:481~493
[5]Pal A,Tomar D S,Shrivastava S C.Effective Focused Crawling Based on Content and Link Structure Analysis[J].arXiv Preprint arXiv: 0906.5034,2009
[6]Amitay E.Using Common Hypertext Links to Identify the Best Phrasal Description of Target Web Documents[C].Proceedings of the SIGIR,1998,98
[7]Diligenti M,Coetzee F,Lawrence S,et al.Focused Crawling Using Context Graphs[C].VLDB.2000:527~534
Distributed Web Monitoring Crawler
FANG Yu-hao,NI Sheng-qiao
(College of Computer Science,Sichuan University,Chengdu 610065)
Internet is under rapid development and changing the way of obtaining information in life vividly,it is also on the way to replace traditional media.Countless information are updated on the Internet every day,which means the whole world has in fact stepped into another era,the era of big data.Proposes a distributed system crawler to monitor the data and an algorithm to extract Web updated content based on Web structure.
Crawler;Distributed System;Message Queue
1007-1423(2015)11-0062-03
10.3969/j.issn.1007-1423.2015.11.012
方宇浩(1990-),男,四川都江堰人,碩士研究生,研究方向?yàn)闄C(jī)器智能
倪勝巧(1982-),男,浙江金華人,在讀博士,講師,研究方向?yàn)闄C(jī)器智能
2015-02-12
2015-03-18