王金峰 ,彭禹 ,王明 ,鐘聲 ,趙雪輝
(1.防災(zāi)科技學(xué)院,河北 廊坊 065201;2.河北女子職業(yè)技術(shù)學(xué)院,石家莊 050000)
隨著移動互聯(lián)網(wǎng)的飛速發(fā)展,人們越來越多地在社交網(wǎng)絡(luò)上發(fā)表自己的見解,分享自己的生活,與他人進行交流討論。新浪微博作為國內(nèi)最大的社交平臺之一,同時也成了各類消息發(fā)布的最主要渠道之一。截至2017年9月,微博月活躍用戶3.76億,日活躍用戶1.65億,每天都有用戶發(fā)布上億條微博,評論、轉(zhuǎn)發(fā)或點贊其他微博。一個如此龐大和公開的社交平臺,每天都能產(chǎn)生海量信息,能為各種輿情監(jiān)控、商業(yè)推廣分析、自然語言處理等系統(tǒng)提供大量的數(shù)據(jù)支持[1]。在國外,開展了針對于Twitter和Facebook等社交平臺的一系列研究,但是不同于國外的Twitter和Facebook等平臺,微博官方并沒有提供相關(guān)接口給人們下載與微博相關(guān)的數(shù)據(jù)集,并且微博的登錄、瀏覽等操作都有較敏感的反爬蟲機制,這給數(shù)據(jù)的采集帶來了困難,對普通的想獲取相關(guān)數(shù)據(jù)的人員來說是個極大的挑戰(zhàn)。因此,快速獲得微博數(shù)據(jù)的方法就是構(gòu)建一個穩(wěn)定高效的爬蟲抓取系統(tǒng)。
網(wǎng)絡(luò)爬蟲(Web Crawler),是自動地抓取萬維網(wǎng)信息的程序或者腳本,它們被廣泛用于互聯(lián)網(wǎng)搜索引擎或其他類似網(wǎng)站。爬蟲一般分為數(shù)據(jù)采集、處理和儲存三個部分。傳統(tǒng)爬蟲從一個或若干初始網(wǎng)頁的URL開始,獲得初始網(wǎng)頁上的URL,在抓取網(wǎng)頁的過程中,不斷從當(dāng)前頁面上抽取新的URL放入隊列,直到滿足系統(tǒng)的一定停止條件。
Scrapy是Python開發(fā)的一個快速、可擴展的Web抓取框架,用于抓取Web站點并從頁面中提取結(jié)構(gòu)化的數(shù)據(jù)。通過Scrapy中的Spider模塊,能方便地定義網(wǎng)址爬取和數(shù)據(jù)提取的規(guī)則。
現(xiàn)在各種爬蟲的搜索策略[2]主要為:深度優(yōu)先搜索策略、廣度優(yōu)先搜索策略、非完全PageRank策略以及大站優(yōu)先搜索策略。
微博跟其他普通網(wǎng)站相比,動態(tài)性和網(wǎng)頁結(jié)構(gòu)都比較復(fù)雜,其對于爬蟲的防范也更加嚴(yán)格,普通的爬蟲程序一般不能直接獲取到相應(yīng)的網(wǎng)頁內(nèi)容,但其網(wǎng)頁內(nèi)容中的數(shù)據(jù)格式較為統(tǒng)一。所以,針對微博相關(guān)的瀏覽機制,運用一些工具和方法,就可以較為方便地獲取到微博中的有關(guān)數(shù)據(jù)。
微博網(wǎng)頁端基本分為PC端用戶入口(域名:weibo.com)和移動端用戶入口(域名:weibo.cn)。這兩種頁面雖然展現(xiàn)內(nèi)容的方式和策略有所區(qū)別,但能獲取的數(shù)據(jù)基本相同,且由于PC入口為大多數(shù)網(wǎng)頁端用戶瀏覽微博的主要途徑,從安全性和用戶體驗等角度考慮,該入口交互設(shè)計都更復(fù)雜,并設(shè)置有許多動態(tài)刷新的內(nèi)容,這給數(shù)據(jù)的爬取造成了一定難度,而移動端網(wǎng)頁可以直接發(fā)送不同的HTTP請求來獲取相應(yīng)的內(nèi)容[3],相比PC端而言,后者網(wǎng)頁結(jié)構(gòu)更加簡單,設(shè)置的反爬措施也更少,所以選取通過移動網(wǎng)頁入口來進行數(shù)據(jù)的爬取和解析。
在微博中進行網(wǎng)頁瀏覽是需要進行登錄并保持登錄狀態(tài)的,否則是無法獲取到相關(guān)信息的。我們使用多個微博賬戶通過Selenium自動化工具加Firefox瀏覽器無頭模式訪問微博登錄頁面進行登錄,登錄成功后將其相應(yīng)的cookies保存起來。為了提高爬取的穩(wěn)定性和成功率,還需要建立一個User-Agent池,再對Scrapy的middlewares模塊進行擴展,在其中的process_request方法里對Scrapy的request加入自動化登錄微博后獲得并已保存在數(shù)據(jù)庫的Cookies,在Scrapy請求微博服務(wù)器時使用一個可用的Cookies并隨機抽取一個User-Agent進行偽裝,這樣就能順利訪問頁面,減少爬蟲請求被微博服務(wù)器屏蔽和賬戶被封號的概率。采用的抓取策略是廣度優(yōu)先搜索,通過社交關(guān)系[4],抓取用戶的關(guān)系數(shù)據(jù)。只要利用一小群“種子用戶”,每個用戶都對應(yīng)有一個微博ID,通過使用微博ID也就能獲得該用戶的全部個人信息和他所發(fā)布的微博。以某個“種子用戶”為起點,獲得他的關(guān)注人和粉絲等關(guān)系[5],再對其好友進行關(guān)系搜索,并按此方法遞歸爬取,將得到的用戶去重[6]和排序,加入待爬取的隊列,從而得到一個龐大的待爬取的用戶數(shù)據(jù)集。理論上,這可以爬取到微博上所有的用戶信息。
得到用戶ID后,就能通過發(fā)起不同的HTTP請求訪問他們的個人信息、微博列表、粉絲列表和關(guān)注列表等頁面,將頁面下載之后,能看到這些頁面都是有固定結(jié)構(gòu)的HTML代碼,只要在Scrapy里自定義的Spider中通過正則表達式或者Xpath等工具分別對Response結(jié)果進行不同的解析,就能得到相應(yīng)的結(jié)構(gòu)化數(shù)據(jù)。
一般的爬取只需保留四類數(shù)據(jù):①微博信息;②個人信息;③用戶關(guān)系(只保留關(guān)注者的信息);④微博評論信息。例如,微博信息主要抓取的是該用戶發(fā)布過的所有微博的內(nèi)容、時間、轉(zhuǎn)發(fā)數(shù)、評論數(shù)、點贊數(shù)、發(fā)布微博時的地點(經(jīng)緯度坐標(biāo))以及發(fā)布微博所用的設(shè)備或平臺等,如果是轉(zhuǎn)發(fā)微博,還可以獲得源微博的URL鏈接等。
同時,微博下面的評論與回復(fù)也可以按需求進行抓取并以時間排序,作為對話語料數(shù)據(jù)保存。
微博中因為各種各樣的原因[7],通常會存在一些爬取價值不大的賬號和信息,例如,常見的無人使用的“僵尸賬號”或一些“惡意營銷號”等,如果不加處理而直接爬取則會浪費許多爬取性能和儲存空間,這就需要過濾待爬取的原數(shù)據(jù)。
目前,在爬取過程中不能很好地識別或直接判斷無價值信息,但微博用戶可以設(shè)定某些條件來達到過濾的目的[8],如設(shè)置被爬取的主體賬號的粉絲和關(guān)注數(shù)閾值在5000之內(nèi),判斷其是否有正常的頭像,昵稱是否是常見的“垃圾賬號”類的昵稱等,也可針對不同的爬取需求來設(shè)置爬取對象的屬性,如地域、年齡、發(fā)布的微博數(shù)等,從而得到相應(yīng)的結(jié)果數(shù)據(jù)。
本爬蟲從技術(shù)和思路上提供了獲取微博上相關(guān)數(shù)據(jù)的一些方法,對于中小型的數(shù)據(jù)需求有較好的適用性,并且基于Scrapy框架進行了擴展,相比于一般的爬蟲系統(tǒng),有著更好的應(yīng)對反爬蟲的機制,提高了爬取的效率和穩(wěn)定性。
作為主流社交互動平臺,在當(dāng)今大數(shù)據(jù)時代,微博存在著巨大的可挖掘價值。如何提供更快、更準(zhǔn)確的數(shù)據(jù)爬取技術(shù),將會是今后極具研究價值和挑戰(zhàn)的方向。