黃紅桃 江盈鋒
摘? 要:微博的熱點(diǎn)事件會(huì)產(chǎn)生大量評(píng)論數(shù)據(jù),這些數(shù)據(jù)是進(jìn)行輿情分析和網(wǎng)絡(luò)水軍識(shí)別等數(shù)據(jù)挖掘的基礎(chǔ)。論文分析對(duì)比常用的網(wǎng)絡(luò)爬蟲技術(shù)和框架,分別使用Selenium框架和Json數(shù)據(jù)接口兩種方法,采集新浪微博熱點(diǎn)事件下的用戶評(píng)論數(shù)據(jù)。一般網(wǎng)絡(luò)爬蟲技術(shù)多使用廣度搜索,這里采用深度搜索,能夠更精確地獲得某個(gè)熱點(diǎn)事件下的用戶評(píng)論數(shù)據(jù)。
關(guān)鍵詞:數(shù)據(jù)挖掘? 微博? 用戶評(píng)論? 網(wǎng)絡(luò)爬蟲? Selenium? Json
中圖分類號(hào):TP393.09;TP274.2? ? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1674-098X(2021)05(b)-0132-05
Data Collection of User Comments Based on MicroBlog Platform
HUANG Hongtao? JIANG Yingfeng
(School of Information, Guangdong University of Foreign Studies, Guangzhou, Guangdong Province, 510006 China)
Abstract: Hot events on MicroBlog will generate a large amount of comment data, which is the basis for data mining such as public opinion analysis and online water army identification. The paper analyzes and compares commonly used web crawler technologies and frameworks, using Selenium framework and Json data interface respectively to collect user comment data under hot events on Sina MicroBlog. Generally, web crawling technology uses breadth search, and deep search is adopted here to obtain user comment data under a hot event more accurately.
Key Words: Data mining; MicroBlog; User comments; Web crawler; Selenium; Json
根據(jù)2021年2月發(fā)布的第47次《中國(guó)互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計(jì)報(bào)告》,截至2020年12月,我國(guó)網(wǎng)民規(guī)模達(dá)9.89億,較2020年3月增長(zhǎng)8540萬(wàn),互聯(lián)網(wǎng)普及率達(dá)70.4%,較2020年3月提升5.9個(gè)百分點(diǎn)。截至2020年12月,我國(guó)手機(jī)網(wǎng)民規(guī)模達(dá)9.86億,較2020年3月增長(zhǎng)8885萬(wàn),網(wǎng)民使用手機(jī)上網(wǎng)的比例達(dá)99.7%,較2020年3月提升0.4個(gè)百分點(diǎn)。數(shù)據(jù)表明我國(guó)的網(wǎng)民基數(shù)很大,并且網(wǎng)民使用手機(jī)上網(wǎng)的比例非常高。這就使得網(wǎng)民進(jìn)入網(wǎng)絡(luò)的社區(qū)交流平臺(tái)(如微博、知乎)進(jìn)行交流的門檻變低,機(jī)會(huì)變多。很多的網(wǎng)民包括不少網(wǎng)絡(luò)水軍在熱點(diǎn)事件中參與了評(píng)論,使得這些事件產(chǎn)生大量數(shù)據(jù)。
新浪微博是國(guó)內(nèi)的用戶量極大、活躍度也很高的網(wǎng)絡(luò)社交平臺(tái)。一次熱點(diǎn)事件常常會(huì)有數(shù)以萬(wàn)計(jì)、十萬(wàn)計(jì)甚至百萬(wàn)以上的評(píng)論數(shù)據(jù)。這些數(shù)據(jù)是進(jìn)行輿情分析,網(wǎng)絡(luò)水軍識(shí)別等數(shù)據(jù)挖掘的基礎(chǔ)。
論文研究相關(guān)的網(wǎng)絡(luò)爬蟲技術(shù),并以此來(lái)對(duì)用戶評(píng)論數(shù)據(jù)進(jìn)行批量、自動(dòng)化地采集。
1? 相關(guān)技術(shù)
1.1 爬蟲技術(shù)的類別
爬蟲技術(shù)具有如下的一些分類。
1.1.1 通用網(wǎng)絡(luò)爬蟲
通用網(wǎng)絡(luò)爬蟲又稱全網(wǎng)爬蟲(Scalable Web Crawler)[1],爬行對(duì)象從一些種子URL擴(kuò)充到整個(gè) Web,主要為門戶站點(diǎn)搜索引擎和大型Web服務(wù)提供商采集數(shù)據(jù)。由通用網(wǎng)絡(luò)爬蟲的結(jié)構(gòu)大致可以分為頁(yè)面爬行模塊、頁(yè)面分析模塊、鏈接過濾模塊、頁(yè)面數(shù)據(jù)庫(kù)、URL隊(duì)列初始URL集合幾個(gè)部分。通用式爬蟲多用于廣度搜索優(yōu)先策略。
1.1.2 聚焦網(wǎng)絡(luò)爬蟲
聚焦網(wǎng)絡(luò)爬蟲(Focused Crawler),又稱主題網(wǎng)絡(luò)爬蟲(Topical Crawler)[2],是指選擇性地爬行那些與預(yù)先定義好的主題相關(guān)頁(yè)面的網(wǎng)絡(luò)爬蟲。和通用網(wǎng)絡(luò)爬蟲相比,聚焦爬蟲只需要爬行與主題相關(guān)的頁(yè)面,極大地節(jié)省了硬件和網(wǎng)絡(luò)資源,保存的頁(yè)面也由于數(shù)量少而更新快,還可以很好地滿足一些特定人群對(duì)特定領(lǐng)域信息的需求。聚焦網(wǎng)絡(luò)爬蟲和通用網(wǎng)絡(luò)爬蟲相比,增加了鏈接評(píng)價(jià)模塊及內(nèi)容評(píng)價(jià)模塊。聚焦爬蟲爬行策略實(shí)現(xiàn)的關(guān)鍵是評(píng)價(jià)頁(yè)面內(nèi)容和鏈接的重要性,不同的方法計(jì)算出的重要性不同,由此導(dǎo)致鏈接的訪問順序也不同。
1.1.3 增量式爬蟲
增量式網(wǎng)絡(luò)爬蟲指的是對(duì)已經(jīng)爬取過的網(wǎng)頁(yè)不再進(jìn)行爬取,只爬取新產(chǎn)生的網(wǎng)頁(yè),即增量式更新。與其他類型的網(wǎng)絡(luò)爬蟲相比,只關(guān)注新增的數(shù)據(jù),網(wǎng)頁(yè)的下載量大大減少,降低了爬蟲的存儲(chǔ)空間與網(wǎng)絡(luò)帶寬的消耗,但是增加量抓取算法的復(fù)雜度和實(shí)現(xiàn)的難度[3]。
1.1.4 Deep Web爬蟲
從網(wǎng)頁(yè)在網(wǎng)站上呈現(xiàn)的不同的位置結(jié)構(gòu)的角度來(lái)分析,可簡(jiǎn)單將網(wǎng)頁(yè)分為淺層態(tài)網(wǎng)頁(yè)與深層態(tài)網(wǎng)頁(yè)。深層態(tài)網(wǎng)頁(yè)是指那些不能被通用搜索引擎所搜錄的存儲(chǔ)在web數(shù)據(jù)庫(kù)中的態(tài)網(wǎng)頁(yè),其通常需要一定條件才能獲?。ㄈ绲卿洠O鄬?duì)深層態(tài)網(wǎng)頁(yè)而言,淺層態(tài)網(wǎng)頁(yè)是指web上被搜索引擎搜錄的淺層態(tài)網(wǎng)頁(yè)。Deep Web往往具有較強(qiáng)的主題性,各Deep Web主題領(lǐng)域中蘊(yùn)含的數(shù)信息專業(yè)性更強(qiáng),內(nèi)容更加豐富[4]。
1.2 常見的爬蟲框架
1.2.1 Selenium
Selenium是一個(gè)可操縱瀏覽器實(shí)行自動(dòng)化測(cè)試的框架??梢酝ㄟ^簡(jiǎn)單的指令控制瀏覽器自動(dòng)化運(yùn)行,如同真實(shí)用戶在操作一般,比如輸入驗(yàn)證碼。Selenium是自動(dòng)化測(cè)試工具,支持各種瀏覽器,包括 Chrome、Safari、Firefox等主流界面式瀏覽器。因此可用來(lái)爬取任何網(wǎng)頁(yè)上看到的任何數(shù)據(jù)信息,且?guī)缀蹩梢员荛_絕大部分反爬蟲監(jiān)控[5]。
1.2.2 Json 接口
Json(JavaScript Object Notation,JS對(duì)象標(biāo)記)是一種輕量級(jí)的數(shù)據(jù)交換格式。它使用不同于編程語(yǔ)言的特殊的文本格式來(lái)進(jìn)行保存數(shù)據(jù)和傳遞數(shù)據(jù)的操作。簡(jiǎn)潔明了、清晰易懂的層次結(jié)構(gòu)使得Json成為理想的數(shù)據(jù)交換語(yǔ)言。更容易人們讀取和編寫、機(jī)器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效率。Json文本格式具有兼容性非常高、有相似于C語(yǔ)言體系的習(xí)性行為、獨(dú)立于其他編程語(yǔ)言等特點(diǎn)。這些特性使Json成為理想的數(shù)據(jù)交換語(yǔ)言[6],并用于提供json數(shù)據(jù)接口的網(wǎng)頁(yè)進(jìn)行數(shù)據(jù)采集。
1.2.3 Scrapy
Scrapy是一個(gè)通過Python實(shí)現(xiàn)的爬蟲框架,架構(gòu)清晰,模塊之間的耦合程度相對(duì)較低,而且可擴(kuò)展性也比較強(qiáng),能夠靈活完成各種需求,具有使用簡(jiǎn)單、代碼量小、可維護(hù)性好等特點(diǎn)[7]。Scrapy框架不僅能夠通過抓取網(wǎng)頁(yè)來(lái)獲取數(shù)據(jù),還可以通過訪問API接口獲取其他對(duì)應(yīng)的數(shù)據(jù),實(shí)現(xiàn)對(duì)web資源多層次、快速的抓取,被應(yīng)用于各類網(wǎng)站的抓取工作,提取其中有價(jià)值的結(jié)構(gòu)數(shù)據(jù)[8]。
2? 數(shù)據(jù)采集
本次數(shù)據(jù)采集基于網(wǎng)絡(luò)社交平臺(tái)——新浪微博,采集的具體評(píng)論數(shù)據(jù)是https://weibo.com/1792951112/K3S5HcgZi?filter=hot&root_comment_id=0&type=comment#_rnd1619007657759 博文下的用戶評(píng)論。通過該博文的評(píng)論數(shù)目可以看出該博文下的評(píng)論數(shù)據(jù)非常多,已經(jīng)達(dá)到了百萬(wàn)級(jí)別的評(píng)論數(shù)據(jù)。接下來(lái)會(huì)采用爬蟲將其數(shù)據(jù)捕獲下來(lái),并做一些分析。
根據(jù)采集的數(shù)據(jù)特性,以下選用增量式爬蟲和Deep Web爬蟲技術(shù)、selenium框架和json數(shù)據(jù)接口,分別對(duì)該微博評(píng)論數(shù)據(jù)進(jìn)行采集。
2.1 使用Selenium框架采集數(shù)據(jù)
Selenium爬取評(píng)論的基本步驟如圖1所示。
首先要獲取其網(wǎng)頁(yè)源代碼(在網(wǎng)站上按F12查看),然后根據(jù)其源碼構(gòu)造dom樹如圖2所示。
接下來(lái)就可以運(yùn)用XPath解析dom樹,并根據(jù)相關(guān)的結(jié)點(diǎn)進(jìn)行數(shù)據(jù)爬取,部分代碼如下所示。
user_data = requests.get(i)
dom_url = etree.HTML(user_data.text,etree.HTMLParser(encoding='utf-8'))
follow = dom_url.xpath('//div[@class="WB_innerwrap"]//strong[@class="W_f18"][1]/text()')
fan = dom_url.xpath('//div[@class="WB_innerwrap"]//strong[@class="W_f18"][2]/text()')
boke = dom_url.xpath('//div[@class="WB_innerwrap"]//strong[@class="W_f18"][3]/text()')
數(shù)據(jù)爬取完成之后可以選擇保存在xml、csv、txt等文本文件,這里選擇保存在csv文件中。
2.2 采用Json數(shù)據(jù)接口采集數(shù)據(jù)
與Selenium不同,Json數(shù)據(jù)接口可以相對(duì)直接獲取數(shù)據(jù),因?yàn)槠鋽?shù)據(jù)的組成結(jié)構(gòu)是Json的格式,不過需要找到數(shù)據(jù)的接口。
因?yàn)槲⒉┑木W(wǎng)頁(yè)版是不提供數(shù)據(jù)接口且反爬機(jī)制較先進(jìn),所以這里選用手機(jī)端的微博,手機(jī)端的微博的用戶評(píng)論是瀑布流式刷新的并且提供了Json的數(shù)據(jù)接口,例如其中一個(gè)接口:https://m.weibo.cn/comments/hotflow?id=4609229132925240&mid=4609229132925240&max_id_type=0, 其結(jié)構(gòu)如下所示。
{ok: 1, data: {data: [,…], total_number: "100萬(wàn)+",…}}
data: {data: [,…], total_number: "100萬(wàn)+",…}
data: [,…]
0: {created_at: "Sat Feb 27 15:09:20 +0800 2021", id: "4609230964787737", rootid: "4609230964787737",…}
1: {created_at: "Sat Feb 27 15:04:59 +0800 2021", id: "4609229871121970", rootid: "4609229871121970",…}
…..
18: {created_at: "Sat Feb 27 15:05:08 +0800 2021", id: "4609229908872568", rootid: "4609229908872568",…}
max: 50000
max_id: 45846235480040570
max_id_type: 0
status: {comment_manage_info: {comment_permission_type: -1, approval_comment_type: 0}}
total_number: "100萬(wàn)+"
ok: 1
在此結(jié)構(gòu)下獲取其用戶評(píng)論較為直接,不過一個(gè)Json數(shù)據(jù)接口通常只能提供10×19條用戶評(píng)論,所以需要重新獲取下一個(gè)接口。由于手機(jī)端的微博是瀑布流式刷新用戶評(píng)論的,所以可以直接控制頁(yè)面往下拉刷新就可獲取下一個(gè)Json數(shù)據(jù)接口。觀察其數(shù)據(jù)接口鏈接可得知鏈接之中只有max_id和max_id_type會(huì)發(fā)生變化,因此通過多個(gè)Json數(shù)據(jù)鏈接可得出規(guī)律,下一個(gè)鏈接的max_id是上一個(gè)鏈接的Json字典里的max_id(json結(jié)構(gòu)的倒數(shù)第六行),而max_id_type是在0和1兩個(gè)值之間取值。這個(gè)先用0判斷一下Json返回值的ok是否為1就可以判斷,若是max_id_type就取0,否則取1,部分代碼實(shí)現(xiàn)如下所示。
while (i < count):
while_starttime = datetime.datetime.now()
try:
if i == 0:
r = requests.get(one, headers=headers)
else:
b = '&max_id_type=0'
urlll = a + str(id) + b
r = requests.get(urlll, headers=headers)
flag = r.json()
flag1 = r.json()['ok']
if flag1 == 0:
b = '&max_id_type=1'
urlll = a + str(id) + b
r = requests.get(urlll, headers=headers)
js = r.json()
users = js['data']['data']
接下來(lái)就是對(duì)Json數(shù)據(jù)進(jìn)行分解獲取,得到的數(shù)據(jù)同樣可以保存為xml表格、csv文件、txt文本文件等。
2.3 采集結(jié)果
兩種方法爬取的結(jié)果,都包含用戶id(用戶的唯一標(biāo)識(shí))、用戶名、評(píng)論時(shí)間、評(píng)論內(nèi)容、評(píng)論獲贊數(shù)等,本次爬取共獲取了6000多條數(shù)據(jù),可以為接下來(lái)的用戶評(píng)論的數(shù)據(jù)挖掘提供較大的數(shù)據(jù)量,結(jié)果如圖3所示。
3? 結(jié)語(yǔ)
本文使用兩種方法,均采用深度優(yōu)先的搜索,獲取微博用戶評(píng)論數(shù)據(jù)。Selenium框架是先對(duì)網(wǎng)頁(yè)源代碼進(jìn)行解析,生成dom樹,再通過dom樹來(lái)獲取其中的用戶評(píng)論數(shù)據(jù)。Json數(shù)據(jù)接口則是通過對(duì)Json數(shù)據(jù)結(jié)構(gòu)的解析,直接獲取微博用戶的評(píng)論數(shù)據(jù)。實(shí)驗(yàn)中,使用兩種方法對(duì)微博某一熱點(diǎn)事件下用戶評(píng)論數(shù)據(jù)的采集,都取得不錯(cuò)的結(jié)果。
兩種數(shù)據(jù)采集方法各有優(yōu)缺點(diǎn)。Selenium可以模擬真實(shí)人的行為進(jìn)行抓取數(shù)據(jù),基本不受網(wǎng)頁(yè)的限制,但前期過程會(huì)較為繁瑣且爬取的效率不太高。Json數(shù)據(jù)接口直接簡(jiǎn)單,但獲取數(shù)據(jù)需要詳細(xì)的尋找出隱藏的接口位置,有時(shí)還需要尋找下一個(gè)接口并總結(jié)其鏈接規(guī)律,還有就是部分網(wǎng)站不提供數(shù)據(jù)接口。在實(shí)際操作可以根據(jù)具體需求,結(jié)合這兩種技術(shù)的優(yōu)缺點(diǎn)來(lái)選取其中一種方法。
參考文獻(xiàn)
[1] 曾健榮,張仰森,鄭佳,等.面向多數(shù)據(jù)源的網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)技術(shù)及應(yīng)用[J].計(jì)算機(jī)科學(xué),2019,46(5):304-309.
[2] Guo S, Bian W, Liu Y, et al. Research on the application of SVM-based focused crawler for space intelligence collection[J]. Electronic Design Engineering,2016,24(17):28-34
[3] 葉婷.基于關(guān)鍵詞的微博爬蟲系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].杭州:浙江工 業(yè)大學(xué),2016.
[4] 楊曉夫.汽車票務(wù)DeepWeb數(shù)據(jù)采集關(guān)鍵技術(shù)研究[D].重慶:重慶交通大學(xué),2016.
[5] 呂博慶.基于爬蟲與數(shù)據(jù)挖掘的電商頁(yè)面信息分析[D].蘭州:蘭州大學(xué),2018.
[6] 陳哲.基于微博熱點(diǎn)事件的可視化系統(tǒng)的開發(fā)與實(shí)現(xiàn)[D].北京:首都經(jīng)濟(jì)貿(mào)易大學(xué),2018.
[7] 孫瑜.基于Scrapy框架的網(wǎng)絡(luò)爬蟲系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京交通大學(xué),2019.
[8] 崔新宇.基于情感分析的商品評(píng)價(jià)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].邯鄲:河北工程大學(xué),2020.