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