黃藍(lán)會(huì)
(寶雞文理學(xué)院 計(jì)算機(jī)系,陜西 寶雞 721013)
互聯(lián)網(wǎng)和移動(dòng)通信技術(shù)的飛速發(fā)展,使得在線社會(huì)網(wǎng)絡(luò)在全球的熱度持續(xù)升溫,大量用戶吸引其中。據(jù)2012年1月CNNIC第29次“中國(guó)互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計(jì)報(bào)告”指出[1],中國(guó)網(wǎng)民的互聯(lián)網(wǎng)溝通交流方式發(fā)生明顯變化,傳統(tǒng)交流溝通類應(yīng)用大幅下滑,而微博/社交網(wǎng)絡(luò)等則快速崛起。據(jù)統(tǒng)計(jì),全球2012年微博用戶比2011年底增長(zhǎng)了296%。2009年8月運(yùn)行的新浪微博為中國(guó)在線社會(huì)網(wǎng)絡(luò)的典型代表,到2012年注冊(cè)用戶已經(jīng)超過3億,峰值每秒發(fā)送32 312條消息,每天發(fā)布近8 000萬條消息[2]。利用新浪微博上的用戶和消息進(jìn)行輿情分析,是當(dāng)前分析微博的一個(gè)重要用途,企業(yè)可以從中發(fā)掘潛在客戶,推廣產(chǎn)品,政府可以了解民生動(dòng)態(tài),將謠言扼殺在萌芽狀態(tài),出臺(tái)政策解決社會(huì)問題,所以,對(duì)于在線社會(huì)網(wǎng)絡(luò)進(jìn)入深入挖掘與分析具有重要的現(xiàn)實(shí)意義[3-4]。新浪微博中用戶和消息眾多,如何將這些數(shù)據(jù)采集到一起,則是信息挖掘和輿情分析的前期工作,本文設(shè)計(jì)一個(gè)爬蟲系統(tǒng),通過新浪微博開放的API接口采集數(shù)據(jù)。
新浪微博于2009年8月28日開始運(yùn)行,截至目前,新浪微博擁有3.5億用戶。新浪微博是一個(gè)類似于Twitter的微博系統(tǒng)。雖然其和Twitter在系統(tǒng)架構(gòu)上類似,但是新浪微博又有一些自己的特征:1)新浪微博內(nèi)容豐富,可以發(fā)送140以內(nèi)的漢字,同時(shí)也可以發(fā)送含有圖片、視頻、音樂,多媒體形式的存在,滿足了博友的表達(dá)需求,同時(shí)也有利于各種資源的傳播;2)發(fā)布渠道多樣,可以通過Web網(wǎng)頁,電子郵件插件,特別是可以用手機(jī)發(fā)微博,沒有發(fā)布工具的限制,微博用戶可以隨時(shí)隨地的發(fā)布信息;3)信息傳播零時(shí)差,多樣化的信息接收渠道可以讓用戶在第一時(shí)間接收到消息,而其一鍵轉(zhuǎn)發(fā)設(shè)置則讓轉(zhuǎn)發(fā)信息的過程實(shí)現(xiàn)零時(shí)差,同時(shí),微博采取的是單向跟隨的人際關(guān)系,用戶不需要是雙向的好友關(guān)系就可以任意的關(guān)注他人,這種模式可以使得信息以廣播式的方式急速擴(kuò)散[5]。
采集新浪微博的網(wǎng)絡(luò)數(shù)據(jù)是分析微博拓?fù)涮卣鞯那疤幔竟?jié)介紹新浪微博的數(shù)據(jù)屬性以及采集數(shù)據(jù)用到的API。
新浪微博中存在兩個(gè)網(wǎng)絡(luò):第一個(gè)網(wǎng)絡(luò)是關(guān)系網(wǎng)絡(luò),節(jié)點(diǎn)是用戶,邊是用戶之間的關(guān)注關(guān)系。第二個(gè)網(wǎng)絡(luò)是信息傳播網(wǎng)絡(luò),節(jié)點(diǎn)是用戶,邊是用戶之間微博的轉(zhuǎn)發(fā)和評(píng)論關(guān)系。數(shù)據(jù)可以分為兩大類[6]:用戶信息數(shù)據(jù)和微博信息數(shù)據(jù)。用戶信息數(shù)據(jù)中主要的字段包括:用戶UID、用戶昵稱、用戶所在城市、粉絲數(shù)、關(guān)注數(shù)、微博數(shù)、注冊(cè)時(shí)間、是否是微博認(rèn)證用戶、用戶的在線狀態(tài)、收藏?cái)?shù)等等。微博信息數(shù)據(jù)主要的字段包括:微博作者信息、發(fā)布時(shí)間、微博ID、微博內(nèi)容、評(píng)論數(shù)、轉(zhuǎn)發(fā)數(shù)等等。
2010年7月新浪微博開放其API接口,通過新浪微博登錄后可以瀏覽資料,但由于服務(wù)器的性能和網(wǎng)絡(luò)帶寬的限制,新浪微博的API對(duì)請(qǐng)求次數(shù)設(shè)置了嚴(yán)格的限制,每個(gè)賬戶每小時(shí)可以訪問150次,IP在一個(gè)小時(shí)內(nèi)只能申請(qǐng)1000次,只要控制好調(diào)用API的頻率,這個(gè)方法是獲取新浪微博數(shù)據(jù)的比較簡(jiǎn)單的途徑之一。
新浪微博開放平臺(tái)的體系參考了Twitter,兩者非常類似,包括接口、參數(shù)的定義,請(qǐng)求方式等等。如果熟悉Twitter的API,基本可以同樣的適用到新浪微博開放平臺(tái)上,同時(shí)新浪微博開放平臺(tái)的文檔技術(shù)部分的信息也可以同樣適用于Twitter。到目前為止,新浪微博開放平臺(tái)提供的API有如下幾個(gè)接口:微博接口、評(píng)論接口、用戶接口、關(guān)系接口、賬號(hào)接口、收藏接口、話題接口、標(biāo)簽接口、注冊(cè)接口、搜索接口、推薦接口、提醒接口、短鏈接口、公共服務(wù)接口、地理信息接口[5]。具體每一個(gè)接口的功能以及該接口下的API可參看新浪微博開放平臺(tái)的API文檔。
本文設(shè)計(jì)的網(wǎng)絡(luò)爬蟲系統(tǒng)由兩個(gè)模塊組成,分別是模擬登錄模塊和爬取模塊。圖1給出了該爬蟲模型。下面將具體介紹兩個(gè)模塊。

圖1 網(wǎng)絡(luò)爬蟲模型Fig.1 Model of crawler
由于一般的瀏覽器提供了自動(dòng)獲取并保持用戶訪問某網(wǎng)站時(shí)產(chǎn)生的cookie,創(chuàng)建相應(yīng)的session,所以用戶在第一次通過瀏覽器進(jìn)入新浪微博時(shí)需要登錄,但之后一段時(shí)間就可以不需要再登錄,直接進(jìn)入系統(tǒng)。目前新浪微博服務(wù)器無法對(duì)一段普通的計(jì)算機(jī)程序的訪問創(chuàng)建相應(yīng)的session,因此,為了方便網(wǎng)頁爬蟲模塊的實(shí)現(xiàn),我們采用新浪微博模擬登錄方法來解決。
為了實(shí)現(xiàn)對(duì)新浪微博的模擬登錄,首先要獲得一個(gè)可以使用的cookie,實(shí)驗(yàn)中利用chrome瀏覽器直接可以獲得用戶登錄某網(wǎng)站的cookie,之后就可以創(chuàng)建session,從而實(shí)現(xiàn)模擬登錄。數(shù)據(jù)采集人員在模擬登錄之后,就可以采用點(diǎn)擊微博頁面的方法去啟動(dòng)程序了。
Web1.0網(wǎng)頁的獲取是通過網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)的。網(wǎng)絡(luò)爬蟲的工作流程是通過設(shè)定種子URL作為入口地址,程序按照一定的爬行策略獲取每一個(gè)URL對(duì)應(yīng)的網(wǎng)頁內(nèi)容,然后解析網(wǎng)頁內(nèi)容,從中提取出鏈接的URL作為下一次爬行的種子,依次循環(huán),直到滿足爬行結(jié)束的條件。
在本系統(tǒng)中,首先選用合適的種子用戶開始爬取數(shù)據(jù),爬行策略基本上和Web1.0的爬行策略相同,不同的是新浪微博的網(wǎng)頁爬蟲是根據(jù)用戶之間的關(guān)系向外爬行的,不能像Web1.0根據(jù)鏈出網(wǎng)頁URL進(jìn)行爬行,在新浪微博中,我們采用從一個(gè)給定的種子用戶,通過關(guān)注改用戶的關(guān)注列表,依次獲得關(guān)注列表中的每一個(gè)人的關(guān)注列表,這樣一層一層的向外擴(kuò)展。
下載微博網(wǎng)頁可以和下載普通網(wǎng)頁一樣,通過網(wǎng)頁URL定位到該網(wǎng)頁后利用JAVA程序提供的下載網(wǎng)頁的函數(shù),該函數(shù)會(huì)打開一個(gè)數(shù)據(jù)流,執(zhí)行完后整個(gè)網(wǎng)頁內(nèi)容會(huì)以字符串的形式保存下來。
解析網(wǎng)頁通常是制定一個(gè)頁面解析規(guī)則,由于新浪微博相同種類的頁面的編碼規(guī)則一樣,所以采用將HTML網(wǎng)頁轉(zhuǎn)化為標(biāo)準(zhǔn)的DOM樹結(jié)構(gòu)的方法,可以將頁面解析出來供后續(xù)篩選用。采用這個(gè)方法的原來是程序員在編寫HTML網(wǎng)頁時(shí)很多標(biāo)簽不是成對(duì)出現(xiàn)的,所以直接利用HTML解析網(wǎng)頁信息比較困難,而標(biāo)準(zhǔn)的DOM樹結(jié)構(gòu)利用Xpath可以很方便的定位存放數(shù)據(jù)的DOM節(jié)點(diǎn)位置,抽取該節(jié)點(diǎn)的內(nèi)容。所以,采用標(biāo)準(zhǔn)的DOM樹結(jié)構(gòu)可以很方便的解析網(wǎng)頁。
篩選用戶信息實(shí)際上是一個(gè)數(shù)據(jù)去重操作,在Web1.0網(wǎng)頁爬蟲中去重的方法很多,可以用C++或者JAVA語音提供的現(xiàn)成的HashMap數(shù)據(jù)結(jié)構(gòu),但是這種去重策略不能滿足大規(guī)模的網(wǎng)頁爬行,如果網(wǎng)頁數(shù)量很大,HashMap<string,blooean>所占內(nèi)存會(huì)很大。本文設(shè)計(jì)一個(gè)針對(duì)新浪微博用戶信息數(shù)據(jù)獲取過程的過濾算法。根據(jù)新浪微博為每一個(gè)注冊(cè)用戶分配的64位整數(shù)隨機(jī)ID號(hào),以其作為二進(jìn)制向量的下標(biāo)查找,如果小標(biāo)的對(duì)應(yīng)值為1,證明已經(jīng)獲取過該ID的用戶信息,否則說明這個(gè)用戶信息還沒有被獲取過。當(dāng)需要開辟一個(gè)40億的二進(jìn)制數(shù)組的時(shí)候,所需內(nèi)存為470M,一般的PC機(jī)都能承受。JAVA提供的數(shù)據(jù)結(jié)構(gòu)bitmap,實(shí)際是一個(gè)bit數(shù)組,利用其可以代替二進(jìn)制向量,初始化時(shí)大小不能超過2147483648,以此將用戶ID號(hào)分為4個(gè)區(qū)間分別用一個(gè)過濾器處理。
具體的過濾算法如下:
Boolean WEIBO_ID_FILTER(ID)
if(ID> FOURTH_INTERVAL)Then

表1 新浪微博媒體用戶ID分段過濾Tab.1 Subsition filtration of user ID in Sina wicroblog
Long newID←ID-FOURTH_INTERVAL
if(FOURTH_FILTER[newID]為 0)
Then FOURTH_FILTER[newID]置1
return true
Else return false
EndIf
EndIf
if(ID> THIRD_INTERVAL)Then
Long newID←ID-THIRD_INTERVAL
if(THIRD_FILTER[newID]為 0)
Then THIRD_FILTER[newID]置1
return true
Else return false
EndIf
EndIf
if(ID> SECOND_INTERVAL) Then
Long newID←ID-SECOND_INTERVAL
If(SECOND_FILTER[newID]為 0)
Then SECOND_FILTER[newID]置1
return true
Else return false
EndIf
EndIf
if(ID> FIRST_INTERVAL) Then
Long newID←ID-FIRST_INTERVAL
If(FIRST_FILTER[newID]為 0)
Then FIRST_FILTER[newID]置1
return true
Else return false
EndIf
EndIf
服務(wù)器的軟件環(huán)境:
操作系統(tǒng):Windows Server 2003 R2;
數(shù)據(jù)庫:MySQL Server 5.0.1;
服務(wù)器的數(shù)據(jù)采集模塊;.NET 3.5;
數(shù)據(jù)分發(fā)服務(wù)器:JDK 1.6,Eclipse 3.5;
數(shù)據(jù)采集模塊:Visual Studio 2005;
開發(fā)語言:C#,Java
本實(shí)驗(yàn)主要是比較布隆過濾器和本文采用的過濾算法的效率。利用從1到100000000個(gè)不同的數(shù)字和10萬個(gè)重復(fù)數(shù)字作為實(shí)驗(yàn)數(shù)據(jù),用布隆過濾器和本文的過濾算法對(duì)1億個(gè)不同數(shù)字和10萬個(gè)重復(fù)數(shù)字分別進(jìn)行過濾去重。

表2 1億個(gè)不同數(shù)字的過濾效果Tab.2 Filtering result about one bilion different digital
從表2可以看出,本文采用的過濾算法明顯高于布隆過濾器。因?yàn)椴悸∵^濾器要將待過濾元素映射到8個(gè)值后再去查找二進(jìn)制向量。本文用的過濾算法不用映射直接去查找。

表3 10萬相同數(shù)字的過濾效果Tab.3 Filtering result about ten million same digital
從表3可以看出,兩種過濾算法對(duì)于重復(fù)數(shù)據(jù)都可以檢測(cè)到。
中國(guó)新浪微博的迅猛發(fā)展已經(jīng)影響到我們的方方面面,從中收集用戶資料進(jìn)行輿情分析是目前很多專家學(xué)者開始的一個(gè)新課題,其中收集用戶資料則是這項(xiàng)研究的基礎(chǔ),只有采集到足夠數(shù)量的數(shù)據(jù),分析才有意義。本文設(shè)計(jì)了一個(gè)網(wǎng)絡(luò)爬蟲系統(tǒng),利用新浪微博的API爬取用戶資料,實(shí)驗(yàn)證明,該方法在較短的時(shí)間內(nèi)能收集到較多用戶資料,達(dá)到較為滿意的效果。
[1]CNNIC.第29次中國(guó)互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r調(diào)查統(tǒng)計(jì)報(bào)告[R].北京:中國(guó)互聯(lián)網(wǎng)絡(luò)信息中心,2012.
[2]高戈坤.新浪微博用戶數(shù)再創(chuàng)新高[J].通信世界,2012(2):10-11.GAO Ge-kun.Sina micro-blog user number to a new high[J].Communication Word Weekly,2012(2):10-11.
[3]林旺群.基于帶權(quán)圖的層次化社區(qū)并行計(jì)算[J].方法.軟件學(xué)報(bào),2012,6(23):1517-1530.LIN Wang-qun.Paraller computing hierachical community approach based on weighted-graph[J].Journal of Software,2012,6(23):1517-1530.
[4]劉興亮.微博的傳播機(jī)制及未來發(fā)展思考 [J].新聞與寫作,2010(1):43-46.LIU Xing-liang.Thinking about communication mechanism micro-blog and future development[J].News and Writing,2010(1):43-46.
[5]王亮.微博媒體的信息傳播分析[D].哈爾濱:哈爾濱工業(yè)大學(xué),2012.
[6]郭正彪.大尺度在線社會(huì)網(wǎng)絡(luò)結(jié)構(gòu)嚴(yán)謹(jǐn)[D].武漢:華中科技大學(xué),2012.