馮 玲,黃 亮*,曾李陽,朱齊華
(1.昆明理工大學(xué) 國土資源工程學(xué)院,云南 昆明 650093; 2. 國家測繪地理信息局四川基礎(chǔ)地理信息中心,四川 成都 610041)
GIS是一門以數(shù)據(jù)為基礎(chǔ)的學(xué)科,空間分析、空間統(tǒng)計(jì)和空間數(shù)據(jù)挖掘等研究都離不開空間數(shù)據(jù)的支撐,而互聯(lián)網(wǎng)中存在海量空間數(shù)據(jù),這些數(shù)據(jù)與人們的日常生活活動(dòng)密切相關(guān)并且包含的信息量十分豐富、現(xiàn)勢性極強(qiáng)。如果能夠?qū)ヂ?lián)網(wǎng)中廣泛存在的空間數(shù)據(jù)高效地進(jìn)行獲取,一方面可以補(bǔ)充基礎(chǔ)地理信息的不足,提供豐富的細(xì)節(jié)和準(zhǔn)實(shí)時(shí)更新,另一方面還能夠?yàn)镚IS空間分析和空間數(shù)據(jù)挖掘提供信息量豐富、高時(shí)效性的數(shù)據(jù)源。
Web空間數(shù)據(jù)獲取主要采用網(wǎng)絡(luò)爬蟲技術(shù),國內(nèi)外許多學(xué)者在這方面進(jìn)行了研究。Leasure D R指出,利用網(wǎng)絡(luò)爬蟲技術(shù),可以豐富GIS空間分析的數(shù)據(jù)來源[1]。 Tezuka T等研究提出的網(wǎng)絡(luò)爬蟲技術(shù)降低了Web空間數(shù)據(jù)獲取的難度[2]。Zhang C J提出了基于網(wǎng)絡(luò)爬蟲技術(shù)的地名地址庫更新方法[3]。Hua-Ping Zhang等研究了從互聯(lián)網(wǎng)新聞報(bào)道中自動(dòng)提取POI數(shù)據(jù)的方法[4]。Li W研究了基于網(wǎng)絡(luò)爬蟲的OGC服務(wù)發(fā)現(xiàn)方法[5]。Chen X基于網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)了自動(dòng)化發(fā)現(xiàn)和檢索WMS服務(wù)[6]。Jiang J研究了檢索WFS服務(wù)的網(wǎng)絡(luò)爬蟲[7]。王明軍在普通網(wǎng)絡(luò)爬蟲技術(shù)基礎(chǔ)上提出了空間敏感爬蟲的思想體系,并從多個(gè)方面對其進(jìn)行了闡述[8]。蔡地在研究開源網(wǎng)絡(luò)爬蟲框架的基礎(chǔ)上,提出通過多線程和異步I/O兩種策略來優(yōu)化Web空間數(shù)據(jù)的獲取效率[9]。Ager A則在研究中指出,如果能夠?qū)eb空間數(shù)據(jù)進(jìn)行有效的利用,將對GIS的發(fā)展產(chǎn)生深遠(yuǎn)的影響[10]。
通過分析國內(nèi)外研究現(xiàn)狀發(fā)現(xiàn),目前基于網(wǎng)絡(luò)爬蟲的Web空間數(shù)據(jù)獲取研究大多數(shù)采用單機(jī)網(wǎng)絡(luò)爬蟲的形式。然而,Web空間數(shù)據(jù)廣泛分布于不同的網(wǎng)絡(luò)站點(diǎn)中且更新頻率快,依賴單機(jī)網(wǎng)絡(luò)爬蟲抓取數(shù)據(jù)在抓取覆蓋率和效率上難以滿足需求,難以保證抓取數(shù)據(jù)的及時(shí)性和全面性,因此本文針對單機(jī)網(wǎng)絡(luò)爬蟲獲取Web空間數(shù)據(jù)存在的問題,研究基于分布式網(wǎng)絡(luò)爬蟲提高Web空間數(shù)據(jù)獲取效率。
基于分布式網(wǎng)絡(luò)爬蟲的Web空間數(shù)據(jù)獲取方法不是通過增加單個(gè)爬蟲系統(tǒng)的負(fù)荷而是通過增加更多的爬蟲系統(tǒng)成員來提高數(shù)據(jù)獲取性能和效率,即采用多臺(tái)性能一般的機(jī)器來做數(shù)據(jù)抓取,同時(shí)在每臺(tái)機(jī)器上部署多個(gè)爬蟲,增加數(shù)據(jù)抓取的并發(fā)性。具體的實(shí)現(xiàn)方式是采用不同的機(jī)器承擔(dān)不同的角色分工,選取一臺(tái)性能較好的機(jī)器專門負(fù)責(zé)URL(Uniform Resoure Locator,統(tǒng)一資源定位器)的統(tǒng)一調(diào)度和去重,將這臺(tái)機(jī)器稱為主節(jié)點(diǎn),主要用來管理和維護(hù)待爬取URL隊(duì)列和已爬取URL隊(duì)列。采用多臺(tái)性能一般的機(jī)器進(jìn)行實(shí)際的網(wǎng)頁下載和數(shù)據(jù)解析,把這些機(jī)器稱為爬蟲節(jié)點(diǎn)。
本文提出的分布式網(wǎng)絡(luò)爬蟲的運(yùn)行原理如圖1所示,爬蟲節(jié)點(diǎn)從主節(jié)點(diǎn)請求URL進(jìn)行數(shù)據(jù)抓取,在抓取數(shù)據(jù)的同時(shí)生成新的URL,并將此URL發(fā)送給主節(jié)點(diǎn),主節(jié)點(diǎn)負(fù)責(zé)對爬蟲節(jié)點(diǎn)提交的URL進(jìn)行去重,并將其加入待爬取URL隊(duì)列。爬蟲節(jié)點(diǎn)之間沒有通信聯(lián)系,每個(gè)爬蟲節(jié)點(diǎn)只和主節(jié)點(diǎn)進(jìn)行通信,主節(jié)點(diǎn)通過一個(gè)地址列表來保存系統(tǒng)中所有爬蟲節(jié)點(diǎn)的信息。因此,當(dāng)分布式網(wǎng)絡(luò)爬蟲系統(tǒng)中的節(jié)點(diǎn)有變化的時(shí)候(新增爬蟲節(jié)點(diǎn),刪除某爬蟲節(jié)點(diǎn),或爬蟲節(jié)點(diǎn)地址發(fā)生變化),主節(jié)點(diǎn)只需調(diào)整地址列表中數(shù)據(jù),爬蟲節(jié)點(diǎn)只需要負(fù)責(zé)抓取數(shù)據(jù)。同時(shí),主節(jié)點(diǎn)負(fù)責(zé)對分布式網(wǎng)絡(luò)爬蟲系統(tǒng)中各爬蟲節(jié)點(diǎn)進(jìn)行負(fù)載均衡。
圖1 分布式網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)原理圖Fig.1 Schematic diagram of distributed network crawler implementation
原型系統(tǒng)是根據(jù)上述分布式網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)思路,在主節(jié)點(diǎn)上部署Redis緩存數(shù)據(jù)庫來管理和維護(hù)分布式網(wǎng)絡(luò)爬蟲系統(tǒng)中各爬蟲節(jié)點(diǎn)共享的已爬取URL隊(duì)列和待爬取URL隊(duì)列,爬蟲節(jié)點(diǎn)之間沒有通信聯(lián)系,每個(gè)爬蟲節(jié)點(diǎn)都會(huì)與主節(jié)點(diǎn)Redis緩存服務(wù)器建立連接,并在每個(gè)爬蟲節(jié)點(diǎn)上部署MongoDB數(shù)據(jù)庫,用來存儲(chǔ)和管理抓取到的數(shù)據(jù)。分布式網(wǎng)絡(luò)爬蟲系統(tǒng)中單個(gè)爬蟲節(jié)點(diǎn)的系統(tǒng)架構(gòu)如圖2所示。
本文通過對開源網(wǎng)絡(luò)爬蟲框架Scrapy進(jìn)行深度開發(fā)來實(shí)現(xiàn)面向Web空間數(shù)據(jù)獲取的分布式網(wǎng)
圖2 爬蟲節(jié)點(diǎn)系統(tǒng)架構(gòu)Fig.2 Crawler node system architecture
絡(luò)爬蟲原型系統(tǒng)。Scrapy是一個(gè)爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的基于python語言的應(yīng)用框架[11],它基于Twisted異步網(wǎng)絡(luò)庫來管理網(wǎng)絡(luò)通訊[12]。開發(fā)者可以對Scrapy框架進(jìn)行擴(kuò)展以完成網(wǎng)絡(luò)爬蟲的定制,本文實(shí)現(xiàn)了定制的調(diào)度器、解析器、數(shù)據(jù)過濾器和下載器中間件,而下載器和爬蟲引擎則使用Scrapy框架自帶的模塊。表1為原型系統(tǒng)的開發(fā)環(huán)境。
表1 原型系統(tǒng)開發(fā)環(huán)境Tab.1 Prototype system development environment
本文使用四臺(tái)配置普通的PC機(jī)來進(jìn)行系統(tǒng)測試,選擇其中內(nèi)存較大的一臺(tái)部署為主節(jié)點(diǎn),在其上安裝Redis緩存數(shù)據(jù)庫用于維護(hù)待爬取URL隊(duì)列和已爬取URL隊(duì)列。使用另外三臺(tái)PC機(jī)進(jìn)行實(shí)際的網(wǎng)頁下載和數(shù)據(jù)解析,在其上安裝python環(huán)境和MongoDB數(shù)據(jù)庫,將其作為爬蟲節(jié)點(diǎn),測試時(shí)的網(wǎng)絡(luò)帶寬為8 Mb/s。
為了避免網(wǎng)絡(luò)流量對實(shí)驗(yàn)測試產(chǎn)生影響,將系統(tǒng)測試時(shí)間定于晚上10點(diǎn)至次日7點(diǎn),系統(tǒng)共運(yùn)行9個(gè)小時(shí)。分別對單機(jī)爬蟲和分布式網(wǎng)絡(luò)爬蟲系統(tǒng)進(jìn)行了測試,單機(jī)爬蟲的測試結(jié)果如表2所示。
表2 單機(jī)爬蟲測試結(jié)果Tab.2 Single crawler test results
分布式網(wǎng)絡(luò)爬蟲的測試結(jié)果如表3所示。
表3 分布式網(wǎng)絡(luò)爬蟲測試結(jié)果Tab.3 Test results of distributed network crawler
將實(shí)驗(yàn)數(shù)據(jù)結(jié)果繪制成折線圖,實(shí)驗(yàn)結(jié)果如圖3所示。
由圖3可知,分布式網(wǎng)絡(luò)爬蟲系統(tǒng)中三個(gè)爬蟲節(jié)點(diǎn)抓取數(shù)據(jù)的總數(shù)與運(yùn)行時(shí)間可近似視為正比例關(guān)系,這說明原型系統(tǒng)能夠穩(wěn)定地運(yùn)行。分析此圖的橫縱坐標(biāo)可以得出,每條線的斜率就是數(shù)據(jù)爬取效率,采用分布式網(wǎng)絡(luò)爬蟲抓取數(shù)據(jù)的效率遠(yuǎn)高于單機(jī)爬蟲,這說明本文設(shè)計(jì)實(shí)現(xiàn)的分布式網(wǎng)絡(luò)爬蟲系統(tǒng)具有良好的擴(kuò)展性。測試過程中,每個(gè)爬蟲節(jié)點(diǎn)抓取數(shù)據(jù)的情況如圖4所示。
圖3 分布式網(wǎng)絡(luò)爬蟲測試結(jié)果圖Fig.3 Test results of distributed web crawler
圖4 單機(jī)與并行節(jié)點(diǎn)性能對比圖Fig.4 Comparison of performance between stand-alone and parallel nodes
由圖4可知,當(dāng)采用分布式網(wǎng)絡(luò)爬蟲系統(tǒng)進(jìn)行爬取時(shí),其所包含的每個(gè)節(jié)點(diǎn)的爬取效率同單機(jī)爬蟲相比有所下降,但是這個(gè)下降是在正常范圍之內(nèi),因?yàn)槎鄠€(gè)節(jié)點(diǎn)同時(shí)運(yùn)行時(shí)共用同一條對外網(wǎng)絡(luò)接口,網(wǎng)絡(luò)帶寬成了并行爬行的主要瓶頸。同時(shí)從圖4中還可以得知,節(jié)點(diǎn)一、節(jié)點(diǎn)二、節(jié)點(diǎn)三的所承擔(dān)的爬取任務(wù)數(shù)量基本相同,這說明本文設(shè)計(jì)和實(shí)現(xiàn)的分布式網(wǎng)絡(luò)爬蟲系統(tǒng)能夠?qū)崿F(xiàn)系統(tǒng)各個(gè)節(jié)點(diǎn)之間負(fù)載均衡。
本文針對單機(jī)網(wǎng)絡(luò)爬蟲獲取Web空間數(shù)據(jù)在抓取覆蓋率和抓取效率上受到限制,難以保證抓取數(shù)據(jù)的及時(shí)性和全面性的問題,研究了基于分布式網(wǎng)絡(luò)爬蟲的Web空間數(shù)據(jù)獲取方法。通過實(shí)驗(yàn)分析對比證明,本文提出的基于分布式網(wǎng)絡(luò)爬蟲的Web空間數(shù)據(jù)獲取方法能夠提高Web空間數(shù)據(jù)獲取效率,設(shè)計(jì)和實(shí)現(xiàn)的Web空間數(shù)據(jù)獲取原型系統(tǒng)能夠穩(wěn)定運(yùn)行,并且系統(tǒng)具有良好的擴(kuò)展性,系統(tǒng)各個(gè)節(jié)點(diǎn)之間能夠?qū)崿F(xiàn)負(fù)載均衡。