黃詩(shī)涵 韋廷岳 靳一飛 黃猛
摘? 要:網(wǎng)絡(luò)技術(shù)快速發(fā)展,信息資源多種多樣,面對(duì)具有范圍廣、信息量大等特點(diǎn)的地震數(shù)據(jù)共享平臺(tái),如何快速又準(zhǔn)確地抓取有用的相關(guān)信息十分重要,因此爬蟲為該地震數(shù)據(jù)共享平臺(tái)的重要技術(shù)之一。構(gòu)建使用Docker部署的基于Golang的Crawlab的爬蟲框架進(jìn)行數(shù)據(jù)爬取及數(shù)據(jù)處理的地震數(shù)據(jù)共享平臺(tái),解決傳統(tǒng)爬蟲技術(shù)在面對(duì)龐大數(shù)據(jù)量時(shí)會(huì)出現(xiàn)的效率低下問題。
關(guān)鍵詞:地震數(shù)據(jù);地震數(shù)據(jù)共享;Golang;Docker;數(shù)據(jù)處理
中圖分類號(hào):TP391.3;P315.69? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2020)02-0028-02
Abstract:With the rapid development of network technology and a variety of information resources,the seismic data sharing platform with wide range and large amount of information is facing,it is very important to grasp useful information quickly and accurately in the face of the seismic data sharing platform with wide range and large amount of information. Therefore,crawler is one of the important technologies of the seismic data sharing platform. A crawler framework of Crawler based on Golang deployed by Docker is constructed to share seismic data for data crawling and data processing,so as to solve the inefficient problem of traditional crawler technology in the face of huge data volume.
Keywords:seismic data;seismic data sharing;Golang;Docker;data processing
0? 引? 言
由于地震數(shù)據(jù)涵蓋內(nèi)容多、范圍廣、動(dòng)態(tài)性強(qiáng)、數(shù)據(jù)量大等特點(diǎn),面向地震數(shù)據(jù)共享,我們要構(gòu)建一個(gè)覆蓋面廣泛、動(dòng)態(tài)性強(qiáng)、能夠?qū)崟r(shí)分享地震相關(guān)數(shù)據(jù)功能的地震數(shù)據(jù)共享平臺(tái)。因此該地震數(shù)據(jù)共享平臺(tái)研究中國(guó)歷史地震的地理位置分布,分析多震區(qū)和少震區(qū)地理位置的差異,實(shí)現(xiàn)中國(guó)歷史地震和斷裂帶在地圖上的展示功能,研究地震后群眾通過各大主流網(wǎng)絡(luò)平臺(tái)對(duì)地震的關(guān)注情況。地震數(shù)據(jù)共享平臺(tái)使用爬蟲技術(shù)去爬取在發(fā)生地震后群眾的關(guān)注數(shù)據(jù),以及各大主流網(wǎng)站信息的報(bào)道情況,使用數(shù)據(jù)清洗,將相同的數(shù)據(jù)去重,再對(duì)處理后的數(shù)據(jù)進(jìn)行數(shù)據(jù)挖掘,以實(shí)現(xiàn)對(duì)各主流網(wǎng)站在地震發(fā)生時(shí)最新發(fā)布的地震相關(guān)信息的實(shí)時(shí)動(dòng)態(tài)爬取和分析。
1? 使用爬蟲技術(shù)的原因
該地震數(shù)據(jù)共享平臺(tái)要以大量的地震相關(guān)數(shù)據(jù)作為實(shí)現(xiàn)技術(shù)和功能的基礎(chǔ),為了實(shí)現(xiàn)達(dá)到數(shù)據(jù)量大、動(dòng)態(tài)性強(qiáng)、受眾范圍廣等特點(diǎn)的地震數(shù)據(jù)共享平臺(tái)的構(gòu)建,需要進(jìn)行大量的數(shù)據(jù)挖掘工作,第一步就是獲取基礎(chǔ)信息數(shù)據(jù),對(duì)多個(gè)主流網(wǎng)站進(jìn)行信息獲取,如與地震有關(guān)的地震新聞、地震現(xiàn)場(chǎng)圖片、地震現(xiàn)場(chǎng)視頻以及相關(guān)報(bào)道等等。有了基礎(chǔ)地震相關(guān)數(shù)據(jù)后,并不能直接使用,而是要進(jìn)行一系列地震數(shù)據(jù)處理,將重復(fù)、虛假、無(wú)用的數(shù)據(jù)進(jìn)行剔除,經(jīng)過重重篩選之后再對(duì)剩下的地理數(shù)據(jù)進(jìn)行相關(guān)分析,分門別類存入不同的數(shù)據(jù)庫(kù)中,方便后期對(duì)地理數(shù)據(jù)的使用。因此需要使用具有多重篩選功能的爬蟲技術(shù)去實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容的部分展示。
2? 選擇基于Golang的Crawlab爬蟲框架的原因
當(dāng)前熱門的Python語(yǔ)言具有使用簡(jiǎn)單、功能強(qiáng)大、語(yǔ)言生態(tài)良好等特點(diǎn),但面對(duì)需要大量爬取信息的需求時(shí),Python作為一門腳本語(yǔ)言運(yùn)行速度慢,為了利用多核,Python開始支持多線程,而解決多線程之間數(shù)據(jù)完整性和狀態(tài)同步最簡(jiǎn)單的方法就是加鎖,于是使用了GIL(Global Interpreter Lock),越來(lái)越多的代碼庫(kù)開發(fā)者接受了這種設(shè)定后,開始大量依賴這種特性,GIL無(wú)疑就是一把全局排他鎖,全局鎖的存在會(huì)對(duì)多線程的效率有不小影響,甚至使Python幾乎等于一個(gè)單線程的程序。為了讓各個(gè)線程能夠平均利用CPU時(shí)間,Python會(huì)計(jì)算當(dāng)前已執(zhí)行的微代碼數(shù)量,達(dá)到一定閾值后就強(qiáng)制釋放GIL,而這時(shí)也會(huì)觸發(fā)一次操作系統(tǒng)的線程調(diào)度,這種模式在只有一個(gè)CPU核心的情況下沒有什么問題,但當(dāng)CPU有多個(gè)核心時(shí)就會(huì)出現(xiàn)問題?;贕IL的并發(fā)模型,其效率不足以滿足該項(xiàng)目的需要,而Golang作為谷歌推出的一門編程語(yǔ)言,具有部署簡(jiǎn)單、并發(fā)性好、語(yǔ)言設(shè)計(jì)良好、執(zhí)行性能好等優(yōu)勢(shì),且能夠快速編譯,高效執(zhí)行,易于開發(fā),兼具效率、性能、安全、健壯等特性,所以平臺(tái)的構(gòu)建選擇基于Golang語(yǔ)言的爬蟲調(diào)度框架。
由Golang來(lái)啟用多個(gè)Python進(jìn)程,克服Python并發(fā)效率問題的同時(shí)作為網(wǎng)絡(luò)爬蟲框架的處理模塊需要有三個(gè):下載器、分析器和條目處理管道,再加上控制模塊,就可以清晰地明白框架的劃分。根據(jù)這些,我們可以實(shí)現(xiàn)自定義的、自己需要的爬蟲框架的設(shè)計(jì)。而基于Golang的分布式爬蟲管理平臺(tái),支持多種編程語(yǔ)言,具有配置爬蟲、自動(dòng)提取字段、上傳爬蟲等功能。該框架主要解決的是大量爬蟲管理困難的問題,例如需要監(jiān)控上百個(gè)網(wǎng)站的項(xiàng)目,不容易做到同時(shí)管理,而且成本高且容易出錯(cuò),此時(shí)該框架可以幫助對(duì)所寫爬蟲進(jìn)行有效的監(jiān)控管理,成為該地震數(shù)據(jù)共享平臺(tái)的首選。
3? 地震數(shù)據(jù)共享平臺(tái)框架的介紹
該地震數(shù)據(jù)共享平臺(tái)的Crawlab爬蟲框架基于Golang的分布式爬蟲管理平臺(tái),支持Python、Node.js、Go、Java、PHP等多種編程語(yǔ)言。該框架的安裝有三種,第一種是基于Docker部署,第二種是直接部署,第三種是基于Kubernetes部署。這三種部署方式中,本文認(rèn)為基于Docker部署是比較方便且省時(shí)間的部署方式,故使用了Docker部署。
Docker是一個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的鏡像中,然后發(fā)布到任何流行的Linux或Windows機(jī)器上,也可以實(shí)現(xiàn)虛擬化。容器完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口。Docker可以利用已存在的鏡像幫助構(gòu)建一些常用的服務(wù)和應(yīng)用,例如Nginx、MongoDB、Redis等等。用Docker運(yùn)行一個(gè)MongoDB服務(wù)僅需docker run-d--name mongo-p 27017:27017 mongo一行命令。也可以使用docker-compose的方式部署,docker-compose是一種集群管理方式,可以利用名為docker-compose.yml的YAML文件來(lái)定義需要啟動(dòng)的容器,可以是單個(gè),但通常是多個(gè)的。環(huán)境配置是由Go第三方庫(kù)viper來(lái)實(shí)現(xiàn)的。當(dāng)程序啟動(dòng)時(shí),viper會(huì)去讀取YAML配置文件,以及將環(huán)境變量與配置文件中的變量對(duì)應(yīng)起來(lái)。
該框架主要包括四部分,分別是:節(jié)點(diǎn)、爬蟲、任務(wù)、定時(shí)任務(wù)。節(jié)點(diǎn)可以看作是一個(gè)服務(wù)器,負(fù)責(zé)執(zhí)行爬蟲提供API等功能。節(jié)點(diǎn)之間是可以相互通信的,節(jié)點(diǎn)通信主要通過Redis。該爬蟲框架可以自動(dòng)部署爬蟲,可以實(shí)現(xiàn)每60秒主節(jié)點(diǎn)將該節(jié)點(diǎn)上的爬蟲文件同步給所有在線節(jié)點(diǎn)。在爬蟲文件運(yùn)行一段時(shí)間之后,爬蟲會(huì)積累一些統(tǒng)計(jì)數(shù)據(jù),并將這些指標(biāo)進(jìn)行匯總。
該框架的架構(gòu)包括了一個(gè)主節(jié)點(diǎn)(Master Node)和多個(gè)工作節(jié)點(diǎn)(Worker Node),以及負(fù)責(zé)通信和數(shù)據(jù)儲(chǔ)存的Redis和MongoDB數(shù)據(jù)庫(kù)。前端應(yīng)用向主節(jié)點(diǎn)請(qǐng)求數(shù)據(jù),主節(jié)點(diǎn)通過MongoDB和Redis來(lái)執(zhí)行任務(wù)派發(fā)調(diào)度以及部署,工作節(jié)點(diǎn)收到任務(wù)之后,開始執(zhí)行爬蟲任務(wù),并將任務(wù)結(jié)果儲(chǔ)存到MongoDB。主節(jié)點(diǎn)是整個(gè)Crawlab架構(gòu)的核心,屬于Crawlab的中控系統(tǒng)。
4? 爬蟲數(shù)據(jù)處理的實(shí)現(xiàn)
在爬取相關(guān)數(shù)據(jù)后,要根據(jù)相關(guān)地震數(shù)據(jù)共享平臺(tái)對(duì)數(shù)據(jù)的需要,對(duì)已有數(shù)據(jù)進(jìn)行一系列的數(shù)據(jù)篩選,剔除掉重復(fù)、虛假、無(wú)用的數(shù)據(jù)信息。篩選結(jié)束后,再進(jìn)行自然語(yǔ)言處理,對(duì)數(shù)據(jù)分類聚類,信息檢索過濾,對(duì)數(shù)據(jù)進(jìn)行清洗,得到符合要求的數(shù)據(jù)。數(shù)據(jù)的清洗包括去除無(wú)效的數(shù)據(jù)、整理成規(guī)整的格式等等。經(jīng)過多重?cái)?shù)據(jù)處理后,還需要采用數(shù)據(jù)標(biāo)識(shí),根據(jù)數(shù)據(jù)的類型對(duì)處理后的數(shù)據(jù)分類標(biāo)注,為實(shí)現(xiàn)數(shù)據(jù)同步,先對(duì)全量數(shù)據(jù)拷貝,然后再采用增量的方式抓取更新時(shí)間或者檢查點(diǎn)以后的數(shù)據(jù)同步更新。經(jīng)過以上數(shù)據(jù)處理之后,將爬蟲篩選處理之后的數(shù)據(jù)進(jìn)行最后一步操作——插入數(shù)據(jù)庫(kù),這樣就完成了爬蟲數(shù)據(jù)相關(guān)處理的實(shí)現(xiàn)。
5? 結(jié)? 論
傳統(tǒng)的搜索雖然能給我們提供很多信息資源,但有時(shí)并不能滿足我們對(duì)具有范圍廣、量度大等特點(diǎn)的信息資源的獲取,因此需要我們使用爬蟲技術(shù)去從多角度獲取所需資源。所以爬蟲技術(shù)是本文構(gòu)建地震數(shù)據(jù)共享平臺(tái)應(yīng)用的主要技術(shù)之一,實(shí)現(xiàn)一個(gè)基于Golang的Crawlab爬蟲框架的搭建對(duì)于整個(gè)地震數(shù)據(jù)共享平臺(tái)有著十分重要的作用,其爬蟲框架的實(shí)現(xiàn)優(yōu)劣也直接影響到地震數(shù)據(jù)共享平臺(tái)的性能。
參考文獻(xiàn):
[1] 詹小艷,許紅梅,朱升初,等.江蘇省地震科學(xué)數(shù)據(jù)共享平臺(tái)技術(shù)研究 [J].防災(zāi)科技學(xué)院學(xué)報(bào),2012,14(1):57-63.
[2] 袁媛,尹京苑.上海地震科學(xué)數(shù)據(jù)共享服務(wù)平臺(tái)建設(shè) [J].華北地震科學(xué),2014,32(1):16-21.
[3] 高賢康.淺析Docker技術(shù)在Web服務(wù)系統(tǒng)中的應(yīng)用 [J].電腦迷,2017(6):55.
[4] 唐曉光.基于訂閱機(jī)制的數(shù)據(jù)共享平臺(tái)的研究與設(shè)計(jì) [D].大慶:東北石油大學(xué),2013.
[5] 田建勇.基于云計(jì)算的Web數(shù)據(jù)挖掘研究 [J].信息安全與技術(shù),2015,6(4):29-30.
[6] 孫冰.基于Python的多線程網(wǎng)絡(luò)爬蟲的設(shè)計(jì)與實(shí)現(xiàn) [J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2018(4): 38-39.
[7] 王靜.面向互聯(lián)網(wǎng)輿情分析的海量數(shù)據(jù)檢索模型關(guān)鍵技術(shù)研究 [D].北京:首都師范大學(xué),2013.
[8] 孫立偉,何國(guó)輝,吳禮發(fā).網(wǎng)絡(luò)爬蟲技術(shù)的研究 [J].電腦知識(shí)與技術(shù),2010,6(15):4112-4115.
作者簡(jiǎn)介:黃詩(shī)涵(2000.03-),女,漢族,河南駐馬店人,本科,學(xué)士學(xué)位,研究方向:人工智能和軟件開發(fā)應(yīng)用。