鐘明翔 唐晉韜 謝松縣 王 挺
(國防科學技術大學計算機學院 長沙 410073)
?
一種基于動態網頁解析的微博數據抓取方法*
鐘明翔 唐晉韜 謝松縣 王 挺
(國防科學技術大學計算機學院 長沙 410073)
微博是一種新型信息傳播媒介,產生的海量數據吸引研究人員關注并開展相關研究。微博數據獲取是后續分析研究的基礎和起點。以新浪微博平臺為研究對象,提出了基于動態網頁解析技術的微博數據多線程抓取方法。方法利用瀏覽器內核解析微博頁面動態數據,通過模擬登陸,依據社交網站網頁鏈接特點確定頁面爬取策略,使用頁面解析技術定制頁面數據抽取模板,實現以用戶為中心的微博數據獲取。抓取結果表明,方法能對微博用戶數據進行全面高效抓取,為后續數據分析和處理提供數據支持。
新浪微博; 數據挖掘; 動態網頁; 爬蟲
Class Number
近年來,社交媒體在互聯網上迅速發展和普及。在線社交網站、博客、維基、微博等社交網絡應用在普通大眾中不斷普及和深入。微博以其平臺的開放性、內容發布的低門檻特性發展為重要的社會化媒體。Twitter自2006年創建以來,用戶數量一直保持高速增長勢頭。2009年用戶增長率高達2565%,是社交網站Facebook和LinkedIn用戶增長率總和的10倍[1]。新浪自2009年8月推出微博產品以來,迅速成長為中國微博平臺代表。截止2014年底,微博用戶數量超5.3億,月活躍用戶數量達到1.76億,目前是中國最具影響力和關注度的微博平臺。
網民通過微博平臺發布和獲取信息、表達自我,形成社會輿論。以信息傳播為載體維系網絡社會關系。微博已經逐漸對社會發展和國家安全產生深遠影響。以Facebook、Twitter為代表的社交網站,已經多次證明它們在一些社會事件中扮演著舉足輕重的角色。利用微博數據進行輿情分析和潛在客戶發掘,使微博數據挖掘具有重大的社會意義和巨大商業價值。
在國內,大量研究人員針對微博數據開展相關研究。HAN Ruixia[2]介紹了微博平臺的基本概念和特點。新浪微博官方提供技術支持的SDK,出于商業利益和網絡資源保護考慮,對普通開發者調用API獲取數據進行了限制。也未對網絡爬蟲和搜索引擎提供靜態文件。因此微博數據的全面高效獲取成為制約微博研究的一個瓶頸。目前微博數據獲取方法可分為四種[3]: 1) 基于微博開放平臺的數據獲取技術,即利用微博平臺提供的API。 2) 基于網絡爬蟲的數據獲取技術。 3) 基于數據源鏡像的數據獲取技術。 4) 基于網絡數據流的數據獲取技術。基于鏡像資源的數據獲取往往不是免費的,且獲取需要一定的權限。基于網絡數據流的獲取需要硬件支持來實現網絡環境下用戶數據的捕獲。通過網絡數據流的解析和重構來獲取微博數據,需要比較復雜的技術。因此對于普通的開發和研究人員而言,針對新浪微博數據的獲取方式,主要有以下兩種主要思路及做法: 1) 利用微博平臺提供的SDK調用API獲取數據; 2) 利用網絡爬蟲抓取網頁內容,根據規則提取信息,或者二者組合應用。陳舜華等[4]提出了合理控制新浪微博API調用頻次的分布式抓取技術。周立柱等[5]提出了利用聚焦爬蟲抓取網頁內容,并按規則提取有效信息的思路,但未涉及登陸模式,難以支持微博數據的完整獲取。廉捷等[6]提出了結合新浪微博API和網絡爬蟲與網頁解析,實現微博數據的高效獲取方案。孫青云等[7]提出了基于模擬登陸,使用傳統網絡爬蟲,從下載的網頁中抽取微博和用戶信息數據的方案。但沒有涉及網頁動態數據的獲取和解析,不能完整獲取用戶評論和轉發等重要信息。
通過對不同微博數據抓取方式進行分析,本文選擇基于網頁動態數據解析的爬蟲方案,并實現了一個以登錄用戶相關的微博數據抓取系統。
綜合分析目前兩種獲取微博數據的方案: 1) 通過API調用能簡潔高效獲取便于分析的結構化數據,但在調用頻次和返回結果最大數量有諸多限制。 2) 使用網絡爬蟲方案比較靈活,可基于模擬登陸和網頁數據解析獲取相關數據,但實現難度較大,且無法獲取結構化的微博數據。
2.1 新浪微博API
微博開放平臺(Weibo Open Platform)是利用微博平臺的信息傳播能力接入第三方應用,向用戶提供應用和服務的開放平臺。目前新浪微博開放平臺提供了微博接口、關系接口、用戶接口、評論接口、粉絲服務接口等26類API接口[8]。幾乎包括了微博的所有功能。但對于需定制的數據請求服務,則必須在API基礎上進行擴展開發。開發者要調用API首先需通過OAUTH2.0認證授權。現在新浪微博全面采用OAUTH2.0認證授權。在OAUTH2.0授權下通過調用API接口請求獲取JSON格式數據文件。通過OAUTH2.0調用API接口有兩種方式: 1) 直接使用參數傳遞。如參數名為access_token,調用方式為https://api.weibo.com/2/statuses/public_timeline.json? access_token=abcd。其中json?表示返回數據格式為JSON。JSON是一種輕量級數據交換格式。JSON文件結構簡單,不使用標記內容屬性的說明性標簽。如:{“ID”:“1472368912”:“name”:“Jake”}。因此JSON文件不僅返回文件更小,而且計算機易于分析處理。 2) 在header里傳遞。如Access Token的值為abcd,調用形式為在header里添加Authorization:OAuth2 abcd。其他的接口參數正常傳遞即可。
出于商業利益和服務器安全考慮,新浪微博API從用戶維度和IP維度,對不同授權級別開發者進行了訪問頻次限制。為防止用戶調用API進行非法操作,新浪微博開放平臺針對API的返回數據量和調用次數也進行了嚴格限制。且微博API技術原理是HTTP輪詢(POLLING),非即時推送(realtime push)協議。調用API不能達到及時獲取最新消息的效果。
2.2 網絡爬蟲
網絡爬蟲(又稱網頁蜘蛛,網絡機器人等),是一種按照設定規則自動抓取萬維網信息的程序或腳本。初期的通用爬蟲是對萬維網的所有網頁進行無差別抓取。其目標是盡可能大的網絡覆蓋率。隨著萬維網數據形式不斷豐富和網絡技術的發展,為根據既定抓取目標有選擇的獲取信息,面向垂直搜索的聚焦爬蟲應運而生[9]。垂直搜索的聚焦爬蟲目的是精確地抽取網頁內容,并保存為結構化數據。其重點和難點在于定制高效的網頁內容分析和抽取。聚焦爬蟲從當前抓取頁面數據中進行分析和過濾,根據一定策略選擇URL放入后續抓取隊列,直到滿足停止條件則終止。因此可以通過合理設置URL選擇策略和頁面數據抽取策略,使用網絡爬蟲來獲取相關數據。
Ajax是一種創建快速動態網頁技術。可在不重新加載整個網頁情況下,通過后臺與服務器進行少量數據交換,實現網頁某個部分的異步更新。為減少網絡傳輸流量,提高用戶體驗度,微博網站對Ajax技術應用越來越多。目前新浪微博的評論和轉發信息都是由JavaScript動態生成。由于Ajax頁面是由客戶端瀏覽器執行腳本代碼動態生成。因此網絡爬蟲僅能抓取web服務器返回的html文件,不能抓取JavaScript動態生成的信息。同時由于新浪微博的用戶隱私保護策略,只有登錄的用戶才能對評論、轉發等頁面信息進行瀏覽。因此,使用網絡爬蟲必須解決網頁客戶端動態數據獲取和模擬登陸兩個問題。
3.1 爬蟲框架下動態網頁數據獲取技術
在網絡爬蟲框架中,頁面下載模塊負責網頁數據的下載獲取。本文針對傳統網絡爬蟲無法爬取Ajax頁面內容數據的問題,對網絡爬蟲頁面下載模塊進行改造。傳統網絡爬蟲頁面下載模塊直接使用http協議,接受并分析服務器響應來實現頁面下載。然而針對社交網站頁面javascript動態加載的網頁數據,使用http協議不能取到完整頁面內容。目前的主要有兩種思路: 1) 分析javascript邏輯,通過爬蟲在網頁中提取關鍵數據去構造Ajax請求,最后從服務器響應中獲取完整數據。但是由于javascript代碼使用和編寫不規范導致效果不很理想。 2) 在爬蟲頁面下載模塊,利用Web自動測試工具模擬瀏覽器提取Ajax頁面內容。直接獲取加載完整的頁面數據。目前針對這種方法已經有比較成熟的方案,能在保證速度的情況下有較好的穩定性。Selenium是一個開源Web功能測試工具[10]。通過javascript管理測試過程。其針對Java提供API可以和瀏覽器內核進行交互,其核心是webdriver,可以模擬用戶真實操作,包括瀏覽網頁頁面,觸發鼠標事件、點擊鏈接、提交表單、輸入文字等用戶行為。通過對網絡爬蟲抓取框架的頁面下載模塊進行改寫,控制瀏覽器內核與微博Web服務器交互,持續獲取完整頁面動態數據。即可實現模擬登陸以及獲取完整的Ajax頁面數據。爬蟲系統框架如圖1所示。其中爬蟲框架模塊劃分不是本文重點,在此不展開闡述,詳細細節請參考相關引用文獻。

圖1 網絡爬蟲框架
3.2 模擬登陸
使用爬蟲對微博網頁進行爬取之前,首先需要進行模擬登錄。模擬登陸通過Java程序模擬瀏覽器行為實現登陸過程。模擬登陸程序通過webdriver打開登陸頁面。使用findElement方法進行頁面元素查找和定位。在頁面元素內通過讀取配置文件模擬輸入用戶名、密碼,提交按鈕完成模擬登陸流程。模擬登陸基本實現過程如下:
1) 利用webdriver打開登陸頁面。
2) 使用findElement方法在登陸頁面內查找賬號和密碼輸入框元素,通過sendkey方法對該元素進行傳值。如密碼輸入框元素查找方式為:findElement(By.xpath(("http://input[@node-type='password'],之后通過sendKeys(pswd)即可完成密碼輸入。
3) 通過查找和點擊提交按鈕完成登陸流程。
程序模擬登陸成功后,通過調用瀏覽器內核向服務器發送數據請求來實現微博網頁的獲取。通過客戶端保持與服務器的session會話即可繼續訪問微博的其它數據資源。
3.3 針對社交網站網頁特征的抓取
從網絡數據的拓撲特征上講,社交網站數據屬性區別于一般的普通網站。社交網站網絡數據分為兩大類[11]:用戶信息數據和微博信息數據。用戶信息數據主要字段包括:用戶UID、昵稱、所在城市、微博數、粉絲數、關注數、注冊時間、用戶認證類型等。微博信息數據主要字段包括:作者信息、微博ID、發布時間、內容、評論數、轉發數等。社交網站數據存在兩個維度的網絡:第一個是用戶關系網絡。其節點是用戶,邊是用戶之間的關注關系。第二個是信息傳播網絡。其節點是用戶,邊是針對同一主題用戶之間的轉發評論關系。
面對海量龐雜的微博網站數據,必須確定合適的頁面抓取策略,才能實現對特定微博所有數據進行完整獲取。本文針對社交網站數據的屬性特征使用如下頁面抓取策略:
1) 以微博用戶首頁設為初始頁面,作為爬蟲的入口。通過爬蟲頁面下載模塊進行動態頁面數據獲取,從中抽取出微博用戶發布的所有微博鏈接。
2) 將抽取出的用戶微博鏈接放入待抽取隊列。
3) 從每條微博獨立頁面中抓取微博數據信息(作者信息、微博ID、源微博ID、發布時間、內容、評論數、轉發數、點贊數)。
4) 從微博評論頁面中通過模擬瀏覽器行為進行點擊和翻頁,抓取評論信息(評論內容、評論時間、評論作者ID、評論作者名稱、評論作者微博主頁)。
5) 從微博轉發頁面中通過模擬瀏覽器行為進行點擊和翻頁,抓取轉發數據(轉發ID、轉發源ID、轉發時間)。
6) 將每一條轉發信息作為一條微博,從中抽取出鏈接放入待抽取隊列。
然后重復步驟3)至6),由此即可以獲取特定微博用戶發布微博的完整相關信息數據。程序通過設置最大轉發層次數,來控制爬蟲的抓取深度。程序抓取過程如圖2所示。

圖2 網頁數據爬取策略
3.4 頁面解析技術
爬蟲頁面下載模塊通過調用瀏覽器內核,獲取微博頁面完整的HTML格式文件。經過分析新浪微博頁面編碼,發現該平臺內相同頁面類型的編碼規則一樣。因此可以針對新浪微博頁面編碼規則,深度定制微博頁面信息解析抽取模板,即可實現同類型微博頁面數據的解析抽取。通過將不標準的HTML語言轉換為DOM數結構,利用xpath和正則表達式等頁面解析技術,可實現微博頁面數據的高效精確獲取。xpath使用路徑表達式對HTML頁面文件節點元素進行定位選取。正則表達式通過字符串描述、匹配符合規則的字符串。使用正則表達式可摘取字符串中需要的指定內容。把二者結合起來,通過鏈式抽取可以準確高效地解析出所需的微博數據。
通過分析微博數據編碼規范,可針對每一種微博數據進行抽取模板定制,從而實現相關數據的高效全面抽取。如:在新浪微博用戶首頁中,所有微博鏈接信息均保存在DOM數結構屬性為WB_feed WB_feed_profile的一對〈div〉節點內。通過絕對路徑://[@node-type='feed_list_item_date']/@href可獲取當前用戶發表的所有微博鏈接。在獨立微博頁面中通過絕對路徑://div[@class='WB_cardwrap WB_feed_type S_bg2']/@mid即可獲取當前微博mid值。在微博評論頁面中通過絕對路徑://div[@node-type='replywrap']/div[@class='WB_text']/allText()可獲取評論用戶名及其評論內容。
本文提出了基于網頁動態數據獲取的微博數據爬蟲抓取方案。測試中選擇抓取新浪微博平臺軍報記者微博賬號內微博數據,包括微博信息數據、評論信息數據、轉發信息數據和相關用戶信息數據。對數據抓取效果進行統計分析,對方案爬蟲性能進行驗證分析并針對影響其性能的原因進行分析。
4.1 數據抓取統計分析
在本實驗中對軍報記者微博賬號內2015年2月4日14:40至2月9日16:00的100條微博數據進行統計分析。爬蟲爬取時間為2月4日15:24:54,即以該時刻的100條微博數據進行截面研究。爬蟲程序共爬取了該100條微博的共計2187條評論信息、4295條轉發信息和2489個用戶信息。其中評論信息包括評論ID、微博ID、評論用戶ID、評論用戶昵稱、評論內容、評論時間,共六個字段值屬性。轉發信息包括轉發ID、源轉發ID、轉發時間,共三個字段值屬性。轉發層次深度未做設定,即抓取微博的所有轉發數據。用戶信息包括用戶ID、用戶主頁、用戶昵稱,共三個字段值屬性。用戶包含評論用戶和轉發用戶。綜合統計所有字段屬性總數據條目數量和有效數據條目數量,情況如表1所示。其中有效數據定義為程序準確抽取,并正確保存在Mysql數據庫表中的字段屬性值。

表1 數據準確度統計
從表1可以看出該方案對微博數據的抓取準確度達到了較好的效果。可以對微博傳播路徑分析、情感傾向分析等提供完整準確的數據支持。
4.2 爬蟲抓取性能分析
社交網站數據挖掘屬于大數據范疇。微博信息數據量龐大,輿情分析需要海量數據作為基礎。單進程爬蟲往往很難滿足快速抓取大量數據進行輿情分析的需求。本文采用支持并行架構擴展的網絡爬蟲框架,可以實現多線程并行爬取。本實驗仍針對以上100條微博數據,通過開啟不同線程數,運行爬蟲程序查看其運行速度及加速比。由于實驗數據對象實時更新變化,各次抓取數據量會存在極微小差異,但不影響實驗結論。爬蟲程序在開啟1個線程的情況下,完成以上100條微博數據的全面抓取并持久化到數據庫,運行時間為4554s。表2為不同線程下爬蟲并行抓取時間及加速比。

表2 并行抓取耗時及加速比
由于方案基于動態網頁數據獲取和頁面解析,爬蟲程序在運行過程中需開啟、關閉瀏覽器,執行Ajax動態數據渲染,提取頁面導航元素,觸發導航事件并執行頁面指令。因此對比微博API調用方式獲取數據更耗時。但方案以性能為代價獲取完整全面的微博數據,是傳統微博數據爬蟲和API調用方式不能比擬的。從實驗結果可以看出,并行爬蟲在多線程并發運行方面具有較好的線性加速比。這說明該方案對海量微博數據的抓取有著非常好的加速效果和潛力。通過合理設置爬蟲并行線程數,在保證網絡資源帶寬的條件下,可以快速高效的獲取微博數據。
本文介紹了新浪微博數據獲取方式,對兩種獲取方式用法與限制進行闡述和分析。解決了新浪微博數據因API限制和網絡爬蟲限制而無法完整獲取的問題。基于網頁動態數據獲取技術,通過模擬登陸,確定頁面爬取策略,設計微博信息抽取模板和存儲方式,完成新浪微博數據挖掘的完整流程。實現了新浪微博數據定制化挖掘方案的實驗與應用。實驗表明,基于網頁動態數據獲取,結合網絡爬蟲技術和頁面解析技術,對網絡爬蟲進行定制改造,能實現指定微博數據的高效和完整獲取,可以為社交網絡數據挖掘提供準確全面的數據支持。
[1] ABRAHAM R, MART NEZ T. Twittter: Network properties analysis[C]//Proceedings of the CONIELECOMP 2010-20th International Conference on Electronics Communications and Computers. Cholula Puebla, Mexico: IEEE Computer Society,2010:180- 183.
[2] HAN Ruixia. The influence of microblogging on personal public partion[C]//Proceeding of the 2010 IEEE 2nd Symposium on Web Society, SWS 2010. Beijing, China: Association for Computing Machinery,2010:615-618.
[3] 游翔,葛衛麗.微博數據獲取技術及展望[J].電子科技,2014,27(10):123-126.
[4] 陳舜華,王曉彤,等.基于微博API的分布式抓取技術[J].電信科學,2013,8(25):147-149.
[5] 周立柱,林玲.聚焦爬蟲技術研究綜述[J].計算機應用,2005,25(9):1965-1969.
[6] 廉捷,周欣,曹偉.新浪微博數據挖掘方案[J].清華大學學報(自然科學版),2011,51(10):1300-1305.
[7] 孫青云,等.一種基于模擬登錄的微博數據采集方案[J].計算機技術與發展,2014,24(3):7-8.
[8] 新浪.微博API開發文檔[EB/OL]. http://open.weibo.com/wiki/微博API,2014-11-12/2014-12-29.
[9] 劉麗杰.垂直搜索引擎中聚焦爬蟲技術的研究[D].哈爾濱:哈爾濱工業大學,2012:3-9.
[10] 吳伶琳.基于Selenium的軟件自動化測試的研究與應用[J].計算機與現代化,2013,2(16):65-68.
[11] 郭正彪.大尺度在線社會網絡結構研究[D].武漢:華中科技大學,2012:15-26.
Date Crawler for Sina Microblog Based on Dynamic Webpage Date Interpreting
ZHONG Mingxiang TANG Jintao XIE Songxian WANG Ting
(College of Computer, National University of Defense Technology, Changsha 410073)
Microblogging is a new kind of information media. The mass data are generated to attracts the attention of the researchers to carry out related research. Micro-blog data acquisition is the basis and starting point for further research. This paper presents a multi-threaded crawler for Sina microblog platform based on dynamic webpage interpreting. The browser kernel is used to interpret the dynamic data of microblog webpage. Through simulated login, the page crawling strategy based on the characteristics of social networking site is determined, and the webpage parsing technology is used to custom templates of webpage to achieve user-centric microblog data acquisition. The test results show that the method can capture microblog data of user comprehensive and efficiently, provide data support for subsequent dta analysis and processing.
sina microblog, data mining, dynamic webpage, Web crawler
2015年4月2日,
2015年5月27日
國家自然科學基金(編號:61200337;61472436)資助。
鐘明翔,男,碩士研究生,研究方向:自然語言處理。唐晉韜,男,博士,講師,研究方向:社會網絡分析、自然語言處理。謝松縣,男,博士,講師,研究方向:自然語言處理。王挺,男,博士,教授,博士生導師,研究方向:自然語言處理。
DOI:10.3969/j.issn.1672-9730.2015.10.026