陳智++梁娟++謝兵++傅籬
摘 要:新浪微博的快速發(fā)展促進(jìn)了基于微博數(shù)據(jù)的研究發(fā)展,如何獲取微博數(shù)據(jù)是開展相關(guān)研究的首要問題。文中就分析爬取新浪微博數(shù)據(jù)的方法,提出了一種基于Python的語言,直接設(shè)置已登錄用戶Cookie信息,模擬瀏覽器訪問的新浪微博數(shù)據(jù)爬取方案,解決了不使用新浪微博開放平臺(tái)API爬取微博數(shù)據(jù)的主要問題,所實(shí)現(xiàn)的爬蟲程序編程簡(jiǎn)單、性能穩(wěn)定,能有效獲取微博數(shù)據(jù)。
關(guān)鍵詞:新浪微博;數(shù)據(jù)爬??;微博爬蟲;Python
中圖分類號(hào):TP391;TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2095-1302(2016)12-00-04
0 引 言
隨著互聯(lián)網(wǎng)的不斷普及,人們?cè)絹碓蕉嗟貐⑴c到互聯(lián)網(wǎng)的社交活動(dòng)中,微博作為典型的互聯(lián)網(wǎng)社交活動(dòng),得到了迅速發(fā)展。新浪微博是國(guó)內(nèi)出現(xiàn)最早,也是規(guī)模最大的微博社區(qū),新浪微博數(shù)據(jù)中心發(fā)布的“2015微博用戶發(fā)展報(bào)告”指出:“截止2015年9月,微博月活躍人數(shù)已達(dá)到2.22億,較2014年同期相比增長(zhǎng)33%;日活躍用戶達(dá)到1億,較去年同期增長(zhǎng)30%。隨著微博平臺(tái)功能的不斷完善,微博用戶群逐漸穩(wěn)定并保持持續(xù)增長(zhǎng)?!盵1]
微博用戶群的增長(zhǎng)使得基于微博數(shù)據(jù)的社交網(wǎng)絡(luò)分析[2]、用戶行為分析[3, 4]和網(wǎng)絡(luò)數(shù)據(jù)挖掘[5]等相關(guān)研究越來越受到人們的重視,而如何從微博爬取感興趣的數(shù)據(jù)則成為研究者要解決的首要問題。本文分析微博數(shù)據(jù)的爬取方式,提出一種基于Python模擬瀏覽器登錄的微博數(shù)據(jù)爬取方案,并討論針對(duì)微博反爬機(jī)制的相關(guān)處理。
1 微博數(shù)據(jù)的爬取方式
微博數(shù)據(jù)的爬取通常有兩種方式,一種是調(diào)用新浪微博開放平臺(tái)提供的微博開放接口,另一種是開發(fā)爬蟲程序,模擬微博登錄,分析獲得的HTML頁面,提取所需信息。
1.1 調(diào)用微博開放接口
新浪微博開放平臺(tái)[6]提供了二十余類接口,覆蓋了微博內(nèi)容、評(píng)論、用戶及關(guān)系的各種操作,理論上該方法是最直接、方便的方式。但新版的微博開放接口存在一些限制,對(duì)于小型研究團(tuán)隊(duì)或個(gè)人而言不是很方便,突出表現(xiàn)在以下幾點(diǎn):
(1)微博開放接口使用Oauth2.0認(rèn)證授權(quán),如果希望得到另外一個(gè)用戶的個(gè)人信息和微博內(nèi)容,則必須由該用戶授權(quán);
(2)微博開放接口存在訪問頻次限制,對(duì)于測(cè)試用戶的每個(gè)應(yīng)用,每小時(shí)最多只能訪問150次;
(3)很多研究所需要的數(shù)據(jù)只能通過高級(jí)接口才能訪問,需要專門申請(qǐng)和付費(fèi)。
正是因?yàn)檫@些限制的存在,自己設(shè)計(jì)開發(fā)網(wǎng)絡(luò)爬蟲程序獲取微博數(shù)據(jù)就成了必不可少的備選或替代方案。
1.2 開發(fā)微博爬蟲程序
設(shè)計(jì)開發(fā)微博爬蟲程序需要分析新浪微博的特點(diǎn)、明確爬取數(shù)據(jù)的目的及用途,選擇合理的開發(fā)語言,保證高效、穩(wěn)定地獲取微博數(shù)據(jù)。
1.2.1 新浪微博的特點(diǎn)
與一般網(wǎng)站相比,新浪微博具有以下特點(diǎn):
(1)新浪微博面向登錄用戶,在訪問微博數(shù)據(jù)前,用戶必須先登錄;
(2)微博博文的顯示采用了延遲加載機(jī)制,一次只顯示一個(gè)微博頁面的部分博文,當(dāng)用戶瀏覽博文滾動(dòng)到底部時(shí),才繼續(xù)加載當(dāng)頁的其他博文;
(3)新浪微博有較完備的反爬蟲機(jī)制,一旦微博服務(wù)器認(rèn)定爬蟲程序,就會(huì)拒絕訪問。
基于新浪微博的上述特點(diǎn),在設(shè)計(jì)微博爬蟲時(shí),需要對(duì)以上特點(diǎn)進(jìn)行針對(duì)性處理。
1.2.2 開發(fā)語言選擇
從快速獲取微博數(shù)據(jù)的角度看,Python是開發(fā)微博爬蟲的首選語言,其具有如下特點(diǎn):
(1)Python是一種解釋型高級(jí)語言,具有文字簡(jiǎn)約、容易學(xué)習(xí)、開發(fā)速度快等特點(diǎn);
(2)Python具有較豐富的庫(kù)及第三方庫(kù),在開發(fā)爬蟲方面比其他語言方便??紤]新浪微博在一段時(shí)間后就會(huì)微調(diào)其數(shù)據(jù)格式,因此使用Python開發(fā)微博爬蟲程序具有較高的易維護(hù)性。
2 微博爬蟲的實(shí)現(xiàn)
2.1 微博爬蟲的框架結(jié)構(gòu)
本文討論的微博爬蟲程序包括爬蟲調(diào)度器、URL管理器、頁面加載器、HTML解析器和數(shù)據(jù)輸出器五個(gè)功能模塊,其框架結(jié)構(gòu)如圖1所示。
圖1 微博爬蟲的框架結(jié)構(gòu)
2.1.1 爬蟲調(diào)度器
爬蟲調(diào)度器是爬蟲的控制程序,主要負(fù)責(zé)協(xié)調(diào)和調(diào)度微博爬蟲的各個(gè)模塊,其核心功能包括以下幾項(xiàng):
(1)實(shí)現(xiàn)爬取微博數(shù)據(jù)的流程;
(2)控制其他模塊的執(zhí)行;
(3)模擬瀏覽器登錄,為頁面請(qǐng)求添加Headers信息;
(4)控制微博訪問頻率,避免反爬蟲機(jī)制拒絕訪問。
2.1.2 URL管理器
微博爬蟲采用廣度優(yōu)先遍歷策略提取需要的數(shù)據(jù),URL管理器需維護(hù)已經(jīng)爬取的URL列表和等待爬取的URL列表。在得到新URL之后,首先檢查已經(jīng)爬取的URL列表,如果該URL不在列表中,則將其添加到等待爬取的URL列表。
2.1.3 頁面加載器
頁面加載器根據(jù)爬蟲調(diào)度器提供的Headers信息以及URL管理器提供的URL,向微博服務(wù)器發(fā)出請(qǐng)求,獲得所請(qǐng)求的HTML頁面。為了避免爬取過于頻繁,導(dǎo)致微博服務(wù)器無法及時(shí)響應(yīng),或被服務(wù)器反爬蟲機(jī)制拒絕訪問,頁面加載器采用定時(shí)機(jī)制限制加載頁面的頻率。
2.1.4 HTML解析器
HTML解析器對(duì)頁面加載器提供的HTML頁面進(jìn)行解析,獲取需要的數(shù)據(jù)。如某位微博用戶發(fā)表的博文內(nèi)容、轉(zhuǎn)發(fā)數(shù)、點(diǎn)贊數(shù)、評(píng)論數(shù)等。同時(shí)HTML解析器會(huì)根據(jù)需要將新得到的URL反饋給爬蟲調(diào)度器。
2.1.5 數(shù)據(jù)輸出器
數(shù)據(jù)輸出器輸出HTML解析器解析后的數(shù)據(jù)。輸出的數(shù)據(jù)采用JSON格式,其格式與使用新浪微博開放平臺(tái)API獲取的數(shù)據(jù)格式基本一致,保證不同爬取方式得到的數(shù)據(jù)能夠被統(tǒng)一分析和處理。
2.2 模擬瀏覽器登錄
要訪問微博數(shù)據(jù),必須要先登錄??梢杂门老x程序模擬微博用戶登錄[7, 8]。爬蟲程序首先向微博用戶服務(wù)器發(fā)送登錄請(qǐng)求,然后接收服務(wù)器返回的密鑰,再結(jié)合用戶名、密碼、服務(wù)器返回的密鑰生成驗(yàn)證信息,登錄服務(wù)器。只要保持與服務(wù)器的Session會(huì)話,就可以從服務(wù)器獲取微博數(shù)據(jù),從而進(jìn)一步分析。
這種做法實(shí)現(xiàn)比較復(fù)雜,并且需要了解服務(wù)器驗(yàn)證信息的細(xì)節(jié)。因此采用另一種相對(duì)簡(jiǎn)單的做法,即本文微博爬蟲的做法。首先在瀏覽器中登錄微博,然后使用瀏覽器提供的開發(fā)者工具查看請(qǐng)求頁面的請(qǐng)求頭信息。例如使用Firefox登錄微博后,利用Firefox提供的開發(fā)者工具可以看到如圖2所示的請(qǐng)求頭信息。
從圖2可以看出,“Referer”的內(nèi)容是訪問微博的URL,其中“<用戶Uid>”是當(dāng)前用戶在微博的唯一標(biāo)識(shí)id;“Connection”的值為“keep-alive”,標(biāo)識(shí)Cookie永不過期;“Cookie”的內(nèi)容是成功連接微博服務(wù)器后保存在本地的Cookie,利用它可以簡(jiǎn)單、快速地訪問新浪微博。首先需復(fù)制“<連接需要的Cookie>”的內(nèi)容,然后在Python中定義headers對(duì)象,設(shè)置Cookie和Connection,最后在每次訪問微博頁面時(shí),都將headers作為參數(shù)添加到Request對(duì)象中,得到微博頁面。這樣在Cookie的有效期內(nèi)就可以直接訪問微博,并提取自己需要的數(shù)據(jù)。采用這種做法,只需以下代碼就可以實(shí)現(xiàn)微博的登錄并簡(jiǎn)單獲取頁面數(shù)據(jù):
headers = {'Cookie': ‘<連接需要的Cookie>,Connnection:keep-alive}
url = u'http://weibo.com/u/<用戶Uid>/home?wvr=5&lf=reg'
request = urllib.request.Request(url, headers=headers)
rsponse = urllib.request.urlopen(request)
page = response.read()
2.3 微博頁面解析
爬蟲程序成功登錄到微博,獲取微博頁面后,就可以對(duì)得到的HTML腳本進(jìn)行解析,提取需要的數(shù)據(jù)。一條博文的數(shù)據(jù)主要包括發(fā)表博文的用戶昵稱、用戶Uid、主頁鏈接、博文內(nèi)容、發(fā)表時(shí)間、轉(zhuǎn)發(fā)數(shù)、評(píng)論數(shù)、點(diǎn)贊數(shù)等。除此以外,轉(zhuǎn)發(fā)其他用戶的微博是非常常見的現(xiàn)象,因此在提取博文數(shù)據(jù)時(shí),也需要考慮被轉(zhuǎn)發(fā)的微博用戶的相關(guān)數(shù)據(jù)信息。
進(jìn)一步分析微博頁面可以發(fā)現(xiàn),每一條博文均是以
客服熱線:400-656-5456??客服專線:010-56265043??電子郵箱:longyuankf@126.com
電信與信息服務(wù)業(yè)務(wù)經(jīng)營(yíng)許可證:京icp證060024號(hào)
Dragonsource.com Inc. All Rights Reserved
一種處理辦法是多次發(fā)送模擬HTTP請(qǐng)求的GET方法,構(gòu)建響應(yīng)的URL,完成整頁加載[8];另一種處理辦法是使用selenium模擬瀏覽器滾動(dòng)條操作,在Ajax加載后再獲取頁面數(shù)據(jù),這種方法的參考代碼如下:
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Firefox()
driver.set_page_load_timeout(30)
def scroll(driver):
driver.execute_script("""
( function () {
var y = document.body.scrollTop;
var step = 100;
window.scroll(0, y);
function f() {
if (y < document.body.scrollHeight) {
y += step;
window.scroll(0, y);
setTimeout(f, 50);
} else {
window.scroll(0, y);
document.title += "scroll-done";
}
}
setTimeout(f, 1000);
""")
3 反爬蟲機(jī)制及對(duì)策
如果爬蟲爬取過“猛”,就會(huì)為微博服務(wù)器帶來不小的壓力。新浪微博有比較完備的反爬蟲機(jī)制,用以識(shí)別和拒絕爬蟲訪問。雖然新浪官方并沒有提供具體的反爬蟲機(jī)制說明,但是通過分析常用的反爬蟲策略[9],可以發(fā)現(xiàn)主要的爬蟲識(shí)別方法有以下幾種:
(1)通過識(shí)別爬蟲的User-Agent信息來拒絕爬蟲;
(2)通過網(wǎng)站流量統(tǒng)計(jì)系統(tǒng)和日志分析來識(shí)別爬蟲;
(3)通過實(shí)時(shí)反爬蟲防火墻過濾爬蟲。
為了避免微博反爬蟲機(jī)制拒絕訪問,本文的微博爬蟲采取了偽裝User-Agent與降低請(qǐng)求訪問頻率來反爬蟲對(duì)策。
3.1 偽裝User-Agent
User-Agent用于描述發(fā)出HTTP請(qǐng)求的終端信息。瀏覽器及經(jīng)過企業(yè)授權(quán)的知名爬蟲如百度爬蟲等都有固定的User-Agent信息,本文討論的微博爬蟲偽裝瀏覽器通過微博登錄來爬取特定數(shù)據(jù)。在請(qǐng)求頭headers中,采用交替?zhèn)窝bUser-Agent的方法來避免爬蟲User-Agent的識(shí)別和訪問流量統(tǒng)計(jì)異常。
例如以下四個(gè)User-Agent信息,分別從使用Windows Edge、Firefox、Chrome和360瀏覽器訪問微博時(shí)的請(qǐng)求頭中提取。
Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586
Mozilla/5.0 (Windows NT 10.0; rv:47.0) Gecko/20100101 Firefox/47.0"
Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.94 Safari/537.36
Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
在Python中定義headers對(duì)象時(shí),交替隨機(jī)選擇其中的一條添加到headers對(duì)象中,將爬蟲的HTTP請(qǐng)求偽裝成某個(gè)瀏覽器的訪問。
3.2 降低請(qǐng)求訪問頻率
如果爬蟲程序爬取過于頻繁,則會(huì)降低微博服務(wù)器的響應(yīng)效率,影響一般用戶的正常使用。反爬蟲防火墻往往會(huì)根據(jù)請(qǐng)求的訪問頻率來判斷客戶端是一般用戶的人工操作還是爬蟲程序的自動(dòng)運(yùn)行。因此適當(dāng)降低爬蟲程序的請(qǐng)求訪問頻率既可以避免連接超時(shí)錯(cuò)誤的發(fā)生,還可有效應(yīng)對(duì)反爬蟲機(jī)制。
4 結(jié) 語
綜上,本文實(shí)現(xiàn)的微博爬蟲能夠有效爬取新浪微博數(shù)據(jù),實(shí)現(xiàn)簡(jiǎn)單、性能穩(wěn)定,并能較好的避免反爬蟲機(jī)制的檢測(cè)。其具有如下主要特點(diǎn):
(1)直接獲取已登錄用戶的Cookie,避免了模擬登錄的繁瑣;
(2)基于lxml解析微博數(shù)據(jù),簡(jiǎn)化了數(shù)據(jù)篩選的操作;
(3)使用selenium模擬滾動(dòng)條滾動(dòng),解決了Ajax延遲加載頁面的問題;
(4)使用偽裝User-Agnet以及延遲訪問來避免反爬蟲機(jī)制的過濾。
但該設(shè)計(jì)的主要缺陷是沒有使用多線程導(dǎo)致爬取效率不高,不適用于海量數(shù)據(jù)爬取,用戶可根據(jù)需要進(jìn)行適當(dāng)改動(dòng)。
參考文獻(xiàn)
[1]新浪微博數(shù)據(jù)中心.2015微博用戶發(fā)展報(bào)告[R].2015.
[2]曹玖新,吳江林,石偉,等.新浪微博網(wǎng)信息傳播分析與預(yù)測(cè)[J].計(jì)算機(jī)學(xué)報(bào),2014(4):779-790.
[3]葉勇豪,許燕,朱一杰,等.網(wǎng)民對(duì)“人禍”事件的道德情緒特點(diǎn)——基于微博大數(shù)據(jù)研究[J].心理學(xué)報(bào),2016,48(3):290-304.
[4]王晰巍,邢云菲,趙丹,等.基于社會(huì)網(wǎng)絡(luò)分析的移動(dòng)環(huán)境下網(wǎng)絡(luò)輿情信息傳播研究——以新浪微博“霧霾”話題為例[J].圖書情報(bào)工作,2015,59(7):14-22.
[5]丁兆云,賈焰,周斌.微博數(shù)據(jù)挖掘研究綜述[J].計(jì)算機(jī)研究與發(fā)展,2014,51(4):691-706.
[6]微博開放平臺(tái)API文檔[EB/OL].http://open.weibo.com/
[7]周中華,張惠然,謝江.基于Python的新浪微博數(shù)據(jù)爬蟲[J].計(jì)算機(jī)應(yīng)用,2014,34(11):3131-3134.
[8]吳劍蘭.基于Python的新浪微博爬蟲研究[J].無線互聯(lián)科技,2015(6):94-96.
[9]鄒科文,李達(dá),鄧婷敏,等.網(wǎng)絡(luò)爬蟲針對(duì)“反爬”網(wǎng)站的爬取策略研究[J].電腦知識(shí)與技術(shù),2016,12(7):61-63.