科學蹭熱點:用python獲取熱門微博評論並進行情感分析

在我埋頭學習mysql、scrapy、django準備下一波吹水的時候,有人說,你去爬下老薛的微博呀,還能蹭個熱點,這讓勤(mo)奮(mo)學(kou)習(jiao)的我停下了寄幾敲代碼的手。

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

然後我趕緊去關注了一下最近老薛的新聞…在感受了劇情的複雜和案情的撲朔迷離之後…我默默地學習瞭如何閱讀合同…如何利用ELA分析圖片…如何寫作文…如何查別人的銀行流水…知識點有點多…讓我緩一會…

所以呢,這次的主題是分析老薛最新微博的評論,分析評論粉絲們的心情狀態,且聽我娓娓道來。

1.新浪微博API

在經歷了幾次爬蟲被禁的悲痛(真的很痛)之後,我學會了在爬網站之前先查有沒有API的“優良”習慣。新浪作為一個大廠,怎麼會不推出新浪微博API呢,面向開發者新浪有自己的開放平臺,這裡就不講python調用微博API的方法了,下面是通過登錄App_key和App_secret方式訪問微博API的代碼,代碼是基於Python2的。Python3對weibo模塊使用存在一定問題。

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

知道如何登錄API了,辣麼如何調用API爬單條微博的評論呢?一行代碼搞定。

r = client.comments.show.get(id = 4154417035431509,count = 200,page = 1)

所有關於單條微博的評論信息都在r.comments中了,這裡需要對照微博API文檔,微博API有聲明調用微博評論API需要獲取用戶授權,但是捏~只要知道單條微博的id,就可以調用這個API了,關於單條微博的id如何獲取在後面會說(小聲一點,千萬別讓微博知道,萬一封了呢)。

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

按照client.接口名.get(請求參數)的方式獲取API,獲取API後的規格可在接口詳情中查看,文檔中有給出返回結果的示例。

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

文檔中也給出了關鍵數據的json接口名稱。

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

如果我們要獲取微博評論的內容,只需要調用text接口即可

for st in r.comments:

text = st.text

2.微博爬蟲

通過調用新浪微博API的方式,我們就可以簡單獲取單條微博的評論信息了,為啥說簡單呢,因為人紅信息貴啊!你以為大V的微博就這麼免費的給你API調用了嗎,非認證應用開發者單日只能請求幾千次API,這對像老薛這樣單條微博幾十萬評論的大V來說…太少了(TT)

所以捏,還是要寫微博爬蟲。

正所謂,知己知彼百戰不殆,新浪作為大廠,怎麼說也是身經百戰,必定是經歷了無數場爬蟲與反爬之間的戰爭,必然有著健全的反爬策略。正所謂,強敵面前,繞道而行,有位大佬說得好,爬網站,先爬移動端

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

登錄微博後,進入到老薛回應P圖事件的微博中去,_(:зゝ∠)_老薛啊,怪我,怪我來得太晚了,點進去的時候已經有70w+的評論了(截止至發文當天已經100w+的評論了),可以看到安靜的微博下粉絲們不安的心…

移動端微博的網址顯得肥腸簡單,不似PC端那麼複雜而不明邏輯:https://m.weibo.cn/status/4154417035431509

從xhr文件中可以得知熱門評論的變化規律是:

'https://m.weibo.cn/single/rcList?format=cards&id=' + 單條微博id + '&type=comment&hot=1&page=' + 頁碼

最新評論的變化規律是:

'https://m.weibo.cn/api/comments/show?id=' + 單條微博id + '&page=' + 頁碼

打開https://m.weibo.cn/single/rcList?format=cards&id=4154417035431509&type=comment&hot=1&page=1 就可以看到熱門評論的json文件。

接下來就是套路了,偽裝瀏覽器header,讀取json文件,遍歷每一頁…這都不是重點!而且這些我以前都講過~直接上代碼~這裡開始是Python3的代碼了~

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

這裡有幾點說明:

  1. 設置爬取間隔時間之後,微博爬蟲被禁的概率降低了很多(特別是晚上)

  2. 新浪每次返回的json數據條數隨機,所以翻頁之後會出現數據重複的情況,所以用到了數據去重,這會在後面說。

  3. 在text和source中添加了去除emoji表情的代碼(折騰了很久寫不進數據庫,差點就從刪庫到跑路了/(ㄒoㄒ)/),同時也去除了摻雜其中的回覆他人的html代碼。

  4. 我只寫了讀取數據,沒有寫如何保存,因為我們要用到數!據!庫!辣!(這是重點!敲黑板)

  5. python中數據庫的讀取與寫入

雖然微博爬蟲大大提高了數據獲取量,但也因為是爬蟲而容易被新浪封禁。這裡結束循環的判斷是網絡狀態不是200,但當微博發現是爬蟲時,微博會返回一個網頁,網頁中什麼實質內容都木有,這時候程序就會報錯,而之前爬到的數據,就啥也沒有了。

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

但是如果爬一會,保存一次數據,這數據量要一大起來…冷冷的文件在猿臉上胡亂地拍…我的心就像被…這時候我們就需要用到數據庫了。

數據庫,顧名思義,就是存放數據的倉庫,數據庫作為一個發展了60多年的管理系統,有著龐大的應用領域和複雜的功能……好了我編不下去了。

在本文中,數據庫的主要作用是AI式的excel表格

(●—●)。在爬蟲進行的過程中,爬到一個數就存進去,爬到一個數就存進去,即使爬蟲程序運行中斷,中斷前爬到的數據都會存放在數據庫中。

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

大多數數據庫都能與python對接使用的,我知道的有mysql、sqlite、mongodb、redis。這裡用的是mysql,mac上mysql的安裝,管理數據庫的軟件Navicat使用幫助,其他系統自己找吧,安裝使用過程中有啥問題,請不要來找我(溜之大吉)根據上面的代碼,在navicat中創建數據庫、表和域以及域的格式。在Python程序中添加代碼。

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

運行python程序,大概爬了2w條實時評論,不得不說新浪微博的反爬還是很強大的,有兩個解決方法:更換IP和切換賬號,IP代理的使用方法我以前有寫過,賬號可以在某寶上購買,但是!_(:зゝ∠)_由於本文的作者是一個灰常貧窮灰常摳門並且身患重病(懶癌)的人……2w條數據也是有研究價值的對不對(((;꒪ꈊ꒪;))),不如我們就這樣繼續我們研究吧(((;꒪ꈊ꒪;)))……

在進行下一步研究之前,我們還要將數據庫中的內容讀取出來,python中數據庫的讀取代碼也很簡單。

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

這樣之前爬取的信息就被讀取出來了,但是前面也說了,微博爬蟲翻頁時返回數據條數隨機,所以會出現重複的狀況,所以讀取之後,需要用if語句進行一個數據去重

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

4.自然語言處理

自然語言處理是人工智能的一個領域,可以通過算法的設計讓機器理解人類語言,自然語言也屬於人工智能中較為困難的一環,像中文這麼博大精深、變幻莫測的語言更是NLP中的一大難點,python中有很多NLP相關的模塊,有興趣的盆友可以通過用python實現簡單的文本情感分析初探NLP。

我參(ban)考(yun)了一些現成的情感分析算法,對爬取的評論進行分析,錯誤率灰常高_(:зゝ∠)_,這可腫麼辦?難道要重新設計算法?我彷彿遇到了人生中第一個因為語文沒學好而引發的重大問題……

當然像我這樣靈(lan)活(duo)的姑娘,自然是很快發現了python中較為出名的一箇中文NLP庫:snowNLP。snowNLP調用的方法比較簡單,源碼中詳細解釋了調用方法和生成結果

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

這段代碼中獲取了讀取數據庫後由評論主體text生成的列表文件,並依次對每一個評論進行情感值分析。snowNLP能夠根據給出的句子生成一個0到1之間的值,當值大於0.5時,代表句子的情感極性偏向積極,當分值小於0.5時,情感極性偏向消極,當然越偏向倆頭,情緒越明顯咯,讓我們來看看測試評論的結果。

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

第一條:噁心 呸 給出了0.01的分值,最後一條:力挺薛之謙 給出了0.99的分值。看其他幾句基本符合語境的態度,當需要評測單個商品的評價態度時就可以使用snowNLP。但是由於老薛的評論中涉及到三個人,他自己,李雨桐,高磊鑫,算法無法判斷評論是關於誰的情感值,又因為微博評論可以粉絲之間互相回覆,這讓判斷評論的主體是誰更加撲朔迷離(機器表示我學習不能啊…)。

這好像代表了,本次分析的結果將…並沒有什麼卵用。發生這種事情,我也不想的…做人呢…最重要的是要開心…我不會寫算法啊,我語文也不好啊,我真的做不到啊(๑°⌓°๑)…

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

5.分析結果

本次分析的目的愉快的從分析粉絲們對待薛之謙事件的情緒變成了單純分析粉絲們的情緒(●—●)。

plt.hist(sentimentslist,bins=np.arange(0,1,0.02))

plt.show()

對上節經過處理得到的情感值列表進行統計,並生成分佈圖。下圖數據採集時間9月27日19時,採集評論2w條。

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

我還順便(真的是順便,正經臉)爬了李雨桐將網友轉賬捐款的微博的2w條評論。

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

我又順順便(真的順便,看我真誠的眼神)爬了陳赫出軌時發表我錯了博文的微博評論。

科學蹭熱點:用python獲取熱門微博評論並進行情感分析

根據這三張圖,可以看到情感值在接近0、1兩端以及0.5左右位置頻率較高,說明粉絲們對於此類事件的情緒無論是積極還是消極都是比較明顯的。但也可以從圖片中看到一些微妙的差別,老薛的微博中情感值接近1的數量高於接近0的數量,但都沒有超過700,李雨桐微博中情感值接近1的數量遠低於接近0的數量,甚至接近0的數目到達了1000以上,但二者都超過了700,而陳赫的微博分析結果,倆者則都接近800。由於算法存在一定誤差,不代表真實評論結果,我就不再多分析了(你們懂的)。


分享到:


相關文章: