文/丁志毅
隨著大數(shù)據(jù)、云計(jì)算、人工智能等新興計(jì)算機(jī)技術(shù)的急速發(fā)展,所產(chǎn)生的數(shù)據(jù)呈爆炸性增長(zhǎng),如何實(shí)現(xiàn)存儲(chǔ)和計(jì)算能力的分布式處理,擺脫目前傳統(tǒng)的計(jì)算技術(shù)和信息系統(tǒng)的處理方式,是目前數(shù)據(jù)分析領(lǐng)域亟待解決的問(wèn)題。Hadoop 是使用 Java 語(yǔ)言開(kāi)發(fā)的分布式計(jì)算存儲(chǔ)系統(tǒng),是一個(gè)由Apache基金會(huì)支持的開(kāi)源項(xiàng)目,提供可靠的,可擴(kuò)展的分布式系統(tǒng)基礎(chǔ)架構(gòu),能夠跨計(jì)算機(jī)集群分布式存儲(chǔ)海量數(shù)據(jù),允許使用簡(jiǎn)單的編程模型分布式處理數(shù)據(jù)。用戶(hù)可以像操作本地文件系統(tǒng)一樣透明的訪(fǎng)問(wèn)HDFS,常應(yīng)用于海量數(shù)據(jù)的場(chǎng)景。
網(wǎng)絡(luò)爬蟲(chóng)的主要作用是依據(jù)一定的爬行策略自動(dòng)的從網(wǎng)上下載網(wǎng)頁(yè)鏡像到本地,并能夠抓取所有其能夠訪(fǎng)問(wèn)到的網(wǎng)頁(yè)以獲取海量信息,解析其中的數(shù)據(jù)進(jìn)行分析挖掘等。其基本工作原理如下:首先初始化一個(gè)URL作為爬行的開(kāi)始位置,如果該 URL沒(méi)有被抓取過(guò),解析其DNS信息,嘗試與這些 URL鏈接所在的服務(wù)器建立連接,自動(dòng)提取頁(yè)面上的信息保存至本地,同時(shí)提取新的 URL,根據(jù)一定的遍歷算法將其去重過(guò)濾后加入待爬取隊(duì)列,重復(fù)以上步驟遍歷所有的網(wǎng)頁(yè)數(shù)據(jù),直到待爬取的隊(duì)列中沒(méi)有可用的 URL,滿(mǎn)足停止的條件時(shí)結(jié)束爬取。
圖1:Scrapy爬蟲(chóng)的流程
圖2:HDFS系統(tǒng)結(jié)構(gòu)
Scrapy是一款開(kāi)源的網(wǎng)絡(luò)爬蟲(chóng)框架,是使用python 語(yǔ)言開(kāi)發(fā)并封裝的一個(gè)強(qiáng)大的自動(dòng)數(shù)據(jù)采集框架,目的為了爬取網(wǎng)站內(nèi)容,提取結(jié)構(gòu)性數(shù)據(jù)。無(wú)需再?gòu)牧汩_(kāi)始去設(shè)計(jì)爬蟲(chóng)框架,而是可以簡(jiǎn)單、高效的搭建python 的 Scrapy 框架,通過(guò) Scrapy 框架提供的功能進(jìn)行定向的數(shù)據(jù)爬取工作。在 Scrapy 項(xiàng)目中,可以方便地自定義爬蟲(chóng)的爬取規(guī)則,即可快速獲得所需要的網(wǎng)頁(yè)數(shù)據(jù),同時(shí)一些固定的前置后續(xù)處理可由一些穩(wěn)定的開(kāi)源庫(kù)幫助解決,并可根據(jù)需要將關(guān)鍵數(shù)據(jù)保存為特定的數(shù)據(jù)格式。Scrapy 爬蟲(chóng)的流程如圖1所示。
Scrapy 強(qiáng)大的功能得益于他的構(gòu)架,他總共有 8 個(gè)部分組成:
1.2.1 Scrapy Engine 組件
爬蟲(chóng)框架的引擎組件,是整個(gè)框架的“大腦“,負(fù)責(zé)所有組件的數(shù)據(jù)流動(dòng)。
1.2.2 Scheduler 組件
調(diào)度器組件,負(fù)責(zé)接收并創(chuàng)建請(qǐng)求隊(duì)列。
1.2.3 Downloader 組件
下載器組件,負(fù)責(zé)下載網(wǎng)頁(yè)數(shù)據(jù)。
1.2.4 spiders 組件
爬蟲(chóng)模塊,其功能在于從特定的網(wǎng)頁(yè)結(jié)構(gòu)數(shù)據(jù)中獲取指定信息,在 Scrapy 中被定義為實(shí)體(Item)。
1.2.5 Pipeline 組件
負(fù)責(zé)對(duì)數(shù)據(jù)進(jìn)行清理、驗(yàn)證以及持久化(轉(zhuǎn)存數(shù)據(jù)庫(kù))的處理。
1.2.6 Downloader middlewares
其在引擎和下載器組件之間,功能是負(fù)責(zé)引擎發(fā)出的請(qǐng)求,以協(xié)調(diào)下載組件工作。
1.2.7 spider middlewares
負(fù)責(zé)處理爬蟲(chóng)數(shù)據(jù)的輸入和輸出,主要是為了提高爬蟲(chóng)質(zhì)量,可以同時(shí)使用不同功能的下載中間件。
HDFS 采用典型的主從式(master-slave)設(shè)計(jì),在該設(shè)計(jì)中主要包含兩種節(jié)點(diǎn):主節(jié)點(diǎn)(NameNode)和數(shù)據(jù)節(jié)點(diǎn)(DataNode)。主節(jié)點(diǎn)負(fù)責(zé)管理整個(gè)文件系統(tǒng)的命名空間;另外一種 DataNode是從節(jié)點(diǎn),為數(shù)據(jù)提供真實(shí)的存儲(chǔ)、管理服務(wù)。DataNode 最基本的存儲(chǔ)單位是 Block,文件大于 Block 時(shí)會(huì)被劃分為多個(gè) Block 存儲(chǔ)在不同的數(shù)據(jù)節(jié)點(diǎn),其元數(shù)據(jù)存儲(chǔ)在NameNode中,全局調(diào)度數(shù)據(jù)塊的讀寫(xiě)操作,主要用于定位block與DadaNode之間的對(duì)應(yīng)關(guān)系。用戶(hù)如果操作 HDFS 文件時(shí),需要先訪(fǎng)問(wèn) NameNode 節(jié)點(diǎn),讀取元數(shù)據(jù)(metaData)信息,得到存儲(chǔ)位置后再訪(fǎng)問(wèn) DateNode 。其架構(gòu)如圖2所示。
經(jīng)Scrapy采集到的數(shù)據(jù)需要持久化到hdfs中,python語(yǔ)言來(lái)訪(fǎng)問(wèn)Hadoop HDFS時(shí),需要引入pyhdfs庫(kù),通過(guò)pyhdfs提供的API接口實(shí)現(xiàn)對(duì)hdfs的操作。HdfsClient這個(gè)類(lèi)可以連接HDFS的NameNode,用來(lái)讀、些、查詢(xún)HDFS上的文件。代碼示例:
Client=pyhdfs.HdfsClient(hosts="192.168.1.108,9000",user_name="hadoop")
從本地上傳文件至集群
client.copy_from_local("D:/test.csv","/user/hadoop/test.csv")
打開(kāi)一個(gè)遠(yuǎn)程節(jié)點(diǎn)上的文件,返回一個(gè)HttpResponse對(duì)象
HttpResponse response = client.open("/user/hadoop/test.csv")
在房地產(chǎn)市場(chǎng)領(lǐng)域,浩瀚的網(wǎng)絡(luò)資源已經(jīng)呈現(xiàn)出大數(shù)據(jù)的特點(diǎn),傳統(tǒng)的信息處理技術(shù)已經(jīng)無(wú)法適應(yīng)需求。針對(duì)無(wú)法進(jìn)行有效數(shù)據(jù)分析的現(xiàn)狀,本文研究利用Scrapy網(wǎng)絡(luò)爬蟲(chóng)框架和HDFS 分布式文件系統(tǒng)進(jìn)行數(shù)據(jù)的采集和存儲(chǔ)。HDFS 能為不斷增長(zhǎng)的數(shù)據(jù)提供高度的容錯(cuò)、高吞吐量和分布式儲(chǔ)存服務(wù)。通過(guò)提升大數(shù)據(jù)分析技術(shù)在房地產(chǎn)行業(yè)中的應(yīng)用水平,充分利用 Hadoop 平臺(tái)的優(yōu)勢(shì),轉(zhuǎn)變數(shù)據(jù)存儲(chǔ)方式和計(jì)算模式,加強(qiáng)數(shù)據(jù)的分析和挖掘,提高政府及有關(guān)部門(mén)對(duì)房地產(chǎn)市場(chǎng)分析的廣度和深度,更好的為政府決策、行業(yè)管理提供決策依據(jù)是下一步的主要研究工作。