黃紅桃 江盈鋒


摘? 要:微博的熱點事件會產生大量評論數據,這些數據是進行輿情分析和網絡水軍識別等數據挖掘的基礎。論文分析對比常用的網絡爬蟲技術和框架,分別使用Selenium框架和Json數據接口兩種方法,采集新浪微博熱點事件下的用戶評論數據。一般網絡爬蟲技術多使用廣度搜索,這里采用深度搜索,能夠更精確地獲得某個熱點事件下的用戶評論數據。
關鍵詞:數據挖掘? 微博? 用戶評論? 網絡爬蟲? Selenium? Json
中圖分類號:TP393.09;TP274.2? ? ? ? ?文獻標識碼:A文章編號: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
根據2021年2月發布的第47次《中國互聯網絡發展狀況統計報告》,截至2020年12月,我國網民規模達9.89億,較2020年3月增長8540萬,互聯網普及率達70.4%,較2020年3月提升5.9個百分點。截至2020年12月,我國手機網民規模達9.86億,較2020年3月增長8885萬,網民使用手機上網的比例達99.7%,較2020年3月提升0.4個百分點。數據表明我國的網民基數很大,并且網民使用手機上網的比例非常高。這就使得網民進入網絡的社區交流平臺(如微博、知乎)進行交流的門檻變低,機會變多。很多的網民包括不少網絡水軍在熱點事件中參與了評論,使得這些事件產生大量數據。
新浪微博是國內的用戶量極大、活躍度也很高的網絡社交平臺。一次熱點事件常常會有數以萬計、十萬計甚至百萬以上的評論數據。這些數據是進行輿情分析,網絡水軍識別等數據挖掘的基礎。
論文研究相關的網絡爬蟲技術,并以此來對用戶評論數據進行批量、自動化地采集。
1? 相關技術
1.1 爬蟲技術的類別
爬蟲技術具有如下的一些分類。
1.1.1 通用網絡爬蟲
通用網絡爬蟲又稱全網爬蟲(Scalable Web Crawler)[1],爬行對象從一些種子URL擴充到整個 Web,主要為門戶站點搜索引擎和大型Web服務提供商采集數據。由通用網絡爬蟲的結構大致可以分為頁面爬行模塊、頁面分析模塊、鏈接過濾模塊、頁面數據庫、URL隊列初始URL集合幾個部分。通用式爬蟲多用于廣度搜索優先策略。
1.1.2 聚焦網絡爬蟲
聚焦網絡爬蟲(Focused Crawler),又稱主題網絡爬蟲(Topical Crawler)[2],是指選擇性地爬行那些與預先定義好的主題相關頁面的網絡爬蟲。和通用網絡爬蟲相比,聚焦爬蟲只需要爬行與主題相關的頁面,極大地節省了硬件和網絡資源,保存的頁面也由于數量少而更新快,還可以很好地滿足一些特定人群對特定領域信息的需求。聚焦網絡爬蟲和通用網絡爬蟲相比,增加了鏈接評價模塊及內容評價模塊。聚焦爬蟲爬行策略實現的關鍵是評價頁面內容和鏈接的重要性,不同的方法計算出的重要性不同,由此導致鏈接的訪問順序也不同。
1.1.3 增量式爬蟲
增量式網絡爬蟲指的是對已經爬取過的網頁不再進行爬取,只爬取新產生的網頁,即增量式更新。與其他類型的網絡爬蟲相比,只關注新增的數據,網頁的下載量大大減少,降低了爬蟲的存儲空間與網絡帶寬的消耗,但是增加量抓取算法的復雜度和實現的難度[3]。
1.1.4 Deep Web爬蟲
從網頁在網站上呈現的不同的位置結構的角度來分析,可簡單將網頁分為淺層態網頁與深層態網頁。深層態網頁是指那些不能被通用搜索引擎所搜錄的存儲在web數據庫中的態網頁,其通常需要一定條件才能獲取(如登錄)。相對深層態網頁而言,淺層態網頁是指web上被搜索引擎搜錄的淺層態網頁。Deep Web往往具有較強的主題性,各Deep Web主題領域中蘊含的數信息專業性更強,內容更加豐富[4]。
1.2 常見的爬蟲框架
1.2.1 Selenium
Selenium是一個可操縱瀏覽器實行自動化測試的框架。可以通過簡單的指令控制瀏覽器自動化運行,如同真實用戶在操作一般,比如輸入驗證碼。Selenium是自動化測試工具,支持各種瀏覽器,包括 Chrome、Safari、Firefox等主流界面式瀏覽器。因此可用來爬取任何網頁上看到的任何數據信息,且幾乎可以避開絕大部分反爬蟲監控[5]。
1.2.2 Json 接口
Json(JavaScript Object Notation,JS對象標記)是一種輕量級的數據交換格式。它使用不同于編程語言的特殊的文本格式來進行保存數據和傳遞數據的操作。簡潔明了、清晰易懂的層次結構使得Json成為理想的數據交換語言。更容易人們讀取和編寫、機器解析和生成,并有效地提升網絡傳輸效率。Json文本格式具有兼容性非常高、有相似于C語言體系的習性行為、獨立于其他編程語言等特點。這些特性使Json成為理想的數據交換語言[6],并用于提供json數據接口的網頁進行數據采集。
1.2.3 Scrapy
Scrapy是一個通過Python實現的爬蟲框架,架構清晰,模塊之間的耦合程度相對較低,而且可擴展性也比較強,能夠靈活完成各種需求,具有使用簡單、代碼量小、可維護性好等特點[7]。Scrapy框架不僅能夠通過抓取網頁來獲取數據,還可以通過訪問API接口獲取其他對應的數據,實現對web資源多層次、快速的抓取,被應用于各類網站的抓取工作,提取其中有價值的結構數據[8]。
2? 數據采集
本次數據采集基于網絡社交平臺——新浪微博,采集的具體評論數據是https://weibo.com/1792951112/K3S5HcgZi?filter=hot&root_comment_id=0&type=comment#_rnd1619007657759 博文下的用戶評論。通過該博文的評論數目可以看出該博文下的評論數據非常多,已經達到了百萬級別的評論數據。接下來會采用爬蟲將其數據捕獲下來,并做一些分析。
根據采集的數據特性,以下選用增量式爬蟲和Deep Web爬蟲技術、selenium框架和json數據接口,分別對該微博評論數據進行采集。
2.1 使用Selenium框架采集數據
Selenium爬取評論的基本步驟如圖1所示。
首先要獲取其網頁源代碼(在網站上按F12查看),然后根據其源碼構造dom樹如圖2所示。
接下來就可以運用XPath解析dom樹,并根據相關的結點進行數據爬取,部分代碼如下所示。
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()')
數據爬取完成之后可以選擇保存在xml、csv、txt等文本文件,這里選擇保存在csv文件中。
2.2 采用Json數據接口采集數據
與Selenium不同,Json數據接口可以相對直接獲取數據,因為其數據的組成結構是Json的格式,不過需要找到數據的接口。
因為微博的網頁版是不提供數據接口且反爬機制較先進,所以這里選用手機端的微博,手機端的微博的用戶評論是瀑布流式刷新的并且提供了Json的數據接口,例如其中一個接口:https://m.weibo.cn/comments/hotflow?id=4609229132925240&mid=4609229132925240&max_id_type=0, 其結構如下所示。
{ok: 1, data: {data: [,…], total_number: "100萬+",…}}
data: {data: [,…], total_number: "100萬+",…}
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萬+"
ok: 1
在此結構下獲取其用戶評論較為直接,不過一個Json數據接口通常只能提供10×19條用戶評論,所以需要重新獲取下一個接口。由于手機端的微博是瀑布流式刷新用戶評論的,所以可以直接控制頁面往下拉刷新就可獲取下一個Json數據接口。觀察其數據接口鏈接可得知鏈接之中只有max_id和max_id_type會發生變化,因此通過多個Json數據鏈接可得出規律,下一個鏈接的max_id是上一個鏈接的Json字典里的max_id(json結構的倒數第六行),而max_id_type是在0和1兩個值之間取值。這個先用0判斷一下Json返回值的ok是否為1就可以判斷,若是max_id_type就取0,否則取1,部分代碼實現如下所示。
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']
接下來就是對Json數據進行分解獲取,得到的數據同樣可以保存為xml表格、csv文件、txt文本文件等。
2.3 采集結果
兩種方法爬取的結果,都包含用戶id(用戶的唯一標識)、用戶名、評論時間、評論內容、評論獲贊數等,本次爬取共獲取了6000多條數據,可以為接下來的用戶評論的數據挖掘提供較大的數據量,結果如圖3所示。
3? 結語
本文使用兩種方法,均采用深度優先的搜索,獲取微博用戶評論數據。Selenium框架是先對網頁源代碼進行解析,生成dom樹,再通過dom樹來獲取其中的用戶評論數據。Json數據接口則是通過對Json數據結構的解析,直接獲取微博用戶的評論數據。實驗中,使用兩種方法對微博某一熱點事件下用戶評論數據的采集,都取得不錯的結果。
兩種數據采集方法各有優缺點。Selenium可以模擬真實人的行為進行抓取數據,基本不受網頁的限制,但前期過程會較為繁瑣且爬取的效率不太高。Json數據接口直接簡單,但獲取數據需要詳細的尋找出隱藏的接口位置,有時還需要尋找下一個接口并總結其鏈接規律,還有就是部分網站不提供數據接口。在實際操作可以根據具體需求,結合這兩種技術的優缺點來選取其中一種方法。
參考文獻
[1] 曾健榮,張仰森,鄭佳,等.面向多數據源的網絡爬蟲實現技術及應用[J].計算機科學,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] 葉婷.基于關鍵詞的微博爬蟲系統的設計與實現[D].杭州:浙江工 業大學,2016.
[4] 楊曉夫.汽車票務DeepWeb數據采集關鍵技術研究[D].重慶:重慶交通大學,2016.
[5] 呂博慶.基于爬蟲與數據挖掘的電商頁面信息分析[D].蘭州:蘭州大學,2018.
[6] 陳哲.基于微博熱點事件的可視化系統的開發與實現[D].北京:首都經濟貿易大學,2018.
[7] 孫瑜.基于Scrapy框架的網絡爬蟲系統的設計與實現[D].北京:北京交通大學,2019.
[8] 崔新宇.基于情感分析的商品評價系統設計與實現[D].邯鄲:河北工程大學,2020.