一種面向主流微博網(wǎng)站微博id的采集方法及工具的制作方法
【專利摘要】一種面向主流微博網(wǎng)站微博ID的采集方法及工具,系統(tǒng)架構(gòu)分為兩個(gè)層次,分別為采集層和存儲(chǔ)層,層次和系統(tǒng)間的接口清晰,每層內(nèi)部都由若干模塊組成,模塊之間的松耦合,有利于每層功能的擴(kuò)展。采集層實(shí)現(xiàn)認(rèn)證用戶微博ID的爬取以及長(zhǎng)期的認(rèn)證用戶粉絲ID的采集;存儲(chǔ)層實(shí)現(xiàn)將微博ID在本地進(jìn)行數(shù)據(jù)庫(kù)存儲(chǔ),并對(duì)外提供開放式的微博ID檢索功能。該系統(tǒng)的用戶可以是任何基于微博數(shù)據(jù)的第三方應(yīng)用的開發(fā)人員,利用該系統(tǒng)提供的微博ID進(jìn)行進(jìn)一步的微博內(nèi)容抓取、分析等相關(guān)第三方應(yīng)用的開發(fā);也可以是微博網(wǎng)站的管理人員,利用該系統(tǒng)提供的微博ID進(jìn)行相關(guān)統(tǒng)計(jì),從而對(duì)微博相關(guān)指標(biāo)進(jìn)行分析,如微博活躍程度分析、微博影響力分析等。
【專利說(shuō)明】—種面向主流微博網(wǎng)站微博ID的采集方法及工具
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及社交網(wǎng)站的ID采集技術(shù)特別是一種以主流微博網(wǎng)站開放API為基礎(chǔ)的微博ID采集方法及工具。
【背景技術(shù)】
[0002]微博作為社交網(wǎng)絡(luò)應(yīng)用技術(shù)之一實(shí)現(xiàn)了基于用戶關(guān)系的信息分享、傳播以及獲取平臺(tái),承載了大量基于社交網(wǎng)絡(luò)的信息。用戶通過(guò)WEB、WAP以及各種客戶端組件個(gè)人社區(qū),以140字左右的文字更新信息,并實(shí)現(xiàn)即時(shí)分享。中國(guó)互聯(lián)網(wǎng)絡(luò)信息中心(CNNIC)發(fā)布的《第31次中國(guó)互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計(jì)報(bào)告》顯示,截至2012年12月底,我國(guó)微博用戶規(guī)模為3.09億,較2011年底增長(zhǎng)了 5873萬(wàn)。微博急速擴(kuò)張的階段已經(jīng)結(jié)束,但年增幅仍能達(dá)到23.5%。巨大的用戶量給微博帶來(lái)了巨大的信息量,對(duì)微博信息進(jìn)行再利用的應(yīng)用也隨之出現(xiàn)。新浪和騰訊等主流微博網(wǎng)站都開放了針對(duì)微博操作的API,用于支持和鼓勵(lì)基于微博數(shù)據(jù)信息的第三方應(yīng)用的發(fā)展。基于API的第三方應(yīng)用開發(fā)模式將微博信息作為基礎(chǔ)的數(shù)據(jù)信息,進(jìn)一步提供針對(duì)微博的分類、分析、檢索等等升級(jí)應(yīng)用,提升了微博數(shù)據(jù)的利用價(jià)值,是推動(dòng)社交網(wǎng)絡(luò)信息有效地再利用的典范?,F(xiàn)有已經(jīng)出現(xiàn)部分應(yīng)用在一定程度上實(shí)現(xiàn)了對(duì)微博信息的再利用,但是對(duì)信息的采集工作任然是一項(xiàng)艱巨的任務(wù),截至2013年4月底,新浪微博的注冊(cè)用戶規(guī)模為5.03億,日活躍用戶4620萬(wàn),用戶id為int64(8Bytes),總的數(shù)據(jù)量約為4G ;騰訊微博的注冊(cè)用戶為5.4億,日活躍用戶I億,用戶id為32個(gè)char的字符串(32Bytes),總的數(shù)據(jù)量約為16G ;搜狐微博的注冊(cè)用戶約為I億;以新浪微博為例,假設(shè)平均每個(gè)用戶發(fā)布50條微博,每條微博平均含有20個(gè)漢字,每條微博平均包括4條評(píng)論,則微博信息的總體數(shù)據(jù)量為4G*50*20*2* (4+1)=400Τ。面對(duì)海量的微博信息,只能針對(duì)已知微博的URL鏈接采集微博數(shù)據(jù),這種方式只是小范圍采集微博信息,所以急需一種能夠更加完整、全面的、并且支持大數(shù)據(jù)量存儲(chǔ)的數(shù)據(jù)采集工具用于采集微博唯一標(biāo)識(shí)符-微博ID,進(jìn)而通過(guò)微博ID采集具體的微博信息,從而實(shí)現(xiàn)更廣泛的微博信息的再利用,為上層應(yīng)用提供更好的數(shù)據(jù)支持。
【發(fā)明內(nèi)容】
[0003]有鑒于此,本發(fā)明的目的是提供一種面向主流微博網(wǎng)站的微博ID采集方法及工具,本發(fā)明的方法及工具基于網(wǎng)絡(luò)爬蟲和微博開放API,結(jié)合現(xiàn)有的索引和非結(jié)構(gòu)化數(shù)據(jù)庫(kù)存儲(chǔ)方法,提出一套面向主流微博網(wǎng)站微博ID的采集方法及工具,本發(fā)明能自動(dòng)化采集已存在的微博賬號(hào)ID,方便開發(fā)者進(jìn)行再利用,為上層應(yīng)用提供更好的數(shù)據(jù)支持。特有的分布式數(shù)據(jù)存儲(chǔ)方法讓本發(fā)明具備更好的可擴(kuò)展性。
[0004]為了達(dá)到上述目的,本發(fā)明的目的是提供一種面向主流微博網(wǎng)站微博ID的采集方法及工具,其架構(gòu)分為兩個(gè)層次,分別為采集層和存儲(chǔ)層。采集層實(shí)現(xiàn)微博ID的采集,存儲(chǔ)層實(shí)現(xiàn)本地存儲(chǔ),并提供開放式的檢索功能;其中:
[0005]采集層,實(shí)現(xiàn)認(rèn)證用戶ID爬取和認(rèn)證用戶粉絲ID的采集工作,由網(wǎng)絡(luò)爬取模塊和微博API模塊組成。
[0006]存儲(chǔ)層,負(fù)責(zé)對(duì)采集層中獲取的微博ID進(jìn)行去重操作以及將微博ID進(jìn)行存儲(chǔ),提供微博ID查詢接口,并預(yù)留字段,為后續(xù)操作提供一定的擴(kuò)展性能。
[0007]所述采集層的各模塊的功能分別是:
[0008]網(wǎng)絡(luò)爬取模塊,負(fù)責(zé)針對(duì)新浪、騰訊微博認(rèn)證用戶網(wǎng)頁(yè)中微博ID的抓取工作,主要包括網(wǎng)頁(yè)爬取及解析和本地存儲(chǔ)的操作。其中網(wǎng)頁(yè)爬取及解析操作通過(guò)編寫瀏覽器插件的方式來(lái)完成,本地存儲(chǔ)操作通過(guò)編寫Webserver代碼的方式來(lái)完成。包括請(qǐng)求微博認(rèn)證用戶首頁(yè),一級(jí)、二級(jí)和三級(jí)分類頁(yè)面,解析頁(yè)面中的分類名稱及對(duì)應(yīng)的URL,請(qǐng)求并解析各級(jí)分類頁(yè)面中的微博ID,并將微博ID存儲(chǔ)到本地的認(rèn)證用戶ID采集目錄中的認(rèn)證用戶ID文件中。其中認(rèn)證用戶ID目錄是本地目錄,依據(jù)微博網(wǎng)站的認(rèn)證用戶分類等級(jí)以及名稱自動(dòng)分級(jí)建立;認(rèn)證用戶ID文件以換行符分隔各個(gè)ID,并以“最下級(jí)分類名稱.txt”的格式命名。該模塊包括微博ID爬取子模塊和存儲(chǔ)子模塊。
[0009]微博API模塊,使用新浪、騰訊微博開放平臺(tái)提供的微博API,獲取微博認(rèn)證用戶的粉絲ID。其操作流程包括首先獲得兩大微博開放平臺(tái)的授權(quán)令牌,其次根據(jù)不同微博的API接口,構(gòu)造不同的參數(shù)給相應(yīng)的API接口,得到JSON格式的微博ID數(shù)據(jù),并將解析出的微博ID存入本地的粉絲ID采集目錄的粉絲ID文件中。其中,粉絲ID采集目錄是一個(gè)存儲(chǔ)粉絲ID文件的目錄,粉絲ID文件是存放該模塊獲取的ID的文本文件,以換行符分隔各個(gè)ID,每個(gè)文件存放一定數(shù)量的ID,文件以“當(dāng)前時(shí)間戳.txt”的格式命名。
[0010]所述存儲(chǔ)層的各模塊的功能分別是:
[0011]去重與索引模塊,所述的去重與索引模塊,為已采集過(guò)的微博ID進(jìn)行去重操作并建立索引,其中新浪、騰訊微博對(duì)應(yīng)的索引名稱分別為化(1以_4和index_B,定期將微博ID導(dǎo)出到指定目錄的文件中供數(shù)據(jù)存儲(chǔ)模塊處理,在索引中設(shè)置標(biāo)記字段防止重復(fù)導(dǎo)出ID。索引中包括微博ID和標(biāo)記兩列,存儲(chǔ)方式都是“不分詞”。標(biāo)記有三種取值:“未導(dǎo)出”、“已導(dǎo)出”和“已導(dǎo)入Hbase”。其中“未導(dǎo)出”表不微博ID未從Lucene中導(dǎo)出已導(dǎo)出”表不微博ID已從Lucene中導(dǎo)出,但未導(dǎo)入到Hbase中;“已導(dǎo)入Hbase”表不微博ID已導(dǎo)入到Hbase中。該模塊包括索引建立子模塊、ID導(dǎo)出子模塊和標(biāo)記更新子模塊。索引建立模塊實(shí)現(xiàn)將采集的ID去重,并將去重后的ID并入索引,將對(duì)應(yīng)ID的標(biāo)記字段置為“未導(dǎo)出”。ID導(dǎo)出子模塊負(fù)責(zé)定期檢索索引中未導(dǎo)出的ID,存入本地的微博ID導(dǎo)出目錄中的微博ID導(dǎo)出文件(微博ID導(dǎo)出目錄需要在系統(tǒng)運(yùn)行前創(chuàng)建,微博ID導(dǎo)出文件在每次導(dǎo)出時(shí)自動(dòng)創(chuàng)建),文件命名格式為“年-月-日_時(shí)-分.txt”,并提供給數(shù)據(jù)存儲(chǔ)模塊處理,將對(duì)應(yīng)ID的標(biāo)記置為“已導(dǎo)出”。標(biāo)記更新子模塊負(fù)責(zé)檢查數(shù)據(jù)存儲(chǔ)模塊是否已處理完導(dǎo)出的ID,若處理完成,則將對(duì)應(yīng)ID的標(biāo)記置為“已導(dǎo)入Hbase”。
[0012]數(shù)據(jù)存儲(chǔ)模塊,負(fù)責(zé)從本地的微博ID導(dǎo)出目錄中讀取微博ID導(dǎo)出文件,并使用開源的分布式系統(tǒng)Hadoop中的存儲(chǔ)工具Hbase將文件中的微博ID進(jìn)行分布式存儲(chǔ),同時(shí)提供微博ID查詢接口。該模塊使用Linux的Crontab命令定期執(zhí)行。每次執(zhí)行時(shí),讀取本地的微博ID導(dǎo)出目錄中的微博ID導(dǎo)出文件,將新浪微博ID和騰訊微博ID分別存儲(chǔ)在Hbase的不同的表中,表的主鍵設(shè)計(jì)為“DDDDD微博ID”的格式,其中DDDDD表示一個(gè)五位十進(jìn)制數(shù)字,該數(shù)字前綴是為后期的數(shù)據(jù)分析預(yù)留的標(biāo)記空間,可以用于標(biāo)記該微博ID的狀態(tài)或者屬性。該模塊定期從Lucene中檢索出標(biāo)記值等于“未導(dǎo)出”的微博ID,調(diào)用Hbase提供的API,將這些微博ID存入Hbase相應(yīng)的表中,并在Lucene中將這些微博ID對(duì)應(yīng)的標(biāo)記值改為“已導(dǎo)出”,以防止以后重復(fù)導(dǎo)出。
[0013]所述的網(wǎng)絡(luò)爬取模塊的各子模塊的功能分別是:
[0014]微博ID爬取子模塊,通過(guò)編寫Chrome瀏覽器插件的方式請(qǐng)求并解析微博認(rèn)證用戶分類頁(yè)面,并將解析出的ID發(fā)送給該模塊的存儲(chǔ)子模塊。針對(duì)新浪、騰訊微博編寫不同的瀏覽器插件進(jìn)行爬取。為兩個(gè)插件分別建立插件根目錄,在插件根目錄中創(chuàng)建manifest,json配置文件,指定在新浪微博認(rèn)證用戶首頁(yè)加載完成之后加載jquery.js和content_script, js 兩個(gè) Javascript 文件,其中 jquery.js 是 jQuery 函數(shù)庫(kù),content_script.js 中為該子模塊爬取認(rèn)證用戶ID的邏輯,通過(guò)配置文件中的permissions字段指定該插件能夠請(qǐng)求認(rèn)證用戶頁(yè)面和本地Webserver的任何資源。騰訊微博爬取插件的相關(guān)配置除了將新浪微博認(rèn)證用戶首頁(yè)改為騰訊微博認(rèn)證用戶首頁(yè)外其余項(xiàng)基本相同。新浪、騰訊微博的認(rèn)證用戶頁(yè)面結(jié)構(gòu)有所不同,具體的爬取過(guò)程也有所不同。針對(duì)新浪微博認(rèn)證用戶頁(yè)面,首先使用jQuery獲取所有class=nav_barMain的div元素中的ul元素中所有第一級(jí)Ii元素,再?gòu)拿恳粋€(gè)Ii元素中獲取第一個(gè)a元素,其href屬性即為一級(jí)分類的鏈接,a元素內(nèi)的文字為一級(jí)分類的名稱。其次獲取第一級(jí)Ii元素中的ul元素,其內(nèi)的Ii元素中的a元素內(nèi)的文字及href屬性為二級(jí)分類名稱及鏈接。然后對(duì)于每一個(gè)二級(jí)分類,向其鏈接通過(guò)jQuery提供的$.post函數(shù)發(fā)送請(qǐng)求,在post函數(shù)返回的responseText中使用正則表達(dá)式找出三 級(jí)分類名稱及鏈接。對(duì)于所有的三級(jí)分類鏈接,在鏈接后添上參數(shù)letter=a、letter=b、…、Ietter=Z構(gòu)成26個(gè)新的鏈接,向這些鏈接分別發(fā)送post請(qǐng)求,在返回的頁(yè)面中使用正則表達(dá)式找出出所有的微博ID。最后,將微博ID以及對(duì)應(yīng)的分類分別構(gòu)造成Javascript數(shù)組,調(diào)用jQuery提供的t post函數(shù)將該數(shù)組發(fā)送給該模塊的存儲(chǔ)子模塊相應(yīng)的的處理頁(yè)面。針對(duì)騰訊微博認(rèn)證用戶頁(yè)面,首先使用jQuery獲取class=peopleNav的div元素中ul元素中的所有第一級(jí)Ii元素,每個(gè)Ii元素中第一個(gè)a元素的文本及href屬性為一級(jí)分類名稱及鏈接;其次使用jQuery觸發(fā)每個(gè)Ii的mouseover事件,使得頁(yè)面自動(dòng)發(fā)送AJAX請(qǐng)求獲取每個(gè)一級(jí)分類下的二級(jí)分類并寫入當(dāng)前頁(yè)面。然后獲取第一級(jí)Ii元素中class=navLayer的div元素,其中dt元素中的strong元素中的文本為二級(jí)分類名稱,dt元素后的dd元素中所有的a元素的文本及href屬性為三級(jí)分類名稱及鏈接。對(duì)于每一個(gè)三級(jí)分類鏈接,在鏈接后添力口 sort=char&char=a、sort=char&char=b、...>sort=char&char=z 構(gòu)成 26 個(gè)新的鏈接,向這些鏈接分別發(fā)送Post請(qǐng)求,在返回的頁(yè)面中使用正則匹配表達(dá)式找出所有的微博ID。后續(xù)步驟與新浪微博相似,除了向存儲(chǔ)子模塊中對(duì)應(yīng)騰訊微博ID的處理頁(yè)面發(fā)送ID及對(duì)應(yīng)的分類名稱外,其他步驟基本相同。
[0015]存儲(chǔ)子模塊,使用PHP語(yǔ)言分別編寫新浪、騰訊的saveld.php文件,接收新浪、騰訊微博ID爬取子模塊的Get/Post請(qǐng)求,獲取分類名稱數(shù)組和微博ID數(shù)組,按照數(shù)組中除最后一級(jí)分類外的分類名稱分別建立認(rèn)證用戶ID采集目錄并以分類名稱命名(如果目錄已存在則不再建立),以“最后一級(jí)分類名稱.txt”的格式創(chuàng)建認(rèn)證用戶ID文件,并將ID數(shù)組中的ID以換行符隔開存入認(rèn)證用戶ID文件(如果認(rèn)證用戶ID文件已存在則只往文件中添加ID)。其中建立目錄和創(chuàng)建文件之前需要將不允許出現(xiàn)在目錄名或文件名中的字符“/”和“ \ ”替換為“、”。如分類名稱數(shù)組為[“娛樂(lè)”,“娛樂(lè)產(chǎn)業(yè)”,“策劃/宣傳”],則建立的目錄應(yīng)為“娛樂(lè)/娛樂(lè)產(chǎn)業(yè)/”,并在目錄中創(chuàng)建文件“策劃、宣傳.txt”,將ID存入該文件中。
[0016]微博API模塊,自動(dòng)化獲取授權(quán)令牌以支持長(zhǎng)期地通過(guò)API的方式不斷地獲取認(rèn)證用戶的粉絲ID。其中新浪微博的授權(quán)令牌需要通過(guò)模擬HTTPS請(qǐng)求的方式自動(dòng)化獲取,騰訊微博的授權(quán)令牌只需要定期調(diào)用騰訊微博提供的令牌刷新API即可實(shí)現(xiàn)在3個(gè)月內(nèi)自動(dòng)化獲取。通過(guò)API的方式獲取的粉絲ID數(shù)量達(dá)到一定閾值時(shí),將粉絲ID存入本地的粉絲ID采集目錄的粉絲ID文件中,粉絲ID文件以換行符分隔各個(gè)ID,以“當(dāng)前時(shí)間戳.txt”的格式命名。包括新浪授權(quán)令牌獲取子模塊、騰訊授權(quán)令牌獲取子模塊和粉絲采集子模塊。
[0017]所述的微博API模塊的各個(gè)子模塊的功能分別是:
[0018]新浪授權(quán)令牌獲取子模塊,新浪微博開放平臺(tái)的授權(quán)頁(yè)面采用的是HTTPS協(xié)議,鏈接經(jīng)過(guò)加密保護(hù),如果采用常規(guī)方法,調(diào)用java.net.URLconnection建立通信將會(huì)失敗。為此,需要采用其他方法:經(jīng)過(guò)仔細(xì)調(diào)研,得到用戶登錄新浪微博授權(quán)頁(yè)面需要的參數(shù)。采用Apache公司的HttpClient開源工具提供的相關(guān)接口,倉(cāng)Il建一個(gè)PostMethod對(duì)象,將登陸新浪微博所需的參數(shù)加入到該對(duì)象中。然后創(chuàng)建一個(gè)消息頭鏈表,鏈表中的每個(gè)元素初始化為一個(gè)HttpClient中的Header對(duì)象,構(gòu)造請(qǐng)求消息的消息頭,填入相關(guān)信息,包括Referer> Host、User_Agent。創(chuàng)建Protocol對(duì)象,填入相關(guān)參數(shù)從而打開到服務(wù)端的鏈接,具體如下:協(xié)議名稱設(shè)為“https”,端口為443, ProtocolSocketFactory參數(shù)通過(guò)創(chuàng)建MySSLSocketFactory對(duì)象(由微博平臺(tái)提供)得到。創(chuàng)建HttpClient對(duì)象,通過(guò)調(diào)用相關(guān)接口,提交消息頭鏈表。從而得到服務(wù)端的返回信息,之后解析返回消息,切分字符串,便得至Ij了 AccessToken。
[0019]騰訊授權(quán)令牌獲取子模塊,通過(guò)定期調(diào)用騰訊微博提供的訪問(wèn)令牌刷新API獲取新的令牌,以保證令牌在3個(gè)月內(nèi)不過(guò)期。該模塊需要用戶在系統(tǒng)運(yùn)行前進(jìn)行一次手動(dòng)授權(quán),此后3個(gè)月內(nèi)只需定期刷新授權(quán)令牌,而無(wú)需手動(dòng)授權(quán)。
[0020]粉絲采集子模塊,從認(rèn)證用戶ID采集目錄中讀取認(rèn)證用戶ID文件,獲取并遍歷認(rèn)證用戶ID,使用授權(quán)令牌調(diào)用新浪、騰訊微博開放的API,隨機(jī)獲取認(rèn)證用戶隨機(jī)的至多5000名粉絲的ID,并將粉絲ID緩存在一個(gè)緩存文件中,當(dāng)粉絲ID數(shù)量達(dá)到一定閾值時(shí),將緩存文件中的ID存入粉絲ID采集目錄的粉絲ID文件中,粉絲ID文件以“當(dāng)前時(shí)間戳.txt”的格式命名。雖然遍歷一次認(rèn)證用戶ID只能獲取每位認(rèn)證用戶的至多5000名粉絲的ID,但是通過(guò)多次遍歷使得獲取的ID趨于完全。多次遍歷需要調(diào)用較多次數(shù)的API,但新浪、騰訊微博對(duì)調(diào)用頻率進(jìn)行了限制,因此影響了采集的效率。通過(guò)使用多個(gè)微博應(yīng)用測(cè)試用戶輪詢、多臺(tái)機(jī)器同時(shí)抓取的方式,在不違背新浪微博、騰訊微博限制API調(diào)用次數(shù)的初衷的前提下提高采集的效率。其中微博應(yīng)用測(cè)試用戶(以下簡(jiǎn)稱測(cè)試用戶)是能夠獲取授權(quán)令牌的最小單位。微博對(duì)API調(diào)用次數(shù)的限制分為3個(gè)級(jí)別:測(cè)試用戶級(jí)別(每小時(shí)內(nèi)一個(gè)測(cè)試用戶調(diào)用API的頻率不能超過(guò)此上限),微博應(yīng)用級(jí)別(每小時(shí)內(nèi)同一微博應(yīng)用中多個(gè)測(cè)試用戶調(diào)用API的次數(shù)總和不能超過(guò)此上限)和IP級(jí)別(每小時(shí)內(nèi)同一臺(tái)機(jī)器上的多個(gè)微博應(yīng)用調(diào)用API的次數(shù)總和不能超過(guò)此上限)。多測(cè)試用戶方式輪詢采集是指在同一個(gè)程序中首先使用多個(gè)測(cè)試用戶分別獲取授權(quán)令牌,其次輪詢地使用這些授權(quán)令牌調(diào)用API,以增加每小時(shí)內(nèi)API的調(diào)用次數(shù),該方式能夠使API調(diào)用頻率達(dá)到IP級(jí)別的調(diào)用頻率上限。在新浪、騰訊微博中,微博應(yīng)用級(jí)別和IP級(jí)別的API調(diào)用頻率上限相等,因此不需要研究在一臺(tái)機(jī)器上通過(guò)多個(gè)微博應(yīng)用同時(shí)采集的方式提高采集速率。多臺(tái)機(jī)器同時(shí)抓取的方式是指將多測(cè)試用戶方式輪詢采集程序部署到多臺(tái)機(jī)器上同時(shí)運(yùn)行,每臺(tái)機(jī)器的API調(diào)用頻率都可以達(dá)到IP級(jí)別的API調(diào)用頻率上限,因此該方式能夠使API調(diào)用頻率達(dá)到機(jī)器數(shù)*IP級(jí)別API調(diào)用頻率上限。在使用多臺(tái)機(jī)器同時(shí)抓取的采集方式時(shí),每臺(tái)機(jī)器分別將已采集的微博ID緩存在自己的緩存文件中,當(dāng)緩存的ID數(shù)量達(dá)到一定閾值時(shí),使用Ftp接口將緩存的文件上傳至索引和去重模塊所在機(jī)器的粉絲ID采集目錄中。假設(shè)需要采集新浪微博的55000位認(rèn)證用戶的粉絲ID,需要遍歷5次認(rèn)證用戶ID,如果不使用多個(gè)測(cè)試用戶輪詢、多臺(tái)機(jī)器同時(shí)采集的方式,由于測(cè)試用戶級(jí)別API調(diào)用頻率限制(150次/小時(shí)),需要(55000*5)/150=1833.33小時(shí)=76.4天才能采集完成。如果需要更快地采集微博ID而不對(duì)微博網(wǎng)站構(gòu)成潛在的風(fēng)險(xiǎn),可以采用多測(cè)試用戶的方式,由于IP級(jí)別API調(diào)用頻率限制(1000次/小時(shí)),最多可以使用7個(gè)測(cè)試用戶,則上述需求只需(55000*5)/1000=275小時(shí)=11.5天即可完成。如果還需要進(jìn)一步提高采集的速率,可以采用多機(jī)器的方式,此時(shí)API調(diào)用頻率可以達(dá)到1000*機(jī)器數(shù)/每小時(shí),如果使用5臺(tái)機(jī)器進(jìn)行采集,則上述需求只需(55000*5)/(1000*5) =55小時(shí)?2.3天即可完成。用戶可以根據(jù)具體需求及條件采取合適的采集方案。
[0021]所述的述的去重與索引模塊的各個(gè)子模塊的功能分別是:
[0022]索引建立模塊,使用Linux的Crontab工具定期執(zhí)行。模塊使用Java編寫,每次執(zhí)行時(shí)從微博粉絲ID采集目錄中讀取粉絲ID文件,將文件中的ID存入HashSet容器實(shí)現(xiàn)自動(dòng)去重(HashSet容器是基于哈希算法實(shí)現(xiàn)的容器,具有集合特性,能保證其中的元素不重復(fù)出現(xiàn)),在Lucene索引中查詢HashSet容器中的ID,如果ID已存在于索引中,則將ID從HashSet容器中刪除,然后將HashSet容器中的ID存入Lucene索引,將新并入索引的ID標(biāo)記為“未導(dǎo)出”,將已處理的粉絲ID文件刪除。
[0023]ID導(dǎo)出子模塊,使用Linux的Crontab工具定期執(zhí)行。每次執(zhí)行時(shí)調(diào)用Lucene提供的API,從Lucene中檢索出一定數(shù)量的標(biāo)記為“未導(dǎo)出”的微博ID,在本地已建立好的微博ID導(dǎo)出目錄中創(chuàng)建微博ID導(dǎo)出文件,將導(dǎo)出的微博ID以換行符分隔存入文件中,文件根據(jù)當(dāng)前系統(tǒng)時(shí)間以“年-月-日_時(shí)-分.txt”的格式命名,并將對(duì)應(yīng)ID的標(biāo)記置為“已導(dǎo)出”。
[0024]標(biāo)記更新子模塊,使用Linux的Crontab工具定期執(zhí)行。每次執(zhí)行時(shí)檢查本地的微博ID導(dǎo)出目錄中的微博ID導(dǎo)出文件,如果文件名被存儲(chǔ)模塊處理并重命名為“Hbase-年-月_日_時(shí)-分.txt”的格式,則在Lucene中將該文件中的ID對(duì)應(yīng)的標(biāo)記置為“已導(dǎo)入Hbase”,并將該文件刪除。
[0025]所述方法包括下列操作步驟:
[0026](I)工具通過(guò)采集層收集來(lái)自微博網(wǎng)站的微博ID ;
[0027](2)工具通過(guò)存儲(chǔ)層對(duì)微博ID進(jìn)行去重和分布式存儲(chǔ)操作。
[0028]所述步驟(I)進(jìn)一步包括下列操作:
[0029](1.1)采集層中的網(wǎng)絡(luò)爬取模塊通過(guò)編寫瀏覽器插件的方式從新浪、騰訊兩大微博網(wǎng)站上爬取所有認(rèn)證用戶的ID,并存儲(chǔ)到本地的文件中;
[0030](1.2)采集層中的微博API模塊首先自動(dòng)獲取新浪、騰訊微博的API調(diào)用授權(quán)令牌,其次通過(guò)調(diào)用API的方式獲取認(rèn)證用戶的粉絲ID,最后將粉絲ID存儲(chǔ)在本地的粉絲ID采集目錄的粉絲ID文件中。[0031]所述步驟(1.1)中,網(wǎng)絡(luò)爬取模塊的爬取和存儲(chǔ)的操作進(jìn)一步包括下列內(nèi)容:
[0032](1.1.1)通過(guò)編寫Chrome瀏覽器插件的方式請(qǐng)求并解析微博認(rèn)證用戶分類頁(yè)面,并將解析出的ID發(fā)送給該模塊的存儲(chǔ)子模塊。針對(duì)新浪、騰訊微博編寫不同的瀏覽器插件進(jìn)行爬取。為兩個(gè)插件分別建立插件根目錄,在插件根目錄中創(chuàng)建manifest, json配置文件,指定在新浪微博認(rèn)證用戶首頁(yè)加載完成之后加載jquery.js和content_script.js兩個(gè)Javascript文件,其中jquery.js是jQuery函數(shù)庫(kù),content_script.js中為該子模塊爬取認(rèn)證用戶ID的邏輯,通過(guò)配置文件中的permissions字段指定該插件能夠請(qǐng)求認(rèn)證用戶頁(yè)面和本地Webserver的任何資源。騰訊微博爬取插件的相關(guān)配置除了將新浪微博認(rèn)證用戶首頁(yè)改為騰訊微博認(rèn)證用戶首頁(yè)外其余項(xiàng)基本相同。新浪、騰訊微博的認(rèn)證用戶頁(yè)面結(jié)構(gòu)有所不同,具體的爬取過(guò)程也有所不同。
[0033](1.1.2)針對(duì)新浪微博認(rèn)證用戶頁(yè)面,爬取過(guò)程為:
[0034]首先使用jQuery獲取所有class=nav_barMain的div元素中的ul元素中所有第一級(jí)Ii元素。
[0035]從每一個(gè)Ii元素中獲取第一個(gè)a元素,其href屬性即為一級(jí)分類的鏈接,a元素內(nèi)的文字為一級(jí)分類的名稱。
[0036]獲取第一級(jí)Ii元素中的ul元素,其內(nèi)的Ii元素中的a元素內(nèi)的文字及href屬性為二級(jí)分類名稱及鏈接。
[0037]然后對(duì)于每一個(gè)二級(jí)分類,向`其鏈接通過(guò)jQuery提供的$.post函數(shù)發(fā)送請(qǐng)求,在post函數(shù)返回的responseText中使用正則表達(dá)式找出三級(jí)分類名稱及鏈接。
[0038]對(duì)于所有的三級(jí)分類鏈接,在鏈接后添上參數(shù)letter=a、letter=b、…、Ietter=Z構(gòu)成26個(gè)新的鏈接,向這些鏈接分別發(fā)送post請(qǐng)求,在返回的頁(yè)面中使用正則表達(dá)式找出所有的微博ID。
[0039]最后,將微博ID以及對(duì)應(yīng)的分類分別構(gòu)造成Javascript數(shù)組,調(diào)用jQuery提供的$.post函數(shù)將該數(shù)組發(fā)送給該模塊的存儲(chǔ)子模塊相應(yīng)的的處理頁(yè)面。
[0040](1.1.3)網(wǎng)絡(luò)爬取模塊中的騰訊微博ID爬取子模塊,針對(duì)騰訊微博認(rèn)證用戶頁(yè)面,爬取過(guò)程如下:
[0041]首先使用jQuery獲取class=peopleNav的div元素中ul元素中的所有第一級(jí)Ii元素,每個(gè)Ii元素中第一個(gè)a元素的文本及href屬性為一級(jí)分類名稱及鏈接。
[0042]使用jQuery觸發(fā)每個(gè)Ii的mouseover事件,使得頁(yè)面自動(dòng)發(fā)送AJAX請(qǐng)求獲取每個(gè)一級(jí)分類下的二級(jí)分類并寫入當(dāng)前頁(yè)面。
[0043]然后獲取第一級(jí)Ii元素中class=navLayer的div元素,其中dt元素中的strong元素中的文本為二級(jí)分類名稱,dt元素后的dd元素中所有的a元素的文本及href屬性為三級(jí)分類名稱及鏈接。
[0044]對(duì)于每一個(gè)三級(jí)分類鏈接,在鏈接后添加sort=char&char=a、sort=char&char=b>…、sort=char&char=z構(gòu)成26個(gè)新的鏈接,向這些鏈接分別發(fā)送post請(qǐng)求,在返回的頁(yè)面中使正則表達(dá)式找出所有的微博ID。
[0045]后續(xù)步驟與新浪微博相似,除了向存儲(chǔ)子模塊中相應(yīng)的處理頁(yè)面發(fā)送ID及對(duì)應(yīng)的分類名稱外,其他步驟基本相同。
[0046](1.1.4)網(wǎng)絡(luò)爬取模塊中的存儲(chǔ)子模塊,使用PHP語(yǔ)言編寫新浪、騰訊的saveld.Php文件,接收新浪、騰訊微博ID爬取子模塊在(1.1.2)與(1.1.3)中發(fā)送的Get/Post請(qǐng)求,獲取分類名稱數(shù)組和微博ID數(shù)組,按照數(shù)組中除最后一級(jí)分類外的分類名稱分別建立認(rèn)證用戶ID采集目錄并以分類名稱命名(如果目錄已存在則不再建立),以“最后一級(jí)分類名稱.txt”的格式創(chuàng)建認(rèn)證用戶ID文件,并將ID數(shù)組中的ID以換行符隔開存入認(rèn)證用戶ID文件(如果認(rèn)證用戶ID文件已存在則只往文件中添加ID)。其中建立目錄和創(chuàng)建文件之前需要將不允許出現(xiàn)在目錄名或文件名中的字符“/”和“\ ”替換為“、”。如分類名稱數(shù)組為[“娛樂(lè)”,“娛樂(lè)產(chǎn)業(yè)”,“策劃/宣傳”],則建立的目錄應(yīng)為“娛樂(lè)/娛樂(lè)產(chǎn)業(yè)/”,并在目錄中創(chuàng)建文件“策劃、宣傳.txt”。
[0047]所述步驟(1.2)中,微博API模塊的采集和存儲(chǔ)的操作進(jìn)一步包括下列內(nèi)容:
[0048](1.2.1)微博API模塊中的新浪授權(quán)令牌獲取子模塊,通過(guò)模擬HTTPS請(qǐng)求自動(dòng)獲取新浪微博SDK訪問(wèn)令牌,保證令牌不過(guò)期,其他模塊只需利用得到的令牌,遵循0Auth2.0協(xié)議通過(guò)認(rèn)證,即可對(duì)SDK提供的API進(jìn)行調(diào)用。具體的方式是:
[0049]經(jīng)過(guò)仔細(xì)調(diào)研,得到用戶登錄新浪微博授權(quán)頁(yè)面需要的參數(shù)。
[0050]采用Apache公司的HttpClient開源工具提供的相關(guān)接口,倉(cāng)Il建一個(gè)PostMethod對(duì)象,將登陸新浪微博所需的參數(shù)加入到該對(duì)象中。
[0051]創(chuàng)建一個(gè)消息頭鏈表,鏈表中的每個(gè)元素初始化為一個(gè)HttpClient中的Header對(duì)象,構(gòu)造請(qǐng)求消息的消息頭,填入相關(guān)信息,包括Referer、Host、User_Agent。
[0052]創(chuàng)建Protocol對(duì)象,填入相關(guān)參數(shù)從而打開到服務(wù)端的鏈接,具體如下:協(xié)議名稱設(shè)為 “https”,端口為 443, ProtocolSocketFactory 參數(shù)通過(guò)創(chuàng)建 MySSLSocketFactory對(duì)象(由微博平臺(tái)提供)得到。
[0053]創(chuàng)建HttpClient對(duì)象,通過(guò)調(diào)用相關(guān)接口,提交消息頭鏈表。
[0054]完成以上步驟之后即可得到服務(wù)端的返回信息,之后解析返回消息,切分字符串,便得到了 AccessToken。
[0055](1.2.2)微博API模塊中的騰訊授權(quán)令牌獲取子模塊,程序運(yùn)行前,用戶手動(dòng)運(yùn)行使用一次手動(dòng)授權(quán)之后得到的訪問(wèn)令牌,通過(guò)定期調(diào)用騰訊微博提供的訪問(wèn)令牌刷新API,獲取新的令牌,以保證令牌在3個(gè)月內(nèi)不過(guò)期。其中手動(dòng)授權(quán)的過(guò)程為,運(yùn)行授權(quán)程序,程序?qū)棾鰹g覽器,顯示騰訊微博授權(quán)頁(yè)面,輸入用戶名密碼后頁(yè)面自動(dòng)跳轉(zhuǎn),將跳轉(zhuǎn)后頁(yè)面的URL中#號(hào)后面的部分復(fù)制,粘貼到程序中并輸入回車,即可完成一個(gè)測(cè)試用戶的授權(quán)。
[0056](1.2.3)微博API模塊中的粉絲采集子模塊,從認(rèn)證用戶ID采集目錄中讀取認(rèn)證用戶ID文件,其中認(rèn)證用戶ID采集目錄和認(rèn)證用戶ID文件由(1.1.4)產(chǎn)生,將文件中的所有ID存儲(chǔ)于一個(gè)數(shù)組中;
[0057](1.2.4)對(duì)于(1.2.3)中的數(shù)組中的每一個(gè)認(rèn)證用戶ID,使用授權(quán)令牌調(diào)用新浪、騰訊微博開放的API,隨機(jī)獲取該認(rèn)證用戶隨機(jī)的至多5000名粉絲的ID,并將粉絲ID保存在一個(gè)緩存文件中;
[0058](1.2.5)當(dāng)粉絲ID數(shù)量達(dá)到一定閾值時(shí),將緩存文件中的ID存入粉絲ID采集目錄的粉絲ID文件中,粉絲ID文件以“當(dāng)前時(shí)間戳.txt”的格式命名;
[0059](1.2.6)經(jīng)以上步驟遍歷認(rèn)證用戶ID,只能獲取每位認(rèn)證用戶隨機(jī)的至多5000名粉絲ID,因此需要重復(fù)(1.2.3) (1.2.4) (1.2.5)步驟,多次遍歷認(rèn)證用戶ID抓取其粉絲ID,使得系統(tǒng)獲取的ID逐漸趨于完整;[0060](1.2.7)在(1.2.6)中所述的多次重復(fù)遍歷需要較多的API調(diào)用次數(shù),但由于API調(diào)用次數(shù)存在限制,多次遍歷需要較長(zhǎng)時(shí)間。通過(guò)使用多個(gè)微博應(yīng)用測(cè)試用戶輪詢、多臺(tái)機(jī)器同時(shí)抓取的方式,在不違背新浪微博、騰訊微博限制API調(diào)用次數(shù)的初衷的前提下提高采集的效率。其中微博應(yīng)用測(cè)試用戶(以下簡(jiǎn)稱測(cè)試用戶)是能夠獲取授權(quán)令牌的最小單位。微博對(duì)API調(diào)用次數(shù)的限制分為3個(gè)級(jí)別:
[0061]表IAPI調(diào)用次數(shù)限制說(shuō)明
[0062]
限制級(jí)別測(cè)試用戶級(jí)別每小時(shí)內(nèi)一個(gè)測(cè)試用戶調(diào)用API #頻率不能超過(guò) 此上限微博應(yīng)用級(jí)別每小時(shí)內(nèi)同一微博應(yīng)用中多個(gè)測(cè)試用戶調(diào)用API 的次數(shù)總和不能超過(guò)此上F艮IP級(jí)別每小時(shí)內(nèi)同一臺(tái)機(jī)器上的多個(gè)徽博應(yīng)用調(diào)爾API 的次數(shù)總和不能超過(guò)此上跟
[0063]多測(cè)試用戶方式輪詢采集是指在同一個(gè)程序中首先使用多個(gè)測(cè)試用戶分別獲取授權(quán)令牌,其次輪詢地使用這些授權(quán)令牌調(diào)用API,以增加每小時(shí)內(nèi)API的調(diào)用次數(shù),該方式能夠使API調(diào)用頻率達(dá)到IP級(jí)別的調(diào)用頻率上限。
[0064]在新浪、騰訊微博中,微博應(yīng)用級(jí)別和IP級(jí)別的API調(diào)用頻率上限相等,因此不需要研究在一臺(tái)機(jī)器上通過(guò)多個(gè)微博應(yīng)用同時(shí)采集的方式提高采集速率。
[0065]多臺(tái)機(jī)器同時(shí)抓取的方式是指將多測(cè)試用戶方式輪詢采集程序部署到多臺(tái)機(jī)器上同時(shí)運(yùn)行,每臺(tái)機(jī)器的API調(diào)用頻率都可以達(dá)到IP級(jí)別的API調(diào)用頻率上限,因此該方式能夠使API調(diào)用頻率達(dá)到機(jī)器數(shù)*IP級(jí)別API調(diào)用頻率上限。
[0066]在使用多臺(tái)機(jī)器同時(shí)抓取的采集方式時(shí),每臺(tái)機(jī)器分別將已采集的微博ID緩存在自己的緩存文件中,當(dāng)緩存的ID數(shù)量達(dá)到一定閾值時(shí),使用ftp接口將緩存的文件上傳至索引和去重模塊所在機(jī)器的粉絲ID采集目錄中。
[0067]經(jīng)過(guò)加入多測(cè)試用戶輪詢、多臺(tái)機(jī)器部署等機(jī)制,系統(tǒng)的性能有了明顯改進(jìn)。假設(shè)需要采集新浪微博的55000位認(rèn)證用戶的粉絲ID,需要遍歷5次認(rèn)證用戶ID,如果不使用多個(gè)測(cè)試用戶輪詢、多臺(tái)機(jī)器同時(shí)采集的方式,由于測(cè)試用戶級(jí)別API調(diào)用頻率限制(150次/小時(shí)),需要(55000*5)/150=1833.33小時(shí)=76.4天才能采集完成。如果需要更快地采集微博ID而不對(duì)微博網(wǎng)站構(gòu)成潛在的風(fēng)險(xiǎn),可以采用多測(cè)試用戶的方式,由于IP級(jí)別API調(diào)用頻率限制(1000次/小時(shí)),最多可以使用7個(gè)測(cè)試用戶,則上述需求只需(55000*5)/1000=275小時(shí)=11.5天即可完成。如果還需要進(jìn)一步提高采集的速率,可以采用多機(jī)器的方式,此時(shí)API調(diào)用頻率可以達(dá)到1000*機(jī)器數(shù)/每小時(shí),如果使用5臺(tái)機(jī)器進(jìn)行采集,則上述需求只需(55000*5)/(1000*5) =55小時(shí)?2.3天即可完成。用戶可以根據(jù)具體需求及條件采取合適的采集方案。
[0068]所述步驟(2)進(jìn)一步包括下列操作:
[0069](2.1)存儲(chǔ)層中的去重與索引模塊,去重與索引模塊,調(diào)用Lucene提供的API為已采集過(guò)的微博ID建立索引,其中新浪、騰訊微博對(duì)應(yīng)的索引名稱分別為丨11(1以_4和index_B,定期將微博ID導(dǎo)出到指定目錄的文件中供數(shù)據(jù)存儲(chǔ)模塊處理。索引中包括微博ID和標(biāo)記兩列。微博ID和標(biāo)記都會(huì)被檢索,存儲(chǔ)方式都是“不分詞”。標(biāo)記有三種取值:“未導(dǎo)出”、“已導(dǎo)出”和“已導(dǎo)入Hbase”。其中“未導(dǎo)出”表不微博ID未從Lucene中導(dǎo)出;“已導(dǎo)出”表不微博ID已從Lucene中導(dǎo)出,但未導(dǎo)入到Hbase中;“已導(dǎo)入Hbase”表不微博ID已導(dǎo)入到Hbase中。
[0070](2.2)數(shù)據(jù)存儲(chǔ)模塊,負(fù)責(zé)從去重與索引模塊導(dǎo)出已采集的微博ID,利用存儲(chǔ)模塊,將微博id存入Hbase中同時(shí)提供微博ID查詢接口。該模塊使用Linux的Crontab命令定期執(zhí)行。每次執(zhí)行時(shí),調(diào)用Iucene提供的API從index_A和index_B兩個(gè)索引中分別檢索出數(shù)據(jù)存儲(chǔ)模塊,將新浪微博ID和騰訊微博ID分別存儲(chǔ)在Hbase的不同的表中,表的主鍵為“DDDDD微博ID”的格式,其中DDDDD表示一個(gè)五位十進(jìn)制數(shù)字,該數(shù)字前綴是為后期的數(shù)據(jù)分析預(yù)留的標(biāo)記空間,可以用于標(biāo)記該微博ID的狀態(tài)或者屬性。該模塊定期從Lucene中檢索出標(biāo)記值等于“未導(dǎo)出”的微博ID,調(diào)用Hbase提供的API,將這些微博ID存入Hbase相應(yīng)的表中,并在Lucene中將這些微博ID對(duì)應(yīng)的標(biāo)記值改為“已導(dǎo)出”,以防止以后重復(fù)導(dǎo)出。
[0071]所述步驟(2.1)中,去重與索引模塊的操作進(jìn)一步包括下列內(nèi)容:
[0072](2.1.1)索引模塊中的索引建立子模塊調(diào)用Lucene提供的API索引建立模塊,使用Linux的Crontab工具定期執(zhí)行。每次執(zhí)行時(shí)從微博粉絲ID采集目錄中讀取粉絲ID文件,將文件中的ID存入HashSet容器實(shí)現(xiàn)自動(dòng)去重(HashSet容器是基于哈希算法實(shí)現(xiàn)的容器,具有集合特性,能保證其中的元素不重復(fù)出現(xiàn)),調(diào)用Lucene提供的檢索API在Lucene索引中查詢HashSet容器中的ID,如果ID已存在于索引中,則將ID從HashSet容器中刪除,然后調(diào)用Lucene提供的索引API將HashSet容器中的ID并入Lucene索引,將新并入索引的ID標(biāo)記為“未導(dǎo)出”,將已處理的粉絲ID文件刪除。
[0073](2.1.2)索引模塊中的ID導(dǎo)出子模塊,使用Linux的Crontab工具定期執(zhí)行。每次執(zhí)行時(shí)調(diào)用Lucene提供的API,從Lucene中檢索出一定數(shù)量的標(biāo)記為“未導(dǎo)出”的微博ID,在本地已建立好的微博ID導(dǎo)出目錄中創(chuàng)建微博ID導(dǎo)出文件,將導(dǎo)出的微博ID以換行符分隔存入文件中,文件根據(jù)當(dāng)前系統(tǒng)時(shí)間以“年-月-日_時(shí)-分.txt”的格式命名,并將對(duì)應(yīng)ID的標(biāo)記置為“已導(dǎo)出”。
[0074](2.1.3)索引模塊中的標(biāo)記更新子模塊,使用Linux的Crontab工具定期執(zhí)行。每次執(zhí)行時(shí)檢查本地的微博ID導(dǎo)出目錄中的是否存在文件名為“Hbase-年-月-日_時(shí)-分.txt”的格式的文件,如果存在,表示該文件中的ID已被數(shù)據(jù)存儲(chǔ)模塊處理完畢,則在Lucene中將這些文件中的ID對(duì)應(yīng)的標(biāo)記置為“已導(dǎo)入Hbase”,并將該文件刪除。
[0075]所述步驟(2.2)中,數(shù)據(jù)存儲(chǔ)模塊的存儲(chǔ)操作進(jìn)一步包括下列內(nèi)容:
[0076](2.2.1)利用Linux提供的Contab工具定期地從新浪、騰訊微博的微博ID導(dǎo)出目錄中讀取由(2.1.2)產(chǎn)生的以“年-月-日_時(shí)-分.txt”格式命名的文件,獲取文件中的微博ID ;
[0077](2.2.2)調(diào)用Hbase提供的API,將(2.2.1)中獲取的新浪、騰訊微博ID分別存入Hbase相應(yīng)的微博ID表中,其中新浪微博ID存入表author_A中,騰訊微博ID存入表author_B中。表的主鍵設(shè)計(jì)為“DDDDD微博ID”的格式,其中DDDDD表示一個(gè)五位十進(jìn)制數(shù)字,該數(shù)字前綴是為后期的數(shù)據(jù)分析預(yù)留的標(biāo)記空間,可以用于標(biāo)記該微博ID的狀態(tài)或者屬性;
[0078](2.2.3)調(diào)用Lucene提供的字段更新API,將新浪、騰訊微博的微博ID導(dǎo)出目錄中已被(2.2.1)和(2.2.2)處理過(guò)的文件加上前綴“Hbase-”,即重命名為“Hbase-年-月-日_時(shí)-分.txt”的格式。
【專利附圖】
【附圖說(shuō)明】
[0079]圖1是本發(fā)明一種面向主流微博網(wǎng)站微博ID的采集方法及工具的架構(gòu)組成示意圖。
[0080]圖2是面向主流微博網(wǎng)站微博ID的采集方法及工具的操作流程示意圖。
【具體實(shí)施方式】
[0081]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步的詳細(xì)描述。
[0082]參見(jiàn)圖1,本發(fā)明的架構(gòu)分為兩個(gè)層次,分別為采集層和存儲(chǔ)層,層次和系統(tǒng)間的接口清晰,每層內(nèi)部都由若干模塊組成,模塊之間的松耦合,有利于每層功能的擴(kuò)展。采集層實(shí)現(xiàn)微博ID的采集,存儲(chǔ)層實(shí)現(xiàn)本地分布式存儲(chǔ),并提供檢索功能;其中:
[0083]采集層,實(shí)現(xiàn)認(rèn)證用戶ID爬取和認(rèn)證用戶粉絲ID的采集工作,由網(wǎng)絡(luò)爬取模塊和微博API模塊組成。
[0084]存儲(chǔ)層,負(fù)責(zé)對(duì)采集層中獲取的微博ID進(jìn)行去重操作以及將微博ID進(jìn)行分布式存儲(chǔ),并提供微博ID查詢接口,由去重模塊和數(shù)據(jù)存儲(chǔ)模塊組成。
[0085]所述采集層的各模塊的功能分別是:
[0086]網(wǎng)絡(luò)爬取模塊,負(fù)責(zé)針對(duì)新浪、騰訊微博認(rèn)證用戶網(wǎng)頁(yè)中微博ID的抓取工作,主要包括網(wǎng)頁(yè)爬取及解析和本地存儲(chǔ)的操作。其中網(wǎng)頁(yè)爬取及解析操作通過(guò)編寫瀏覽器插件的方式來(lái)完成,本地存儲(chǔ)操作通過(guò)編寫Webserver代碼的方式來(lái)完成。包括請(qǐng)求微博認(rèn)證用戶首頁(yè),一級(jí)、二級(jí)和三級(jí)分類頁(yè)面,解析頁(yè)面中的分類名稱及對(duì)應(yīng)的URL,請(qǐng)求并解析各級(jí)分類頁(yè)面中的微博ID,并將微博ID存儲(chǔ)到本地的認(rèn)證用戶ID采集目錄中的認(rèn)證用戶ID文件中。其中認(rèn)證用戶ID目錄是本地目錄,依據(jù)微博網(wǎng)站的認(rèn)證用戶分類等級(jí)以及名稱自動(dòng)分級(jí)建立;認(rèn)證用戶ID文件以換行符分隔各個(gè)ID,并以“最下級(jí)分類名稱.txt”的格式命名。該模塊包括微博ID爬取子模塊和存儲(chǔ)子模塊。
[0087]微博API模塊,使用新浪、騰訊微博開放平臺(tái)提供的微博API,獲取微博認(rèn)證用戶的粉絲ID。其操作流程包括首先獲得兩大微博開放平臺(tái)的授權(quán)令牌,其次根據(jù)業(yè)務(wù)需求,構(gòu)造不同的參數(shù)給相應(yīng)的API接口,并發(fā)送Get/Post請(qǐng)求,得到JSON格式的微博ID數(shù)據(jù),并將解析出的微博ID存入粉絲ID采集目錄的粉絲ID文件中。其中,粉絲ID采集目錄是一個(gè)存儲(chǔ)粉絲ID文件的目錄,粉絲ID文件是存放該模塊獲取的ID的文本文件,以換行符分隔各個(gè)ID,每個(gè)文件存放一定數(shù)量的ID,文件以“當(dāng)前時(shí)間戳.txt”的格式命名。
[0088]所述存儲(chǔ)層的各模塊的功能分別是:
[0089]去重與索引模塊,所述的去重與索引模塊,為已采集過(guò)的微博ID進(jìn)行去重操作并建立索引,其中新浪、騰訊微博對(duì)應(yīng)的索引名稱分別為化(1以_4和index_B,定期將微博ID導(dǎo)出到指定目錄的文件中供數(shù)據(jù)存儲(chǔ)模塊處理,在索引中設(shè)置標(biāo)記字段防止重復(fù)導(dǎo)出ID。索引中包括微博ID和標(biāo)記兩列,存儲(chǔ)方式都是“不分詞”。標(biāo)記有三種取值:“未導(dǎo)出”、“已導(dǎo)出”和“已導(dǎo)入Hbase”。其中“未導(dǎo)出”表不微博ID未從Lucene中導(dǎo)出已導(dǎo)出”表不微博ID已從Lucene中導(dǎo)出,但未導(dǎo)入到Hbase中;“已導(dǎo)入Hbase”表不微博ID已導(dǎo)入到Hbase中。該模塊包括索引建立子模塊、ID導(dǎo)出子模塊和標(biāo)記更新子模塊。索引建立模塊實(shí)現(xiàn)將采集的ID去重,并將去重后的ID并入索引,將對(duì)應(yīng)ID的標(biāo)記字段置為“未導(dǎo)出”。ID導(dǎo)出子模塊負(fù)責(zé)定期檢索索引中未導(dǎo)出的ID,存入本地的微博ID導(dǎo)出目錄中的微博ID導(dǎo)出文件(微博ID導(dǎo)出目錄需要在系統(tǒng)運(yùn)行前創(chuàng)建,微博ID導(dǎo)出文件在每次導(dǎo)出時(shí)自動(dòng)創(chuàng)建),文件命名格式為“年-月-日_時(shí)-分.txt”,并提供給數(shù)據(jù)存儲(chǔ)模塊處理,將對(duì)應(yīng)ID的標(biāo)記置為“已導(dǎo)出”。標(biāo)記更新子模塊負(fù)責(zé)檢查數(shù)據(jù)存儲(chǔ)模塊是否已處理完導(dǎo)出的ID,若處理完成,則將對(duì)應(yīng)ID的標(biāo)記置為“已導(dǎo)入Hbase”。
[0090]數(shù)據(jù)存儲(chǔ)模塊,負(fù)責(zé)從本地的微博ID導(dǎo)出目錄中讀取微博ID導(dǎo)出文件,并使用開源的分布式系統(tǒng)Hadoop中的存儲(chǔ)工具Hbase將文件中的微博ID進(jìn)行分布式存儲(chǔ),同時(shí)提供微博ID查詢接口。該模塊使用Linux的Crontab命令定期執(zhí)行。每次執(zhí)行時(shí),讀取本地的微博ID導(dǎo)出目錄中的微博ID導(dǎo)出文件,將新浪微博ID和騰訊微博ID分別存儲(chǔ)在Hbase的不同的表中,表的主鍵設(shè)計(jì)為“DDDDD微博ID”的格式,其中DDDDD表示一個(gè)五位十進(jìn)制數(shù)字,該數(shù)字前綴是為后期的數(shù)據(jù)分析預(yù)留的標(biāo)記空間,可以用于標(biāo)記該微博ID的狀態(tài)或者屬性。該模塊定期從Lucene中檢索出標(biāo)記值等于“未導(dǎo)出”的微博ID,調(diào)用Hbase提供的API,將這些微博ID存入Hbase相應(yīng)的表中,并在Lucene中將這些微博ID對(duì)應(yīng)的標(biāo)記值改為“已導(dǎo)出”,以防止以后重復(fù)導(dǎo)出。
[0091]所述的網(wǎng)絡(luò)爬取模塊的各子模塊的功能分別是:
[0092]新浪微博ID爬取子模塊,通過(guò)編寫瀏覽器插件的方式解析新浪微博的認(rèn)證用戶主頁(yè),獲取一級(jí)分類列表及其URL,并對(duì)一級(jí)分類列表中的URL發(fā)送AJAX請(qǐng)求獲取相應(yīng)的頁(yè)面,如果沒(méi)有下一級(jí)分類,則向該分類中以每個(gè)字母開頭的認(rèn)證用戶頁(yè)面發(fā)送AJAX請(qǐng)求,從獲取的頁(yè)面中解析出認(rèn)證用戶ID,并使用Get/Post請(qǐng)求將解析出來(lái)的微博ID及其對(duì)應(yīng)的分類發(fā)送給該模塊的存儲(chǔ)子模塊。否則,從一級(jí)分類頁(yè)面中解析出二級(jí)分類列表及其URL,進(jìn)行同上的操作。
[0093]騰訊微博ID爬取子模塊,通過(guò)編寫瀏覽器插件的方式解析騰訊微博的認(rèn)證用戶主頁(yè),獲取一級(jí)和二級(jí)分類列表及其URL,并對(duì)二級(jí)分類中以每個(gè)字母開頭的認(rèn)證用戶頁(yè)面發(fā)送AJAX請(qǐng)求,從獲取的頁(yè)面中解析出認(rèn)證用戶的ID,并使用Get/Post請(qǐng)求將解析出的微博ID及其對(duì)應(yīng)的分類發(fā)送給該模塊的存儲(chǔ)子模塊。
[0094]存儲(chǔ)子模塊,使用Webserver接收新浪、騰訊微博ID爬取子模塊的Get/Post請(qǐng)求,按照一級(jí)、二級(jí)分類分別建立一級(jí)、二級(jí)目錄并以分類名稱命名,其中建立目錄之前需要將不允許出現(xiàn)在目錄名中的字符“/”和“\”替換為“、”,并將微博ID分類存入相應(yīng)的文件中。[0095]微博API模塊,自動(dòng)化獲取授權(quán)令牌以支持長(zhǎng)期地通過(guò)API的方式不斷地獲取認(rèn)證用戶的粉絲ID。其中新浪微博的授權(quán)令牌需要通過(guò)模擬HTTPS請(qǐng)求的方式自動(dòng)化獲取,騰訊微博的授權(quán)令牌只需要定期調(diào)用騰訊微博提供的令牌刷新API即可實(shí)現(xiàn)自動(dòng)化獲取。通過(guò)API的方式獲取的粉絲ID數(shù)量達(dá)到一定閾值時(shí),將粉絲ID存入粉絲ID采集目錄的粉絲ID文件中,粉絲ID文件以“當(dāng)前時(shí)間戳.txt”的格式命名。包括新浪授權(quán)令牌獲取子模塊、騰訊授權(quán)令牌獲取子模塊和粉絲采集子模塊。
[0096]所述的微博API模塊的各個(gè)子模塊的功能分別是:
[0097]新浪授權(quán)令牌獲取子模塊,通過(guò)模擬HTTPS請(qǐng)求自動(dòng)獲取新浪微博SDK訪問(wèn)令牌,保證令牌不過(guò)期,其他模塊只需利用得到的令牌,遵循0Auth2.0協(xié)議通過(guò)認(rèn)證,即可對(duì)SDK提供的API進(jìn)行調(diào)用。具體的方式是:通過(guò)構(gòu)造新浪微博授權(quán)頁(yè)面登錄動(dòng)作所需要的參數(shù),依據(jù)HTTPS協(xié)議的特點(diǎn),利用Apache公司提供的HttpClient開源工具,構(gòu)造請(qǐng)求所需消息頭,設(shè)置PostMethod,加上開放平臺(tái)提供的通用Socket接口連通客戶端到服務(wù)器的通信,發(fā)送Post請(qǐng)求,從而成功獲取服務(wù)器端的響應(yīng),并解析響應(yīng)消息體,獲取認(rèn)證令牌。
[0098]騰訊授權(quán)令牌獲取子模塊,使用一次手動(dòng)授權(quán)之后得到的訪問(wèn)令牌,通過(guò)定期調(diào)用騰訊微博提供的訪問(wèn)令牌刷新API,獲取新的令牌,以保證令牌在3個(gè)月以內(nèi)不過(guò)期。其中手動(dòng)授權(quán)的過(guò)程為,運(yùn)行授權(quán)程序,程序?qū)棾鰹g覽器,顯示騰訊微博授權(quán)頁(yè)面,輸入用戶名密碼后頁(yè)面自動(dòng)跳轉(zhuǎn),將跳轉(zhuǎn)后頁(yè)面的URL中#號(hào)后面的部分復(fù)制,粘貼到程序中并輸入回車,即可完成一個(gè)測(cè)試用戶的授權(quán)。
[0099]粉絲采集子模塊,從認(rèn)證用戶ID采集目錄中讀取認(rèn)證用戶ID文件,獲取并遍歷認(rèn)證用戶ID,使用授權(quán)令牌調(diào)用新浪、騰訊微博開放的API,隨機(jī)獲取認(rèn)證用戶隨機(jī)的至多5000名粉絲的ID,并將粉絲ID緩存在一個(gè)緩存文件中,當(dāng)粉絲ID數(shù)量達(dá)到一定閾值時(shí),將緩存文件中的ID存入粉絲ID采集目錄的粉絲ID文件中,粉絲ID文件以“當(dāng)前時(shí)間戳.txt”的格式命名。該模塊通過(guò)使用多個(gè)微博應(yīng)用測(cè)試用戶、多臺(tái)機(jī)器同時(shí)抓取的方式,突破新浪微博、騰訊微博對(duì)于API調(diào)用次數(shù)的限制。其中微博應(yīng)用測(cè)試用戶(以下簡(jiǎn)稱測(cè)試用戶)是能夠獲取授權(quán)令牌的最小單位。由于一個(gè)測(cè)試用戶在一個(gè)IP上的一個(gè)應(yīng)用中每小時(shí)的API調(diào)用次數(shù)不能超過(guò)150次,而多個(gè)測(cè)試用戶在一個(gè)IP上的一個(gè)或多個(gè)應(yīng)用中每小時(shí)API調(diào)用次數(shù)的總和不能超過(guò)1000次,因此該模塊采用多測(cè)試用戶、多臺(tái)機(jī)器的方式以增加API的調(diào)用次數(shù)。
[0100]參看圖2,所述的面向主流微博網(wǎng)站的微博ID采集方法及工具的具體操作流程為:爬取新浪、騰訊微博認(rèn)證用戶微博ID,并存儲(chǔ)在本地文件中;獲取新浪、騰訊微博授權(quán)令牌,使用授權(quán)令牌調(diào)用相關(guān)API,獲取認(rèn)證用戶的粉絲ID,并存儲(chǔ)在本地文件中,受新浪、騰訊微博API調(diào)用次數(shù)的限制,該操作需要較長(zhǎng)時(shí)間;定期將上一步驟采集的粉絲ID去重并為其建立索引;定期從索引中檢索出ID,將其存入Hbase中。
[0101]所述方法包括下列操作步驟:
[0102](I)工具通過(guò)采集層收集來(lái)自微博網(wǎng)站的微博ID ;
[0103](2)系統(tǒng)通過(guò)存儲(chǔ)層對(duì)微博ID進(jìn)行去重和分布式存儲(chǔ)操作。
[0104]所述步驟(I)進(jìn)一步包括下列操作:
[0105](1.1)采集層中的網(wǎng)絡(luò)爬取模塊通過(guò)編寫瀏覽器插件的方式從新浪、騰訊兩大微博網(wǎng)站上爬取所有認(rèn)證用戶的ID,并存儲(chǔ)到本地的文件中;[0106](1.2)米集層中的微博API模塊首先自動(dòng)獲取新浪、騰訊微博的API調(diào)用授權(quán)令牌,其次通過(guò)調(diào)用API的方式獲取認(rèn)證用戶的粉絲ID,并將粉絲ID存儲(chǔ)在本地的粉絲ID采集目錄的粉絲ID文件中。
[0107]所述步驟(1.1)中,網(wǎng)絡(luò)爬取模塊的爬取和存儲(chǔ)的操作進(jìn)一步包括下列內(nèi)容:
[0108](1.1.1)通過(guò)編寫Chrome瀏覽器插件的方式請(qǐng)求并解析微博認(rèn)證用戶分類頁(yè)面,并將解析出的ID發(fā)送給該模塊的存儲(chǔ)子模塊。針對(duì)新浪、騰訊微博編寫不同的瀏覽器插件進(jìn)行爬取。為兩個(gè)插件分別建立插件根目錄,在插件根目錄中創(chuàng)建manifest, json配置文件,其中新浪微博爬取插件的manifest, json文件中的相關(guān)配置代碼為:
[0109]
【權(quán)利要求】
1.一種面向主流微博網(wǎng)站微博ID的采集方法及工具,其特征在于:所述系統(tǒng)架構(gòu)分為兩個(gè)層次,分別為采集層和存儲(chǔ)層,層次和系統(tǒng)間的接口清晰,每層內(nèi)部都由若干模塊組成,模塊之間的松耦合,有利于每層功能的擴(kuò)展。采集層實(shí)現(xiàn)微博ID的采集,存儲(chǔ)層實(shí)現(xiàn)本地?cái)?shù)據(jù)庫(kù)存儲(chǔ),并提供開放式檢索功能。其中:采集層,實(shí)現(xiàn)認(rèn)證用戶ID爬取和認(rèn)證用戶粉絲ID的采集工作,由網(wǎng)絡(luò)爬取模塊和微博API模塊組成。存儲(chǔ)層,負(fù)責(zé)對(duì)采集層中獲取的微博ID進(jìn)行去重操作以及將微博ID進(jìn)行分布式存儲(chǔ),并提供微博ID查詢接口,由去重與索引模塊和數(shù)據(jù)存儲(chǔ)模塊組成。
2.根據(jù)權(quán)利要求1所述的面向主流微博網(wǎng)站微博ID的采集方法及工具,其特征在于:所述采集層的各模塊的功能分別是:網(wǎng)絡(luò)爬取模塊,負(fù)責(zé)針對(duì)新浪、騰訊微博認(rèn)證用戶網(wǎng)頁(yè)中微博ID的抓取工作,主要包括網(wǎng)頁(yè)爬取、ID解析和ID本地存儲(chǔ)的操作。其中網(wǎng)頁(yè)爬取及ID解析操作通過(guò)編寫瀏覽器插件的方式來(lái)完成,本地存儲(chǔ)操作通過(guò)編寫Webserver代碼的方式來(lái)完成。流程包括請(qǐng)求微博認(rèn)證用戶首頁(yè),一級(jí)、二級(jí)和三級(jí)分類頁(yè)面,解析頁(yè)面中的分類名稱及對(duì)應(yīng)的URL,請(qǐng)求并解析各級(jí)分類頁(yè)面中的微博ID,并將微博ID存儲(chǔ)到本地的認(rèn)證用戶ID采集目錄中的認(rèn)證用戶ID文件中。微博API模塊,使用新浪、騰訊微博開放平臺(tái)提供的微博API,獲取微博認(rèn)證用戶的粉絲ID。其操作流程包括首先獲得兩大微博開放平臺(tái)的授權(quán)令牌,其次根據(jù)不同微博的API接口,構(gòu)造不同的參數(shù)給相應(yīng)的API接口,得到JSON格式的微博ID數(shù)據(jù),并將解析出的微博ID存入本地的粉絲ID采集目錄的粉絲ID文件中。
3.根據(jù)權(quán)利要求1所述 的面向主流微博網(wǎng)站微博ID的采集方法及工具,其特征在于:所述存儲(chǔ)層的各模塊的功能分別是:去重與索引模塊,負(fù)責(zé)利用開源的索引工具Lucene對(duì)微博API模塊采集的微博ID進(jìn)行去重操作并建立索引,定期從索引中導(dǎo)出微博ID以供數(shù)據(jù)存儲(chǔ)模塊處理。導(dǎo)出的微博ID存儲(chǔ)在本地的微博ID導(dǎo)出目錄的微博ID導(dǎo)出文件中。數(shù)據(jù)存儲(chǔ)模塊,負(fù)責(zé)從本地的微博ID導(dǎo)出目錄中讀取微博ID導(dǎo)出文件,并使用開源的分布式系統(tǒng)Hadoop中的存儲(chǔ)工具Hbase將文件中的微博ID進(jìn)行分布式存儲(chǔ),同時(shí)提供微博ID查詢接口。
4.根據(jù)權(quán)利要求2所述的采集層,其特征在于:所述的網(wǎng)絡(luò)爬取模塊的各子模塊的功能分別是:微博ID爬取子模塊,通過(guò)編寫瀏覽器插件的方式請(qǐng)求并解析微博認(rèn)證用戶分類頁(yè)面,并將解析出的ID發(fā)送給該模塊的存儲(chǔ)子模塊。由于瀏覽器插件使用Javascript語(yǔ)言編寫,采用jQuery等Javascript庫(kù)簡(jiǎn)化請(qǐng)求頁(yè)面和解析HTML文檔的操作;由于瀏覽器插件代碼會(huì)在瀏覽器加載完指定的頁(yè)面后自動(dòng)執(zhí)行,通過(guò)設(shè)置代碼在微博登陸后執(zhí)行來(lái)避開對(duì)微博登陸過(guò)程的開發(fā);利用Javascript能夠向同一域名內(nèi)的任何資源發(fā)起Get/Post請(qǐng)求的特性,請(qǐng)求到所有的微博認(rèn)證用戶的頁(yè)面;利用瀏覽器插件支持跨域XMLHttpRequest請(qǐng)求的特點(diǎn)(XMLHttpRequest是Javascript發(fā)送Get/Post請(qǐng)求的基礎(chǔ)),將爬取的ID通過(guò)Get/Post請(qǐng)求發(fā)送到自己編寫的Webserver上進(jìn)行本地存儲(chǔ)。存儲(chǔ)子模塊,使用Webserver接收新浪、騰訊微博ID爬取子模塊的Get/Post請(qǐng)求,按照一級(jí)和二級(jí)分類分別在本地建立一級(jí)和二級(jí)認(rèn)證用戶ID采集目錄并以分類名稱命名,并將微博ID按照所屬分類存入相應(yīng)的認(rèn)證用戶ID采集目錄的認(rèn)證用戶ID文件中。
5.根據(jù)權(quán)利要求2所述的采集層,其特征在于:所述的微博API模塊,自動(dòng)化獲取授權(quán)令牌以支持長(zhǎng)期地通過(guò)API的方式不斷地獲取認(rèn)證用戶的粉絲ID。其中新浪微博的授權(quán)令牌需要通過(guò)模擬HTTPS請(qǐng)求的方式自動(dòng)化獲取,騰訊微博的授權(quán)令牌只需要定期調(diào)用騰訊微博提供的令牌刷新API即可在3個(gè)月內(nèi)實(shí)現(xiàn)自動(dòng)化獲取。通過(guò)API的方式獲取的粉絲ID數(shù)量達(dá)到一定閾值時(shí),將粉絲ID存入粉絲ID采集目錄的粉絲ID文件中,粉絲ID文件以換行符分隔各個(gè)ID,以“當(dāng)前時(shí)間戳.txt”的格式命名。包括新浪授權(quán)令牌獲取子模塊、騰訊授權(quán)令牌獲取子模塊和粉絲采集子模塊。
6.根據(jù)權(quán)利要求3所述的存儲(chǔ)層,其特征在于:所述的去重與索引模塊,為已采集過(guò)的微博ID進(jìn)行去重操作并建立索引,定期將微博ID導(dǎo)出到指定目錄的文件中供數(shù)據(jù)存儲(chǔ)模塊處理,在索引中設(shè)置標(biāo)記字段防止重復(fù)導(dǎo)出ID。索引中包括微博ID和標(biāo)記兩列,存儲(chǔ)方式都是“不分詞”。標(biāo)記有三種取值:“未導(dǎo)出”、“已導(dǎo)出”和“已導(dǎo)入Hbase”。其中“未導(dǎo)出”表不微博ID未從Lucene中導(dǎo)出;“已導(dǎo)出”表不微博ID已從Lucene中導(dǎo)出,但未導(dǎo)入到Hbase中;“已導(dǎo)入Hbase”表示微博ID已導(dǎo)入到Hbase中。該模塊包括索引建立子模塊、ID導(dǎo)出子模塊和標(biāo)記更新子模塊。索引建立模塊實(shí)現(xiàn)將采集的ID去重,并將去重后的ID并入索引,將對(duì)應(yīng)ID的標(biāo)記字段置為“未導(dǎo)出”。ID導(dǎo)出子模塊負(fù)責(zé)定期檢索索引中未導(dǎo)出的ID,存入本地的微博ID導(dǎo)出目錄中的微博ID導(dǎo)出文件(微博ID導(dǎo)出目錄需要在系統(tǒng)運(yùn)行前創(chuàng)建,微博ID導(dǎo)出文 件在每次導(dǎo)出時(shí)自動(dòng)創(chuàng)建),文件命名格式為“年-月-日_時(shí)-分.txt”,并提供給數(shù)據(jù)存儲(chǔ)模塊處理,將對(duì)應(yīng)ID的標(biāo)記置為“已導(dǎo)出”。標(biāo)記更新子模塊負(fù)責(zé)檢查數(shù)據(jù)存儲(chǔ)模塊是否已處理完導(dǎo)出的ID,若處理完成,則將對(duì)應(yīng)ID的標(biāo)記置為“已導(dǎo)入Hbase”。新浪微博ID和騰訊微博ID分別存儲(chǔ)在Hbase的不同的表中,表的主鍵設(shè)計(jì)為“DDDDD微博ID”的格式,其中DDDDD表示一個(gè)五位十進(jìn)制數(shù)字,該數(shù)字前綴是為后期的數(shù)據(jù)分析預(yù)留的標(biāo)記空間,可以用于標(biāo)記該微博ID的狀態(tài)或者屬性。該模塊定期從微博ID導(dǎo)出目錄中讀取以“年-月-日_時(shí)-分.txt”格式命名的文件,調(diào)用Hbase提供的API將文件中的微博ID存入Hbase相應(yīng)的表中,將該文件重命名為“Hbase-年-月-日_時(shí)-分.txt”。
7.根據(jù)權(quán)利要求5所述的微博API模塊,其特征在于:所述的各個(gè)子模塊的功能分別是:新浪授權(quán)令牌獲取子模塊,通過(guò)模擬HTTPS請(qǐng)求自動(dòng)獲取新浪微博SDK訪問(wèn)令牌,保證令牌不過(guò)期,其他模塊只需利用得到的令牌,遵循0Auth2.0協(xié)議通過(guò)認(rèn)證,即可對(duì)SDK提供的API進(jìn)行調(diào)用。騰訊授權(quán)令牌獲取子模塊,通過(guò)定期調(diào)用騰訊微博提供的訪問(wèn)令牌刷新API獲取新的令牌,以保證令牌在3個(gè)月內(nèi)不過(guò)期。該模塊需要用戶在系統(tǒng)運(yùn)行前進(jìn)行一次手動(dòng)授權(quán)(即通過(guò)騰訊微博開發(fā)平臺(tái)規(guī)定的方式進(jìn)行授權(quán)),此后3個(gè)月內(nèi)只需定期刷新授權(quán)令牌,而無(wú)需手動(dòng)授權(quán)。粉絲采集子模塊,從認(rèn)證用戶ID采集目錄中讀取認(rèn)證用戶ID文件,獲取并遍歷認(rèn)證用戶ID,使用授權(quán)令牌調(diào)用新浪、騰訊微博開放的API,隨機(jī)獲取認(rèn)證用戶隨機(jī)的至多5000名粉絲的ID,并將粉絲ID緩存在一個(gè)緩存文件中,當(dāng)粉絲ID數(shù)量達(dá)到一定閾值時(shí),將緩存文件中的ID存入粉絲ID采集目錄的粉絲ID文件中。
8.根據(jù)權(quán)利要求6所述的去重與索引模塊,其特征在于:所述的各個(gè)子模塊的功能分別是:索引建立模塊,定期從微博粉絲ID采集目錄中讀取粉絲ID文件,將文件中的ID存入Set容器實(shí)現(xiàn)自動(dòng)去重,在Lucene索引中查詢Set容器中的微博ID,如果ID已存在于索引中,則將其從Set容器中刪除,然后將Set容器中剩余的ID存入Lucene索引,將新并入索引的ID標(biāo)記為“未導(dǎo)出”,將已處理的粉絲ID文件刪除。ID導(dǎo)出子模塊,定期從Lucene中檢索出一定數(shù)量的標(biāo)記為“未導(dǎo)出”的微博ID,在本地已建立好的微博ID導(dǎo)出目錄中創(chuàng)建微博ID導(dǎo)出文件,將導(dǎo)出的微博ID以換行符分隔存入文件中,文件根據(jù)當(dāng)前系統(tǒng)時(shí)間以“年-月-日_時(shí)-分.txt”的格式命名,并將對(duì)應(yīng)ID的標(biāo)記置為“已導(dǎo)出”。標(biāo)記更新子模塊,定期檢查本地的微博ID導(dǎo)出目錄中的微博ID導(dǎo)出文件,如果文件名被存儲(chǔ)模塊處理并被重命名為“Hbase-年-月_日_時(shí)-分.txt”的格式,則在Lucene中將該文件中的ID對(duì)應(yīng)的標(biāo)記置為“已導(dǎo)入Hbase”,并將該文件刪除。
9.根據(jù)權(quán)利要求7所述的微博API模塊,其特征在于:所述的新浪授權(quán)令牌獲取子?!缞A,新浪微博開放平臺(tái)對(duì)測(cè)試用戶的授權(quán)有效時(shí)間是24小時(shí),測(cè)試授權(quán)的用戶每隔24小時(shí)就需要登錄授權(quán)頁(yè)面重新申請(qǐng)新的AccessToken,這給第三方應(yīng)用開發(fā)團(tuán)隊(duì)帶來(lái)了很大的不便。而新浪授權(quán)令牌獲取子模塊則可以將這一手動(dòng)過(guò)程自動(dòng)化,從而使得低權(quán)限的第三方開發(fā)團(tuán)隊(duì)能忽略這一限制,實(shí)現(xiàn)自動(dòng)化采集數(shù)據(jù),為微博用戶提供更好的服務(wù)。
10.根據(jù)權(quán)利要求7所述的微博API模塊,其特征在于:所述的粉絲采集子模塊,通過(guò)使用多個(gè)微博應(yīng)用測(cè)試用戶輪詢、多臺(tái)機(jī)器同時(shí)抓取的方式,在不違背新浪微博、騰訊微博限制API調(diào)用次數(shù)的初衷的前 提下提高采集的效率。多測(cè)試用戶方式輪詢采集是指在同一個(gè)程序中首先使用多個(gè)測(cè)試用戶分別獲取授權(quán)令牌,其次輪詢地使用這些授權(quán)令牌調(diào)用API,以增加每小時(shí)內(nèi)API的調(diào)用次數(shù),該方式能夠使API調(diào)用頻率達(dá)到IP級(jí)別的調(diào)用頻率上限。多臺(tái)機(jī)器同時(shí)抓取的方式是指將多測(cè)試用戶方式輪詢采集程序部署到多臺(tái)機(jī)器上同時(shí)運(yùn)行,每臺(tái)機(jī)器的API調(diào)用頻率都可以達(dá)到IP級(jí)別的API調(diào)用頻率上限,因此該方式能夠使API調(diào)用頻率達(dá)到機(jī)器數(shù)*IP級(jí)別API調(diào)用頻率上限。在使用多臺(tái)機(jī)器同時(shí)抓取的采集方式時(shí),每臺(tái)機(jī)器分別將已采集的微博ID緩存在自己的緩存文件中,當(dāng)緩存的ID數(shù)量達(dá)到一定閾值時(shí),使用Ftp接口將緩存的文件上傳至索引和去重模塊所在機(jī)器的粉絲ID采集目錄中。
【文檔編號(hào)】G06F17/30GK103440139SQ201310412348
【公開日】2013年12月11日 申請(qǐng)日期:2013年9月11日 優(yōu)先權(quán)日:2013年9月11日
【發(fā)明者】閆丹鳳, 楊翔, 張麗瑩, 藍(lán)田, 黃俊霖, 唐皓瑾, 鄒文濤, 徐佳 申請(qǐng)人:北京郵電大學(xué)