林在寧楊文杰陳修潔
(北京印刷學(xué)院,北京 102600)
中國(guó)經(jīng)濟(jì)持續(xù)飛速發(fā)展,房?jī)r(jià)是國(guó)民生活中最關(guān)心的議題,考慮到房?jī)r(jià)上漲,房地產(chǎn)的投資、居住、置業(yè)、小孩上學(xué)等與購(gòu)房相關(guān)的問(wèn)題令人困擾,對(duì)于房?jī)r(jià)進(jìn)行分析,研究其規(guī)律和預(yù)測(cè)房?jī)r(jià)成為熱點(diǎn)問(wèn)題。在如今信息爆炸的大數(shù)據(jù)時(shí)代,房地產(chǎn)行業(yè)在互聯(lián)網(wǎng)上的龐大數(shù)據(jù)資源為本文提供了充分的數(shù)據(jù)源,因此研究開(kāi)發(fā)一個(gè)可從互聯(lián)網(wǎng)中獲取房?jī)r(jià)信息,進(jìn)行分布式數(shù)據(jù)存儲(chǔ)、大數(shù)據(jù)計(jì)算、數(shù)據(jù)展示分析,且高性能、方便操作、易用的大數(shù)據(jù)分析系統(tǒng),對(duì)網(wǎng)站海量數(shù)據(jù)進(jìn)行分析,以及對(duì)房子信息進(jìn)行大數(shù)據(jù)分析都有參考意義。
本文通過(guò)編寫(xiě)網(wǎng)絡(luò)爬蟲(chóng)在各大房?jī)r(jià)網(wǎng)站上對(duì)上海各區(qū)房?jī)r(jià)進(jìn)行數(shù)據(jù)爬取,搭建分布式數(shù)據(jù)存儲(chǔ)系統(tǒng)保存數(shù)據(jù),引用高效大數(shù)據(jù)計(jì)算框架對(duì)數(shù)據(jù)進(jìn)行計(jì)算,并將得出的相關(guān)數(shù)據(jù)與國(guó)家GDP數(shù)據(jù)一并展示。
網(wǎng)絡(luò)爬蟲(chóng)是一種自動(dòng)抓取網(wǎng)頁(yè)數(shù)據(jù)、按照算法規(guī)則對(duì)網(wǎng)頁(yè)中的數(shù)據(jù)進(jìn)行抽取,形成所需的數(shù)據(jù)的腳本??墒褂玫谌綆?kù)提供的強(qiáng)大功能,對(duì)網(wǎng)頁(yè)中進(jìn)行正則表達(dá)式匹配抓取,不斷循環(huán),自動(dòng)把數(shù)據(jù)獲取到本地。爬蟲(chóng)是從網(wǎng)站爬取大數(shù)據(jù)不可缺少的一種技術(shù)。
Hadoop是一款開(kāi)源的分布式大數(shù)據(jù)處理框架,專(zhuān)為服務(wù)器設(shè)計(jì),從單一到成千上萬(wàn)服務(wù)器集群處理海量數(shù)據(jù),實(shí)現(xiàn)了本地存儲(chǔ)和計(jì)算。主要用MapReduce的計(jì)算框架實(shí)現(xiàn)多服務(wù)器并行計(jì)算。
ECharts是百度開(kāi)源的純 Javascript 圖表庫(kù),支持多種圖表,同時(shí)提供可交互組件,支持多圖表、組件的聯(lián)動(dòng)和混搭展現(xiàn)??梢粤鲿车剡\(yùn)行在 PC 和移動(dòng)設(shè)備上,兼容當(dāng)前絕大部分瀏覽器,提供直觀、生動(dòng)、可交互、可高度個(gè)性化定制的數(shù)據(jù)可視化圖表。
利用大數(shù)據(jù)分析平臺(tái)使用網(wǎng)絡(luò)爬蟲(chóng)技術(shù)對(duì)從各大房地產(chǎn)網(wǎng)站爬取的數(shù)據(jù)進(jìn)行分布式計(jì)算,將結(jié)果展現(xiàn)成圖表形式。數(shù)據(jù)來(lái)源于鏈家、安居客等房地產(chǎn)相關(guān)網(wǎng)站,編寫(xiě)高可用性網(wǎng)絡(luò)爬蟲(chóng)抓取大量數(shù)據(jù),將分析得到的數(shù)據(jù)與官方發(fā)布的數(shù)據(jù)進(jìn)行可視化對(duì)比展示。本文的具體實(shí)現(xiàn)流程如下:
(1)研究Python爬蟲(chóng)技術(shù)如何獲取房地產(chǎn)網(wǎng)站價(jià)格信息以及攻破反爬技術(shù)。
(2)對(duì)數(shù)據(jù)進(jìn)行清洗,對(duì)大量的房地產(chǎn)價(jià)格信息數(shù)據(jù)進(jìn)行處理,把多余的數(shù)據(jù)參量剔除,保留有用的價(jià)格信息、區(qū)域信息等,否則無(wú)效的數(shù)據(jù)將會(huì)使計(jì)算結(jié)果不準(zhǔn)確。
(3)實(shí)現(xiàn)Hadoop分布式集群搭建,使用多個(gè)虛擬機(jī)進(jìn)行模擬大規(guī)模計(jì)算機(jī)集群,對(duì)于可行性進(jìn)行測(cè)試、使用MapReduce并行計(jì)算框架,Map階段把任務(wù)拆分成多個(gè)小份,分別將各部分計(jì)算出結(jié)果,按默認(rèn)的方式排序,Reduce階段將Map階段得出的結(jié)果進(jìn)行合并運(yùn)算,基于此思想將海量數(shù)據(jù)進(jìn)行高效、準(zhǔn)確的計(jì)算。將分析結(jié)果和相關(guān)數(shù)據(jù)進(jìn)行展示,可以通過(guò)不同數(shù)據(jù)維度進(jìn)行不同角度的分析,判斷數(shù)據(jù)產(chǎn)生的趨勢(shì),關(guān)注偏離趨勢(shì)的點(diǎn)并進(jìn)行詳細(xì)分析。通過(guò)Python爬蟲(chóng)將數(shù)據(jù)存于Hadoop集群分析并處理,將結(jié)果通過(guò)ECharts展示。圖1呈現(xiàn)了本系統(tǒng)的主要工作流程。
圖1 系統(tǒng)工作流程圖
普通的爬蟲(chóng)很難完成大量復(fù)雜的爬取工作,容易因網(wǎng)絡(luò)波動(dòng)、硬件限制對(duì)爬取效率造成影響。為解決Python爬蟲(chóng)對(duì)網(wǎng)頁(yè)數(shù)據(jù)爬取的穩(wěn)定性、成功率的問(wèn)題,采用分治思想,將整個(gè)爬取數(shù)據(jù)的工作分為兩個(gè)步驟:首先獲取房?jī)r(jià)信息的網(wǎng)頁(yè)鏈接,然后根據(jù)獲取到的鏈接逐個(gè)爬取具體信息。根據(jù)網(wǎng)站Html代碼找出當(dāng)前頁(yè)碼的代碼,用正則表達(dá)式進(jìn)行匹配,目的是讓爬蟲(chóng)腳本精準(zhǔn)定位分頁(yè)、不斷自動(dòng)翻頁(yè),進(jìn)行全自動(dòng)爬取。
圖2中是某二手房網(wǎng)頁(yè)上Html代碼分析,熟悉編寫(xiě)正則表達(dá)式是爬取的前置步驟。
圖2 網(wǎng)頁(yè)Html代碼
接下來(lái)要獲取二手房的信息。對(duì)此需要進(jìn)行粗略的劃分,如按照區(qū)域劃分,在爬取之前做一個(gè)簡(jiǎn)單的分類(lèi),為接下來(lái)的數(shù)據(jù)處理做好鋪墊,可以減少不必要的麻煩。以下代碼通過(guò)將Html中二手房的url存入變量中,方便進(jìn)行url拼接。
最后引入XML包,通過(guò)etree.HTML()把Html文本保存到本地。通過(guò)拼接url的方式讓爬蟲(chóng)獲取每一條具體住房的信息。用pandas包將內(nèi)容以xlsx格式存在本地。代碼如下:
由此得到了原始的房?jī)r(jià)數(shù)據(jù)。
讀取獲取的具體房?jī)r(jià)信息的網(wǎng)頁(yè)鏈接,將其首個(gè)字段的內(nèi)容作為數(shù)據(jù)存入數(shù)組。
圖3在網(wǎng)站代碼中尋找成交價(jià)格的代碼,仍然用正則表達(dá)式來(lái)匹配數(shù)據(jù)。
圖3 房產(chǎn)成交價(jià)格代碼
代碼如下,將dealTotalPrice的值即成交總價(jià)作為對(duì)象編譯正則表達(dá)式。
完善數(shù)據(jù)形式和輸出xlsx文件的邏輯。數(shù)據(jù)爬取的工作流程就基本完成了。
由于本文需要長(zhǎng)時(shí)間大量且穩(wěn)定地爬取數(shù)據(jù),所以采用了付費(fèi)的阿布云(https://www.abuyun.com/)的服務(wù),在爬蟲(chóng)中需要配置代理服務(wù)器的信息。
Hadoop是一個(gè)分布式平臺(tái),NameNode作為主節(jié)點(diǎn)HDFS文件管理系統(tǒng)建立于此,DataNode在眾多機(jī)器中存在負(fù)責(zé)使用各個(gè)計(jì)算機(jī)對(duì)數(shù)據(jù)存儲(chǔ)計(jì)算。FsImage 文件中保存了某個(gè)時(shí)刻對(duì)HDFS和其文件的快照。editlog顧名思義就是對(duì)HDFS進(jìn)行的所有事務(wù)、更改操作的日志文件。SecondaryNamenode節(jié)點(diǎn)是一個(gè)檢查節(jié)點(diǎn)。隨著運(yùn)行時(shí)間的增長(zhǎng),會(huì)將FsImage和editlog文件進(jìn)行合并生成新的FsImage和editlog。為了防止NameNode發(fā)生嚴(yán)重錯(cuò)誤導(dǎo)致程序崩潰,此時(shí)在SecondaryNamenode中保存一份最近的FsImage和editlog文件,有助于恢復(fù)正常狀態(tài)減少損失,使得Hadoop具有較好的穩(wěn)定性。Hadoop集群全分布結(jié)構(gòu)由一臺(tái)主節(jié)點(diǎn)為NameNode和多個(gè)從節(jié)點(diǎn)作DataNode和客戶(hù)端構(gòu)成。圖4為Hadoop全分布模式數(shù)據(jù)流圖。
圖4 Hadoop全分布模式數(shù)據(jù)流圖
搭建好了Hadoop計(jì)算平臺(tái),此前爬蟲(chóng)已獲取到的房?jī)r(jià)數(shù)據(jù)以xlsx的格式存放在表格中,首先將其上傳至HDFS服務(wù)器中切分成數(shù)據(jù)塊分布式存儲(chǔ),交由NameNode讀取數(shù)據(jù)以進(jìn)行計(jì)算,編寫(xiě)適用于MapReduce計(jì)算框架的計(jì)算邏輯根對(duì)數(shù)據(jù)進(jìn)行分析計(jì)算。再將結(jié)果存入HDFS服務(wù)器中。
(1)Map階段
Mapper首先從輸入的數(shù)據(jù)塊中序列化為Hadoop數(shù)據(jù)類(lèi)型Long Writable,相比JAVA 中l(wèi)ong類(lèi)型剔除了與計(jì)算無(wú)關(guān)的信息,使得其轉(zhuǎn)化為二進(jìn)制時(shí)體積更小效率更高。定義兩個(gè)long變量sum和count 初值為0,用于記錄總和和數(shù)量。
(2)Combiner階段
Combiner獲取 key的值累加到sum中,從value中迭代,累加count值。
Combiner對(duì)map階段的輸出先做一次合并,減少了Map階段和Reduce階段之間要傳輸?shù)臄?shù)據(jù)量。減少了IO的工作量,對(duì)于網(wǎng)絡(luò)數(shù)據(jù)傳輸性能有了較大提升。
(3)Reduce階段
Reducer獲取了前面map、combiner階段得出的數(shù)據(jù),在此需要一個(gè)平均值,即sum/count,此時(shí)需要輸出的類(lèi)型為Double Writable,否則可能會(huì)出現(xiàn)精度問(wèn)題。
(4)Driver階段
這個(gè)階段是整個(gè)MapReduce程序的運(yùn)行類(lèi),其中定義了main類(lèi)、Job的配置、Map階段啟動(dòng)的類(lèi)、Combiner階段啟動(dòng)的類(lèi)和Reduce階段啟動(dòng)的類(lèi)分別是什么,配置了各階段<k,v>對(duì)的輸出類(lèi)型和最終數(shù)據(jù)文件輸出到什么位置等。
(5)MapReduce計(jì)算
Hadoop無(wú)法直接運(yùn)行代碼,因此首先將代碼打包。將數(shù)據(jù)文檔上傳到Driver中設(shè)定的Input-Path的路徑下,確保輸出的文件未存在,如存在就先將文件夾刪除,否則無(wú)法輸出結(jié)果。準(zhǔn)備完成后將xxx-1.0-SNAPSHOT.jar包上傳至NameNode的根目錄下,輸入命令 hadoop jar xxx-1.0-SNAPSHOT.jar等待系統(tǒng)計(jì)算完成。計(jì)算成功并輸出結(jié)果后在Hadoop可視化網(wǎng)頁(yè)中尋找輸出目錄。
_SUCCESS文件是告知用戶(hù)計(jì)算成功。part-r-00000、00001是最終得出歷年上海房?jī)r(jià)平均值。
從互聯(lián)網(wǎng)上爬取,并通過(guò)大數(shù)據(jù)處理得到的數(shù)據(jù),將其可視化以便實(shí)現(xiàn)對(duì)數(shù)據(jù)的更好展示。并以國(guó)家統(tǒng)計(jì)局頒布的GDP數(shù)據(jù)作為對(duì)比,在瀏覽器中即可展示。
如圖5是以上海市的GDP與20年來(lái)的房?jī)r(jià)各年均值為例,用大數(shù)據(jù)分析效果進(jìn)行對(duì)比。
圖5 對(duì)比效果分析圖
圖中左側(cè)y方向是上海市的平均房?jī)r(jià)(元/m2),右側(cè)則為GDP(億元)。
第一產(chǎn)業(yè)GDP幾乎貼近于x軸,上海市并非農(nóng)業(yè)主導(dǎo)經(jīng)濟(jì),第二產(chǎn)業(yè)GDP在2010年前后與房?jī)r(jià)增長(zhǎng)速度相近,第三產(chǎn)業(yè)GDP占經(jīng)濟(jì)主導(dǎo),GDP總值和房?jī)r(jià)變化幅度類(lèi)似,符合上海市由第二產(chǎn)業(yè)向第三產(chǎn)業(yè)轉(zhuǎn)型的經(jīng)濟(jì)結(jié)構(gòu)變化規(guī)律。
為了實(shí)現(xiàn)爬蟲(chóng)與大數(shù)據(jù)計(jì)算相結(jié)合的網(wǎng)站數(shù)據(jù)分析系統(tǒng),使用了Python爬蟲(chóng)技術(shù)獲取互聯(lián)網(wǎng)公開(kāi)數(shù)據(jù),對(duì)于海量數(shù)據(jù)結(jié)合了Hadoop分布式計(jì)算框架,將數(shù)據(jù)切塊分布式存儲(chǔ)在可用資源上,整合算力,大大提升了千萬(wàn)、億級(jí)數(shù)據(jù)處理效率,實(shí)現(xiàn)了數(shù)據(jù)聚合、資源整合,系統(tǒng)高可用,與市場(chǎng)上許多數(shù)據(jù)處理方案相比避免了資源存儲(chǔ)開(kāi)銷(xiāo)高、負(fù)載不均、效率過(guò)低的問(wèn)題。
除此以外,還結(jié)合了ECharts的前端相關(guān)技術(shù),將上海市多年商品房均價(jià)與GDP增長(zhǎng)的數(shù)據(jù)清晰地呈現(xiàn)出來(lái),方便普通人、專(zhuān)業(yè)人士無(wú)門(mén)檻快速分析、研究預(yù)測(cè)。