楊曉東 郜魯濤 楊林楠* 劉建陽(yáng)
1(云南農(nóng)業(yè)大學(xué)基礎(chǔ)與信息工程學(xué)院 云南 昆明 650201)2(云南省信息技術(shù)發(fā)展中心 云南 昆明 650228)
基于Hadoop平臺(tái)的農(nóng)產(chǎn)品價(jià)格數(shù)據(jù)爬取和存儲(chǔ)系統(tǒng)的研究
楊曉東1郜魯濤1楊林楠1*劉建陽(yáng)2
1(云南農(nóng)業(yè)大學(xué)基礎(chǔ)與信息工程學(xué)院 云南 昆明 650201)2(云南省信息技術(shù)發(fā)展中心 云南 昆明 650228)
目前許多大型農(nóng)貿(mào)市場(chǎng)和農(nóng)業(yè)信息商務(wù)平臺(tái)都在實(shí)時(shí)發(fā)布每天各地區(qū)不同農(nóng)產(chǎn)品的價(jià)格數(shù)據(jù)。針對(duì)數(shù)據(jù)更新快、數(shù)據(jù)量大、數(shù)據(jù)形式多樣,使數(shù)據(jù)的爬取和存儲(chǔ)以及后續(xù)的分析工作變得困難,提出基于Hadoop的農(nóng)產(chǎn)品價(jià)格爬取及存儲(chǔ)系統(tǒng)。利用HttpClient框架結(jié)合線程池通過多線程爬取,爬取結(jié)束后執(zhí)行完整性檢查,過濾出信息不完整的網(wǎng)頁(yè),進(jìn)行二次爬取直到信息完整。對(duì)爬取到的網(wǎng)頁(yè)使用正則表達(dá)式進(jìn)行解析和清洗,提取有用的數(shù)據(jù),以文本文件的形式存入HDFS(Hadoop Distributed File System ),此后爬取到的數(shù)據(jù)以追加的方式寫入HDFS 文件中。實(shí)驗(yàn)表明HDFS的寫入性能滿足爬取數(shù)據(jù)不斷遞增的現(xiàn)狀,副本數(shù)越少,數(shù)據(jù)塊越大,寫入性能越好。
分布式系統(tǒng) 爬蟲 Hadoop HDFS 正則表達(dá)式
隨著互聯(lián)網(wǎng)的快速發(fā)展,預(yù)計(jì)2020年全球數(shù)字規(guī)模將達(dá)到40 ZB[1],數(shù)據(jù)類型以結(jié)構(gòu)化、半結(jié)構(gòu)化和非結(jié)構(gòu)化三種為主,其中半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)的存儲(chǔ)是當(dāng)下面臨的主要問題。如今全國(guó)各地的大型農(nóng)貿(mào)交易市場(chǎng)和農(nóng)業(yè)信息商務(wù)平臺(tái),借助互聯(lián)網(wǎng)的實(shí)時(shí)性高、傳播速度快、覆蓋面廣等特點(diǎn),在實(shí)時(shí)發(fā)布農(nóng)產(chǎn)品價(jià)格,更新供需數(shù)據(jù)。出現(xiàn)價(jià)格數(shù)據(jù)不斷增加卻過于分散的情況,因此通過網(wǎng)絡(luò)爬蟲爬取相關(guān)網(wǎng)頁(yè),抽取有價(jià)值的數(shù)據(jù)進(jìn)行存儲(chǔ)和應(yīng)用十分重要。
Hadoop分布式框架支持海量存儲(chǔ),快速數(shù)據(jù)訪問的分布式處理,具有可擴(kuò)展性、失效轉(zhuǎn)移等特點(diǎn)[2-3]。其中HDFS是分布式文件系統(tǒng),提供高吞吐量的數(shù)據(jù)訪問,能存儲(chǔ)從GB級(jí)到TB級(jí)別大小的單個(gè)文件,以及數(shù)千萬(wàn)量級(jí)的文件數(shù)量。針對(duì)從農(nóng)產(chǎn)品價(jià)格網(wǎng)站爬取到的網(wǎng)頁(yè)大小不等,文件數(shù)量過多等特點(diǎn),HDFS不像其他文件系統(tǒng),一個(gè)小于數(shù)據(jù)塊大小的文件占據(jù)整個(gè)塊。
HDFS文件系統(tǒng)將元數(shù)據(jù)文件存儲(chǔ)在Namenode節(jié)點(diǎn)的內(nèi)存中,因此存儲(chǔ)的文件總數(shù)與Namenode的內(nèi)存容量密切相關(guān)。文獻(xiàn)[4]-文獻(xiàn)[7]針對(duì)HDFS文件系統(tǒng)的弊端,分別提出了優(yōu)化方案,使文件存儲(chǔ)數(shù)量和寫入效率都有了提升。本文存儲(chǔ)的文件普遍在百兆以上,不斷爬取數(shù)據(jù)進(jìn)行追加操作,會(huì)使單個(gè)文件的大小不斷增大,而文件數(shù)量不會(huì)增加。針對(duì)HDFS文件系統(tǒng)的不同配置,進(jìn)行寫入性能的測(cè)試和比較。
本系統(tǒng)針對(duì)特定農(nóng)產(chǎn)品價(jià)格網(wǎng)站進(jìn)行數(shù)據(jù)爬取,系統(tǒng)總共分為4個(gè)模塊:爬取、完整性檢查、解析、HDFS存儲(chǔ)。爬蟲系統(tǒng)基于Hadoop框架通過URL并行爬取網(wǎng)頁(yè),針對(duì)不同網(wǎng)頁(yè)的內(nèi)容分類方式,根據(jù)需要設(shè)定爬取深度為n,保證數(shù)據(jù)爬取的完整性。在爬取過程中,由于網(wǎng)絡(luò)或者被爬取網(wǎng)站所在服務(wù)器的穩(wěn)定性,可能導(dǎo)致網(wǎng)頁(yè)爬取失敗。所以每次發(fā)起Http請(qǐng)求都會(huì)驗(yàn)證返回值,保證請(qǐng)求成功。使用正則表達(dá)式對(duì)網(wǎng)頁(yè)進(jìn)行解析,將解析得到的數(shù)據(jù)以文本文件格式存入HDFS。抽取特定標(biāo)簽中包含的URL放入請(qǐng)求函數(shù)中,循環(huán)執(zhí)行上述過程直到爬取深度達(dá)到n值。
1.1 爬蟲基本原理
網(wǎng)絡(luò)爬蟲的主要作用是從網(wǎng)上下載網(wǎng)頁(yè)進(jìn)行使用,可以建立索引提供搜索引擎的功能,解析其中的數(shù)據(jù)進(jìn)行分析挖掘等[8-14]。其基本工作原理如下:首先初始化一個(gè)URL,判斷該URL是否處理過,如果沒有,則根據(jù)要求遍歷該URL中的鏈接地址,爬取所有遍歷的網(wǎng)頁(yè)直到結(jié)束。然后根據(jù)一定的遍歷算法傳入新的初始化URL,繼續(xù)遍歷鏈接,爬取網(wǎng)頁(yè),直到待初始化隊(duì)列中沒有可用的URL為止。網(wǎng)絡(luò)爬蟲工作原理如圖1所示。
圖1 網(wǎng)絡(luò)爬蟲工作原理圖
1.2 爬取策略設(shè)計(jì)
在進(jìn)行農(nóng)產(chǎn)品價(jià)格數(shù)據(jù)爬取過程中,發(fā)現(xiàn)價(jià)格的發(fā)布方式主要分為兩類:一類是以表格的形式列出所有價(jià)格數(shù)據(jù),不支持品種、產(chǎn)地等方式篩選查看價(jià)格數(shù)據(jù),例如北京新發(fā)地農(nóng)產(chǎn)品批發(fā)市場(chǎng)。此類網(wǎng)站分頁(yè)較多,但是網(wǎng)頁(yè)中鏈接的頁(yè)面較少,可以使用深度優(yōu)先爬取網(wǎng)頁(yè)。目前有近30萬(wàn)條農(nóng)產(chǎn)品價(jià)格數(shù)據(jù),分為1萬(wàn)多個(gè)頁(yè)面,每個(gè)頁(yè)面的Http地址可以按規(guī)則進(jìn)行分解,使用多線程技術(shù)爬取頁(yè)面,提高爬取的速度。另一類是支持品種、產(chǎn)地等篩選的價(jià)格數(shù)據(jù)表格,例如一畝田農(nóng)產(chǎn)品商務(wù)網(wǎng)站。數(shù)據(jù)分頁(yè)較少,但是網(wǎng)頁(yè)中的鏈接頁(yè)面多,適合廣度優(yōu)先的搜索策略,遍歷所有需要的鏈接地址爬取網(wǎng)頁(yè)。
1.3 爬取模塊
本爬蟲系統(tǒng)的爬取模塊主要任務(wù)是讀取URL地址并將其放入集合,拆分隊(duì)列,使用多線程技術(shù)獲取網(wǎng)頁(yè)?;谂廊〔呗裕治鼍W(wǎng)站內(nèi)容的組織形式,對(duì)于URL地址滿足特定規(guī)律即URL地址中只有部分路徑或者網(wǎng)頁(yè)名不相同,同時(shí)知道總的頁(yè)面數(shù),可拆分頁(yè)面數(shù)放入不同的線程進(jìn)行處理,在每個(gè)線程中通過變量循環(huán)遍歷所有待爬取網(wǎng)頁(yè)地址。以江蘇凌江唐農(nóng)產(chǎn)品批發(fā)市場(chǎng)為例,該市場(chǎng)目前共發(fā)布近1 000 000條數(shù)據(jù),66 000多個(gè)頁(yè)面。每個(gè)頁(yè)面對(duì)應(yīng)一個(gè)URL地址,形成一個(gè)有66 000多個(gè)地址的URL列表,將列表進(jìn)行拆分放入線程池,通過HttpClient框架發(fā)起GET請(qǐng)求并下載價(jià)格數(shù)據(jù)進(jìn)行解析。最終存入HDFS中,通過配置形成3個(gè)副本的自動(dòng)備份。如圖2為爬取模塊工作機(jī)制。
圖2 爬取模塊工作機(jī)制
1.4 解析模塊
不同網(wǎng)頁(yè)的編碼方式差異較大,使用正則表達(dá)式針對(duì)不同的編碼方式生成規(guī)則模板過濾信息,可以有效提取內(nèi)容,但是會(huì)使解析工作變得繁雜和冗余,需要不斷地設(shè)計(jì)解析規(guī)則。本文通過標(biāo)簽名或標(biāo)簽對(duì)中的唯一特征值鎖定標(biāo)簽對(duì),再抽取標(biāo)簽對(duì)中的內(nèi)容,實(shí)驗(yàn)表明能快速有效提取信息,避免大量重復(fù)設(shè)計(jì)解析規(guī)則。如圖3為數(shù)據(jù)解析過程。
圖3 數(shù)據(jù)解析過程
通過重載FileSystem提供的get()函數(shù)確定要使用的文件系統(tǒng)以及讀取配置文件,使用open()函數(shù)來(lái)獲取文件的輸入流,獲取Html類型信息后通過標(biāo)簽名或特征值使用正則表達(dá)式解析DOM。以北京新發(fā)地農(nóng)產(chǎn)品批發(fā)市場(chǎng)公布的網(wǎng)頁(yè)價(jià)格數(shù)據(jù)為例,從body標(biāo)簽開始獲取“class=table”的標(biāo)簽對(duì),再?gòu)脑摌?biāo)簽對(duì)中獲取包含價(jià)格數(shù)據(jù)的標(biāo)簽對(duì)“class=hq_table”,最后利用Java的split()方法通過空格拆分?jǐn)?shù)據(jù),解析出需要的數(shù)據(jù)。如圖4所示為解析前數(shù)據(jù)格式,圖5為解析后的數(shù)據(jù)格式。
圖4 解析前數(shù)據(jù)格式
圖5 解析后數(shù)據(jù)格式
相對(duì)于傳統(tǒng)的分布式文件系統(tǒng),HDFS具有高容錯(cuò)性和高可用性的特點(diǎn)[15]。HDFS的“一次寫,多次讀”的特性,很好地支持大數(shù)據(jù)量的一次寫入、多次讀取,有助于對(duì)元數(shù)據(jù)的保存和后期的查詢分析。HDFS文件系統(tǒng)包括一個(gè)主控節(jié)點(diǎn)NameNode和一組DataNode節(jié)點(diǎn),NameNode用于管理整個(gè)文件系統(tǒng)的命名空間和元數(shù)據(jù),DataNode是實(shí)際存儲(chǔ)和管理文件的數(shù)據(jù)塊。圖2中HDFS包含三個(gè)小方塊,每個(gè)方塊代表一個(gè)DataNode節(jié)點(diǎn),節(jié)點(diǎn)中重復(fù)的數(shù)字表示數(shù)據(jù)的副本,本系統(tǒng)通過配置hdfs-site.xml文件中的dfs.replication屬性,將副本數(shù)設(shè)置為3個(gè)。
分布式文件系統(tǒng)HDFS提供了命令行和API兩種文件操作方式,包含常用的寫入、讀取、關(guān)閉等操作。本系統(tǒng)使用正則表達(dá)式解析原始網(wǎng)頁(yè)并保存為文本文件格式,此后通過append()方法向文件中不斷追加解析出來(lái)的數(shù)據(jù)。以下是通過API將數(shù)據(jù)寫入HDFS的過程:
1) 通過Path類定義需要的路徑,該路徑為即將寫入數(shù)據(jù)的路徑。
2) 在創(chuàng)建文件系統(tǒng)實(shí)例前,需要獲取當(dāng)前的環(huán)境變量,Configuration類提供了封裝好配置的實(shí)例,該配置在core-site.xml中設(shè)置。
3) 接下來(lái)需要重載HDFS文件系統(tǒng)提供的get()方法,加載當(dāng)前環(huán)境變量和建立讀寫路徑。
4) 通過FSDataOutputStream類創(chuàng)建輸出流,其中write()方法可以對(duì)數(shù)據(jù)文件進(jìn)行相應(yīng)的寫操作。為了提高寫入速度,以及解析過程不影響寫入性能,使用Java的多線程技術(shù)對(duì)數(shù)據(jù)流進(jìn)行操作,將解析好的數(shù)據(jù)提前放入隊(duì)列再執(zhí)行寫入操作。
5) 執(zhí)行完寫操作后,通過closeStream()方法關(guān)閉當(dāng)前線程的寫出流,再用notify()方法喚醒另一個(gè)線程執(zhí)行寫操作。數(shù)據(jù)寫入HDFS的流程如圖6所示。
圖6 數(shù)據(jù)寫入HDFS的流程圖
本系統(tǒng)可以解析并存儲(chǔ)北京新發(fā)地農(nóng)產(chǎn)品批發(fā)市場(chǎng)、江蘇凌家塘農(nóng)副產(chǎn)品批發(fā)市場(chǎng)、浙江省金華農(nóng)產(chǎn)品批發(fā)市場(chǎng)、北京城北回龍觀商品交易市場(chǎng)等。實(shí)驗(yàn)選取從北京新發(fā)地和江蘇凌家塘農(nóng)產(chǎn)品批發(fā)市場(chǎng)爬取的價(jià)格數(shù)據(jù)為測(cè)試對(duì)象。
3.1 測(cè)試環(huán)境
測(cè)試使用了3臺(tái)服務(wù)器搭建測(cè)試環(huán)境,每臺(tái)服務(wù)器的硬件配置見表1所示,Hadoop版本為2.6.0。
表1 硬件配置
3.2 測(cè)試數(shù)據(jù)
測(cè)試數(shù)據(jù)集為爬取的80 000多個(gè)網(wǎng)頁(yè),原始數(shù)據(jù)集共120多GB,通過正則表達(dá)式對(duì)數(shù)據(jù)解析后寫入HDFS。
3.3 測(cè)試場(chǎng)景
數(shù)據(jù)塊是磁盤進(jìn)行數(shù)據(jù)讀/寫的最小單位,HDFS也一樣,增大HDFS的塊大小,可以減少尋址開銷。實(shí)驗(yàn)通過設(shè)置不同的塊大小和副本數(shù)量,比較HDFS的寫入性能。如圖7和圖8為不同數(shù)據(jù)塊大小,不同副本數(shù)的寫入時(shí)間比較。
圖7 HDFS寫入性能(64 MB/塊)
圖8 HDFS寫入性能(128 MB/塊)
3.4 實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)過程用多線程技術(shù)預(yù)先解析數(shù)據(jù),排除了解析速度慢導(dǎo)致的延遲和誤差。通過實(shí)驗(yàn)數(shù)據(jù)可以看出1個(gè)副本的寫入速度要比多個(gè)副本快,時(shí)間差距會(huì)隨著數(shù)據(jù)量的變大而增大。數(shù)據(jù)塊大小設(shè)置為64和128MB時(shí)的寫入速度相近,總體來(lái)看,當(dāng)設(shè)置數(shù)據(jù)塊為128MB時(shí)寫入速度要比64MB時(shí)略快。
本文針對(duì)網(wǎng)絡(luò)資源的不斷豐富,爬取到的數(shù)據(jù)量巨大,而且增長(zhǎng)速度快等特點(diǎn),導(dǎo)致后期的存儲(chǔ)和分析難的現(xiàn)狀。設(shè)計(jì)了網(wǎng)絡(luò)爬蟲系統(tǒng)并且利用Hadoop平臺(tái)的HDFS文件系統(tǒng)進(jìn)行存儲(chǔ),并進(jìn)行了寫入性能的實(shí)驗(yàn)設(shè)計(jì)。從實(shí)驗(yàn)得到的數(shù)據(jù)來(lái)看HDFS能很好地支持網(wǎng)絡(luò)爬蟲爬取的數(shù)據(jù)不斷遞增的現(xiàn)狀。即使設(shè)置了多副本的備份機(jī)制,也能很好地進(jìn)行數(shù)據(jù)的寫入和自動(dòng)備份。充分利用Hadoop平臺(tái)的優(yōu)勢(shì),對(duì)已經(jīng)解析和清洗后的數(shù)據(jù)進(jìn)行分析、挖掘是下一步的主要研究工作。
[1]IDC最新數(shù)字宇宙研究報(bào)告:中國(guó)數(shù)據(jù)量增長(zhǎng)顯著[EB/OL].2013-03-01.http://www.searchbi.com.cn/showcontent_70996.htm.
[2]BorisLublinsky,KevinTSmith,AlexeyYakubovich.ProfessionalHadoopSolution[M].Wrox,2013:3-4.
[3]TomWbite.Hadoop:TheDefinitiveGuide[M].O’ReillyMedia,2010:497.
[4] 張海,馬建紅.基于HDFS的小文件存儲(chǔ)與讀取優(yōu)化策略[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2014,23(5):167-171.
[5] 李鐵,燕彩蓉,黃永鋒,等.面向Hadoop分布式文件系統(tǒng)的小文件存取優(yōu)化方法[J].計(jì)算機(jī)應(yīng)用,2014,34(11):3091-3095,3099.
[6] 張春明,芮建武,何婷婷.一種Hadoop小文件存儲(chǔ)和讀取的方法[J].計(jì)算機(jī)應(yīng)用與軟件,2012,29(11):95-100.
[7] 尹穎,林慶,林涵陽(yáng).HDFS中高效存儲(chǔ)小文件的方法[J].計(jì)算機(jī)工程與設(shè)計(jì),2015(2):406-409.
[8] 孔濤,曹丙章,邱荷花.基于MapReduce的視頻爬蟲系統(tǒng)研究[J].華中科技大學(xué)學(xué)報(bào)(自然科學(xué)版),2015(5):129-132.
[9] 程錦佳.基于Hadoop的分布式爬蟲及實(shí)現(xiàn)[D].北京郵電大學(xué),2010.
[10] 萬(wàn)濤.基于Hadoop的分布式網(wǎng)絡(luò)爬蟲研究與實(shí)現(xiàn)[D].西安電子科技大學(xué),2014.
[11] 王慶紅,李廣凱,周育忠,等.一種基于銀行家算法的網(wǎng)絡(luò)爬蟲資源配置策略[J].智能系統(tǒng)學(xué)報(bào),2015(3):494-498.
[12]PrashantDahiwale,MMRaghuwanshi,LateshMalik.PDDCrawler:Afocusedwebcrawlerusinglinkandcontentanalysisforrelevanceprediction[C]//InternationalConferenceonInformationRetrieval,7-8,Nov,2014.
[13] 于娟,劉強(qiáng).主題網(wǎng)絡(luò)爬蟲研究綜述[J].計(jì)算機(jī)工程與科學(xué),2015,37(2):231-237.
[14] 周中華,張惠然,謝江.基于Python的新浪微博數(shù)據(jù)爬蟲[J].計(jì)算機(jī)應(yīng)用,2014,34(11):3131-3134.
[15] 黃宜華,苗凱翔.深入理解大數(shù)據(jù):大數(shù)據(jù)處理與編程實(shí)踐[M].北京:機(jī)械工業(yè)出版社,2014:57,65-68.
RESEARCH ON DATA CRAWLING AND STORAGE SYSTEM OF AGRICULTURALPRODUCT PRICE BASED ON HADOOP PLATFORM
Yang Xiaodong1Gao Lutao1Yang Linnan1*Liu Jianyang2
1(CollegeofBasicScienceandInformationEngineering,YunnanAgricultureUniversity,Kunming650201,Yunnan,China)2(YunnanInformationTechnologyDevelopmentCenter,Kunming650228,Yunnan,China)
At present, many large farm product markets and agricultural information commerce platforms release the information of agricultural product prices from different regions in real-time each day. Because of a large number of various fast-updating data, the data crawling and storage as well as the following analysis work come to be difficult. Therefore, we put forward a data crawling and storage system of agricultural product price based on Hadoop. We implement multi-threaded crawling by HttpClient framework combined with thread pool and finish integrity checking. After filtering out the web pages whose information is incomplete, we crawl again until the information comes to be complete. We analyze and clean the crawled web pages by regular expression, and save the useful extracted data in the form of text file into HDFS (Hadoop Distributed File System). The data crawled later is supplemented into HDFS. Experiment shows that the writing performance of HDFS can satisfy the incremental crawling data. The less duplicates are, the bigger the data block is, then the better the writing performance is.
Distributed system Crawler Hadoop HDFS Regular expression
2016-03-12。國(guó)家“十二五”科技支撐計(jì)劃課題(2014BAD10B03)。楊曉東,碩士生,主研領(lǐng)域:數(shù)據(jù)挖掘。郜魯濤,講師。楊林楠,教授。劉建陽(yáng),高級(jí)工程師。
TP393
A
10.3969/j.issn.1000-386x.2017.03.013