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

圖1 網絡爬蟲模型Fig.1 Model of crawler
由于一般的瀏覽器提供了自動獲取并保持用戶訪問某網站時產生的cookie,創建相應的session,所以用戶在第一次通過瀏覽器進入新浪微博時需要登錄,但之后一段時間就可以不需要再登錄,直接進入系統。目前新浪微博服務器無法對一段普通的計算機程序的訪問創建相應的session,因此,為了方便網頁爬蟲模塊的實現,我們采用新浪微博模擬登錄方法來解決。
為了實現對新浪微博的模擬登錄,首先要獲得一個可以使用的cookie,實驗中利用chrome瀏覽器直接可以獲得用戶登錄某網站的cookie,之后就可以創建session,從而實現模擬登錄。數據采集人員在模擬登錄之后,就可以采用點擊微博頁面的方法去啟動程序了。
Web1.0網頁的獲取是通過網絡爬蟲實現的。網絡爬蟲的工作流程是通過設定種子URL作為入口地址,程序按照一定的爬行策略獲取每一個URL對應的網頁內容,然后解析網頁內容,從中提取出鏈接的URL作為下一次爬行的種子,依次循環,直到滿足爬行結束的條件。
在本系統中,首先選用合適的種子用戶開始爬取數據,爬行策略基本上和Web1.0的爬行策略相同,不同的是新浪微博的網頁爬蟲是根據用戶之間的關系向外爬行的,不能像Web1.0根據鏈出網頁URL進行爬行,在新浪微博中,我們采用從一個給定的種子用戶,通過關注改用戶的關注列表,依次獲得關注列表中的每一個人的關注列表,這樣一層一層的向外擴展。
下載微博網頁可以和下載普通網頁一樣,通過網頁URL定位到該網頁后利用JAVA程序提供的下載網頁的函數,該函數會打開一個數據流,執行完后整個網頁內容會以字符串的形式保存下來。
解析網頁通常是制定一個頁面解析規則,由于新浪微博相同種類的頁面的編碼規則一樣,所以采用將HTML網頁轉化為標準的DOM樹結構的方法,可以將頁面解析出來供后續篩選用。采用這個方法的原來是程序員在編寫HTML網頁時很多標簽不是成對出現的,所以直接利用HTML解析網頁信息比較困難,而標準的DOM樹結構利用Xpath可以很方便的定位存放數據的DOM節點位置,抽取該節點的內容。所以,采用標準的DOM樹結構可以很方便的解析網頁。
篩選用戶信息實際上是一個數據去重操作,在Web1.0網頁爬蟲中去重的方法很多,可以用C++或者JAVA語音提供的現成的HashMap數據結構,但是這種去重策略不能滿足大規模的網頁爬行,如果網頁數量很大,HashMap<string,blooean>所占內存會很大。本文設計一個針對新浪微博用戶信息數據獲取過程的過濾算法。根據新浪微博為每一個注冊用戶分配的64位整數隨機ID號,以其作為二進制向量的下標查找,如果小標的對應值為1,證明已經獲取過該ID的用戶信息,否則說明這個用戶信息還沒有被獲取過。當需要開辟一個40億的二進制數組的時候,所需內存為470M,一般的PC機都能承受。JAVA提供的數據結構bitmap,實際是一個bit數組,利用其可以代替二進制向量,初始化時大小不能超過2147483648,以此將用戶ID號分為4個區間分別用一個過濾器處理。
具體的過濾算法如下:
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
服務器的軟件環境:
操作系統:Windows Server 2003 R2;
數據庫:MySQL Server 5.0.1;
服務器的數據采集模塊;.NET 3.5;
數據分發服務器:JDK 1.6,Eclipse 3.5;
數據采集模塊:Visual Studio 2005;
開發語言:C#,Java
本實驗主要是比較布隆過濾器和本文采用的過濾算法的效率。利用從1到100000000個不同的數字和10萬個重復數字作為實驗數據,用布隆過濾器和本文的過濾算法對1億個不同數字和10萬個重復數字分別進行過濾去重。

表2 1億個不同數字的過濾效果Tab.2 Filtering result about one bilion different digital
從表2可以看出,本文采用的過濾算法明顯高于布隆過濾器。因為布隆過濾器要將待過濾元素映射到8個值后再去查找二進制向量。本文用的過濾算法不用映射直接去查找。

表3 10萬相同數字的過濾效果Tab.3 Filtering result about ten million same digital
從表3可以看出,兩種過濾算法對于重復數據都可以檢測到。
中國新浪微博的迅猛發展已經影響到我們的方方面面,從中收集用戶資料進行輿情分析是目前很多專家學者開始的一個新課題,其中收集用戶資料則是這項研究的基礎,只有采集到足夠數量的數據,分析才有意義。本文設計了一個網絡爬蟲系統,利用新浪微博的API爬取用戶資料,實驗證明,該方法在較短的時間內能收集到較多用戶資料,達到較為滿意的效果。
[1]CNNIC.第29次中國互聯網絡發展狀況調查統計報告[R].北京:中國互聯網絡信息中心,2012.
[2]高戈坤.新浪微博用戶數再創新高[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]林旺群.基于帶權圖的層次化社區并行計算[J].方法.軟件學報,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].新聞與寫作,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].哈爾濱:哈爾濱工業大學,2012.
[6]郭正彪.大尺度在線社會網絡結構嚴謹[D].武漢:華中科技大學,2012.