黃 磊,許大璐,任 福,杜清運(yùn),李浪姣,張 琛
(1. 武漢大學(xué) 資源與環(huán)境科學(xué)學(xué)院,湖北 武漢 430079;2. 浙江省地理信息中心,浙江 杭州 310012)
如何快速高效地獲取大規(guī)模簽到數(shù)據(jù)是進(jìn)行人類(lèi)活動(dòng)有關(guān)的數(shù)據(jù)分析和挖掘必須解決的問(wèn)題。新浪微博作為我國(guó)最活躍的社交媒體平臺(tái)之一,月活躍用戶達(dá)3.13億,日活躍用戶為1.39億[10]。龐大的新浪微博用戶群體狀態(tài)信息更新頻繁,產(chǎn)生大量的活動(dòng)信息。本文以抓取新浪微博興趣點(diǎn)(Point of Interest, POI)簽到數(shù)據(jù)為例,設(shè)計(jì)了一種四叉樹(shù)動(dòng)態(tài)格網(wǎng)抓取數(shù)據(jù)方法,由于新浪微博為了防止客戶端的過(guò)度采集導(dǎo)致服務(wù)器資源的濫用,對(duì)返回的POI數(shù)量作了一定的限制,因此,本文在設(shè)計(jì)四叉樹(shù)格網(wǎng)時(shí)對(duì)采集的POI數(shù)量設(shè)定了閾值,當(dāng)某一格網(wǎng)內(nèi)返回的POI數(shù)量達(dá)到閾值時(shí),就采用四叉樹(shù)分裂法動(dòng)態(tài)分割當(dāng)前格網(wǎng)遞歸獲取數(shù)據(jù),從而保證數(shù)據(jù)采集的完整性。與傳統(tǒng)的規(guī)則格網(wǎng)的獲取方式相比,四叉樹(shù)格網(wǎng)在獲取數(shù)據(jù)的完整性方面有明顯的優(yōu)勢(shì),從獲取數(shù)據(jù)的結(jié)果分布來(lái)看,采用規(guī)則格網(wǎng)方式的數(shù)據(jù)缺失主要集中在高密度的POI地區(qū),并沒(méi)有將高密度區(qū)域的POI數(shù)據(jù)采集完畢,而采用四叉樹(shù)方式能避免此問(wèn)題。在現(xiàn)行的開(kāi)放平臺(tái)都對(duì)開(kāi)發(fā)者作了相應(yīng)限制的背景下,采用四叉樹(shù)劃分格網(wǎng)的方法對(duì)于獲取完整的研究數(shù)據(jù)具有一定的實(shí)際作用。
目前常見(jiàn)的新浪微博數(shù)據(jù)獲取主要有3種方式:通過(guò)網(wǎng)絡(luò)爬蟲(chóng)的方式、調(diào)用新浪微博開(kāi)放平臺(tái)API的方式和將網(wǎng)絡(luò)爬蟲(chóng)與微博API相結(jié)合的策略。
網(wǎng)絡(luò)爬蟲(chóng)(Web Crawler)也稱(chēng)網(wǎng)絡(luò)蜘蛛(Web Spider),是一種按照特定規(guī)則抓取網(wǎng)頁(yè)信息的程序。抓取網(wǎng)頁(yè)的過(guò)程,實(shí)際上和平時(shí)使用瀏覽器訪問(wèn)網(wǎng)頁(yè)的原理是一樣的。在瀏覽器地址欄輸入某個(gè)網(wǎng)址之后,打開(kāi)網(wǎng)頁(yè)的過(guò)程其實(shí)是瀏覽器作為客戶端,向服務(wù)器發(fā)送一個(gè)請(qǐng)求。經(jīng)過(guò)DNS服務(wù)器,找到服務(wù)器主機(jī),經(jīng)服務(wù)器解析,將請(qǐng)求的資源返回給瀏覽器,瀏覽器最終將這些內(nèi)容經(jīng)過(guò)解析處理之后在頁(yè)面上呈現(xiàn)給用戶。目前,通過(guò)網(wǎng)絡(luò)爬蟲(chóng)采集微博數(shù)據(jù)的技術(shù)應(yīng)用較為廣泛。主要通過(guò)采集用戶的帶有位置信息的微博,從中提取POI簽到信息,統(tǒng)計(jì)各個(gè)POI的累計(jì)簽到次數(shù)作為該P(yáng)OI總的簽到次數(shù),從而得到微博POI簽到數(shù)據(jù)。文獻(xiàn)[11]提出了基于模擬登陸的網(wǎng)絡(luò)爬蟲(chóng)采集方案,解決了傳統(tǒng)網(wǎng)絡(luò)爬蟲(chóng)需要身份驗(yàn)證的問(wèn)題。文獻(xiàn)[12]開(kāi)發(fā)了一款支持并行微博數(shù)據(jù)獲取的應(yīng)用,提供了一種基于廣度優(yōu)先搜索的算法來(lái)獲取微博數(shù)據(jù)。文獻(xiàn)[13]利用隊(duì)列的思想實(shí)現(xiàn)了非遞歸爬蟲(chóng),實(shí)現(xiàn)了大規(guī)模數(shù)據(jù)的快速高效獲取。隨著新浪微博的不斷升級(jí),反爬蟲(chóng)機(jī)制更加嚴(yán)格,該方法不僅受到的限制多,而且數(shù)據(jù)采集的范圍有限、程序設(shè)計(jì)更加復(fù)雜、數(shù)據(jù)采集周期更長(zhǎng)、數(shù)據(jù)處理難度大。
開(kāi)放平臺(tái)(Open Platform)是指軟件系統(tǒng)向第三方開(kāi)發(fā)者提供應(yīng)用程序編程接口(Application Programming Interface, API)或函數(shù),使得開(kāi)發(fā)者能夠調(diào)用該系統(tǒng)的資源以實(shí)現(xiàn)滿足自己需求的程序或增加該系統(tǒng)的功能,而不需要更改系統(tǒng)的源代碼。2010年新浪推出了新浪微博開(kāi)放平臺(tái),通過(guò)接入第三方合作伙伴的方式,向用戶提供更加豐富的應(yīng)用和完善的服務(wù)[14]。文獻(xiàn)[15]通過(guò)調(diào)用API實(shí)現(xiàn)了某景區(qū)一年的微博數(shù)據(jù)采集。文獻(xiàn)[16]以固定大小的格網(wǎng)調(diào)用微博API進(jìn)行簽到數(shù)據(jù)的獲取。利用該方法采集POI數(shù)據(jù)會(huì)造成高密度區(qū)域的數(shù)據(jù)目標(biāo)丟失,很難保證數(shù)據(jù)采集的完整性。文獻(xiàn)[17]在數(shù)據(jù)采集過(guò)程中對(duì)高密度的數(shù)據(jù)區(qū)域采用更加精細(xì)的格網(wǎng)進(jìn)行數(shù)據(jù)獲取。此方法設(shè)計(jì)缺乏靈活性,難以滿足大范圍內(nèi)的數(shù)據(jù)獲取需求。
由于新浪微博開(kāi)放平臺(tái)API對(duì)開(kāi)發(fā)者訪問(wèn)次數(shù)的限制,大多數(shù)學(xué)者采用將網(wǎng)絡(luò)爬蟲(chóng)與微博API相結(jié)合的策略采集微博數(shù)據(jù)[18-19]。通過(guò)這種綜合策略的方式可以最大效率的采集微博數(shù)據(jù),完成新浪微博API中由于權(quán)限等問(wèn)題無(wú)法獲取的數(shù)據(jù)。由于網(wǎng)絡(luò)爬蟲(chóng)采集的微博POI信息與通過(guò)API方式采集的信息存在一定的差異,一般調(diào)用API方式返回的信息比網(wǎng)絡(luò)爬蟲(chóng)方式豐富。因此,很難將兩種方式采集的微博POI數(shù)據(jù)融合到一起。
從已有的研究可以看出,大多數(shù)采集方案并沒(méi)有對(duì)研究區(qū)域進(jìn)行處理,容易造成高密度數(shù)據(jù)區(qū)域目標(biāo)丟失的問(wèn)題。而隨著新浪微博的不斷升級(jí),通過(guò)網(wǎng)絡(luò)爬蟲(chóng)方式采集數(shù)據(jù)受到的限制逐漸增多,難以滿足大范圍內(nèi)的海量POI數(shù)據(jù)采集。因此,本文提出一種四叉樹(shù)動(dòng)態(tài)格網(wǎng)的數(shù)據(jù)采集方法。能夠避免由于API限制導(dǎo)致數(shù)據(jù)目標(biāo)丟失的問(wèn)題,最大程度地保證數(shù)據(jù)采集的完整性。
本文在分析了傳統(tǒng)規(guī)則格網(wǎng)的數(shù)據(jù)獲取方式所存在缺陷的基礎(chǔ)上,采用了四叉樹(shù)思想動(dòng)態(tài)劃分格網(wǎng)來(lái)獲取數(shù)據(jù),能夠最大程度地保證數(shù)據(jù)采集的完整性,并兼顧了不同數(shù)據(jù)密度區(qū)域下的采集效率,適用于大范圍內(nèi)的微博POI簽到數(shù)據(jù)采集。
今《全宋文》收有陳景沂文兩篇,一是《全芳備祖序》,另一是《招隱寺玉蕊花記》,出《全芳備祖》前集卷六,見(jiàn)《全宋文》卷七九三○、第343冊(cè)第292-293頁(yè),題目均為編者所加。由于所據(jù)版本的缺陷,兩文與我們校點(diǎn)整理所得都有個(gè)別字詞出入,此依其題,全文羅列如下。
1)API參數(shù)說(shuō)明
本文主要使用獲取附近的地點(diǎn)等接口來(lái)采集微博POI數(shù)據(jù),通過(guò)輸入相應(yīng)的參數(shù),如經(jīng)緯度、半徑、返回的頁(yè)數(shù)、每頁(yè)記錄數(shù)等,就可以獲取到附近位置的微博POI簽到數(shù)據(jù)。接口請(qǐng)求參數(shù)見(jiàn)表1。
表1 API請(qǐng)求參數(shù)說(shuō)明Tab.1 The acquisition parameters of microblog API
由于新浪微博開(kāi)放平臺(tái)API提供的參數(shù)是某一半徑的搜索圓,所以想要獲取一定范圍內(nèi)的POI數(shù)據(jù),需要根據(jù)半徑參數(shù)對(duì)研究區(qū)域進(jìn)行格網(wǎng)化處理,并保留合適的重疊范圍,從而保證數(shù)據(jù)采集的完整性。
2)格網(wǎng)間距計(jì)算
合理的格網(wǎng)間距既要能夠保證采集范圍的有效重疊,又不能使得采集范圍重疊過(guò)多導(dǎo)致大量的重復(fù)采集。如圖1所示,采用搜索圓的內(nèi)接矩形作為基本的格網(wǎng)單元,假定搜索圓的半徑為r,那么格網(wǎng)邊長(zhǎng)為2r,格網(wǎng)點(diǎn)間距應(yīng)小于等于2r,這樣才能實(shí)現(xiàn)格網(wǎng)單元的有效重疊,避免某些區(qū)域數(shù)據(jù)目標(biāo)的缺失。本文采用的搜索圓半徑為2km、格網(wǎng)間距采用2.8 km。
圖1 格網(wǎng)劃分示意圖Fig.1 The display of grid partition
3)格網(wǎng)點(diǎn)生成
首先利用ArcGIS的漁網(wǎng)工具對(duì)目標(biāo)區(qū)域進(jìn)行格網(wǎng)化處理,得到格網(wǎng)中心點(diǎn)坐標(biāo),以格網(wǎng)中心點(diǎn)作為數(shù)據(jù)坐標(biāo)采集中心點(diǎn)來(lái)調(diào)用API獲取全國(guó)范圍內(nèi)的POI數(shù)據(jù)。
1)規(guī)則格網(wǎng)的數(shù)據(jù)獲取
規(guī)則格網(wǎng)的數(shù)據(jù)獲取首先通過(guò)讀取坐標(biāo)采集中心點(diǎn)經(jīng)緯度,調(diào)用新浪微博開(kāi)放平臺(tái)相應(yīng)的API,結(jié)合網(wǎng)頁(yè)解析技術(shù),從返回的數(shù)據(jù)中提取有價(jià)值的字段信息存儲(chǔ)到數(shù)據(jù)庫(kù)中,直到遍歷完所有的坐標(biāo)采集中心點(diǎn)為止。技術(shù)流程如圖2所示。
圖2 規(guī)則格網(wǎng)數(shù)據(jù)獲取流程圖Fig.2 The fl ow chart of data fetching based on regular grid
2)動(dòng)態(tài)格網(wǎng)的數(shù)據(jù)獲取
動(dòng)態(tài)格網(wǎng)的數(shù)據(jù)獲取首先采用類(lèi)似規(guī)則格網(wǎng)的方式去調(diào)用API,檢查當(dāng)前格網(wǎng)內(nèi)返回的POI總數(shù),如果超過(guò)一定的閾值(200),則采用四叉樹(shù)分裂法對(duì)該格網(wǎng)進(jìn)行動(dòng)態(tài)分割,分成4個(gè)小的格網(wǎng)遞歸獲取數(shù)據(jù)。直到返回的數(shù)據(jù)小于設(shè)定的閾值時(shí),表明當(dāng)前格網(wǎng)內(nèi)的POI數(shù)據(jù)采集完畢,否則繼續(xù)動(dòng)態(tài)分割格網(wǎng)。四叉樹(shù)動(dòng)態(tài)格網(wǎng)劃分示意圖如圖3所示。
圖3 四叉樹(shù)動(dòng)態(tài)格網(wǎng)劃分示意圖Fig.3 The display of quadtree dynamic grid partition
四叉樹(shù)動(dòng)態(tài)格網(wǎng)的數(shù)據(jù)獲取技術(shù)流程如圖4所示。
圖4 四叉樹(shù)動(dòng)態(tài)格網(wǎng)的數(shù)據(jù)獲取技術(shù)流程圖Fig.4 Technical workf l ow of data fetching based dynamic quadtree grid
為了最大程度保證數(shù)據(jù)獲取的完整性,數(shù)據(jù)采集格網(wǎng)存在一定的重疊,因此,在數(shù)據(jù)采集完成之后需要對(duì)其進(jìn)行分析并去掉冗余數(shù)據(jù)。調(diào)用API返回的數(shù)據(jù)格式為json格式,數(shù)據(jù)存儲(chǔ)在MongoDB中,MongoDB是一種面向文檔的,采用BSON的格式存儲(chǔ)的數(shù)據(jù)庫(kù),可以對(duì)比較復(fù)雜的數(shù)據(jù)類(lèi)型進(jìn)行存儲(chǔ),對(duì)文檔索引提供了十分廣泛的支持,能夠很好地解決這種大量的非結(jié)構(gòu)化的微博POI數(shù)據(jù)的存儲(chǔ)問(wèn)題。
通過(guò)規(guī)則格網(wǎng)方式最終得到有效數(shù)據(jù)415 655條,而利用四叉樹(shù)動(dòng)態(tài)格網(wǎng)方式得到有效數(shù)據(jù)為1963 851條。兩種數(shù)據(jù)獲取方案的對(duì)比見(jiàn)表2。
表2 數(shù)據(jù)獲取結(jié)果的對(duì)比Tab.2 The results of data acquisition
以北京市微博POI數(shù)據(jù)為例,按照一定經(jīng)緯度或距離劃分格網(wǎng),統(tǒng)計(jì)單位格網(wǎng)內(nèi)的POI總數(shù),對(duì)比兩種方式獲取的數(shù)據(jù)結(jié)果的分布。規(guī)則格網(wǎng)的數(shù)據(jù)獲取結(jié)果分布如圖5所示,四叉樹(shù)格網(wǎng)的數(shù)據(jù)獲取結(jié)果如圖6所示,規(guī)則格網(wǎng)相比于四叉樹(shù)格網(wǎng)所缺失數(shù)據(jù)的分布如圖7所示。
圖5 規(guī)則格網(wǎng)的數(shù)據(jù)獲取結(jié)果分布圖Fig.5 The distribution of data acquisition based on regular grid
圖6 四叉樹(shù)數(shù)據(jù)獲取結(jié)果分布圖Fig.6 The distribution of data acquisition based on quadtree grid
圖7 規(guī)則格網(wǎng)相較于四叉樹(shù)格網(wǎng)缺失數(shù)據(jù)分布Fig.7 The distribution of missing data compared with regular grid to quadtree grid
從以上數(shù)據(jù)獲取結(jié)果的分布可以看出,規(guī)則格網(wǎng)相較于四叉樹(shù)格網(wǎng)所缺失的數(shù)據(jù)主要分布在內(nèi)城區(qū)等POI比較密集的區(qū)域,如西城區(qū)、東城區(qū)、朝陽(yáng)區(qū)、海定區(qū)、石景山區(qū)、豐臺(tái)區(qū)等。其他像昌平區(qū)、順義區(qū)、通州區(qū)等城中心區(qū)域缺失的也比較多。POI越密集區(qū)域,規(guī)則格網(wǎng)所造成的數(shù)據(jù)缺失越多。城郊地區(qū)本身POI相對(duì)較少,所以缺失的數(shù)據(jù)也相對(duì)較少。
下面以2 km、6 km、10 km半徑去檢索北京故宮博物院附近的POI數(shù)據(jù),數(shù)據(jù)獲取結(jié)果見(jiàn)表3。
表3 不同半徑的檢索結(jié)果對(duì)比Tab.3 The results of data acquisition based on diあerent radius
由此可以發(fā)現(xiàn),在調(diào)用新浪微博API時(shí),返回?cái)?shù)據(jù)的最大值為200,所以通過(guò)規(guī)則格網(wǎng)的數(shù)據(jù)獲取方式在高密度數(shù)據(jù)區(qū)域容易造成數(shù)據(jù)目標(biāo)丟失的問(wèn)題,難以保證數(shù)據(jù)采集的完整性。
通過(guò)前面的實(shí)驗(yàn)結(jié)果對(duì)比,四叉樹(shù)動(dòng)態(tài)格網(wǎng)的獲取方式在獲取數(shù)據(jù)的完整性上具有明顯的優(yōu)勢(shì),能夠很好地適應(yīng)大范圍內(nèi)的微博POI采集。另外,通過(guò)規(guī)則格網(wǎng)的方式獲得同等規(guī)模的數(shù)據(jù)就需要將格網(wǎng)劃分的足夠小,此時(shí)就會(huì)導(dǎo)致在低密度數(shù)據(jù)區(qū)域的采集效率大大降低。而四叉樹(shù)動(dòng)態(tài)格網(wǎng)方式只會(huì)在高密度數(shù)據(jù)區(qū)域進(jìn)行動(dòng)態(tài)分割為更加細(xì)小的格網(wǎng),因此,四叉樹(shù)動(dòng)態(tài)格網(wǎng)方式能夠兼顧不同密度區(qū)域下的數(shù)據(jù)采集效率。為了規(guī)范API的使用,防止服務(wù)器資源被濫用,新浪微博API對(duì)返回的數(shù)據(jù)量有一定的限制,所以四叉樹(shù)動(dòng)態(tài)格網(wǎng)的獲取方式能夠最大程度地保證數(shù)據(jù)獲取的完整性。事實(shí)上,目前主流的開(kāi)放平臺(tái)API都采取類(lèi)似的措施從而防止API資源的濫用,如百度地圖API、高德地圖API等。
本文按照一定的經(jīng)緯度將研究區(qū)域進(jìn)行格網(wǎng)化處理,通過(guò)調(diào)用新浪微博開(kāi)放平臺(tái)API獲取微博POI數(shù)據(jù),由于該平臺(tái)的限制,在POI數(shù)據(jù)密集區(qū)域采用四叉樹(shù)動(dòng)態(tài)格網(wǎng)獲取數(shù)據(jù),從而保證數(shù)據(jù)采集的完整性,能夠適應(yīng)大范圍內(nèi)的海量微博POI簽到數(shù)據(jù)采集。與通過(guò)網(wǎng)絡(luò)爬蟲(chóng)的方式相比,本方案具有程序設(shè)計(jì)簡(jiǎn)單、限制少、數(shù)據(jù)處理簡(jiǎn)單、數(shù)據(jù)質(zhì)量高等特點(diǎn),相同數(shù)據(jù)量下的采集周期更短。與傳統(tǒng)的采用規(guī)則格網(wǎng)的方式相比,該方案很好地解決了高密度數(shù)據(jù)區(qū)域數(shù)據(jù)目標(biāo)容易丟失的問(wèn)題,能夠最大程度地保證數(shù)據(jù)采集的完整性。利用四叉樹(shù)思想動(dòng)態(tài)劃分格網(wǎng)的方法同樣適用于其他開(kāi)放平臺(tái)的數(shù)據(jù)采集,如百度地圖API、高德地圖API等。