EDG奪冠!用Python分析22.3萬條數據:粉絲都瘋了!


原創不易,本文禁止抄襲,轉載,違權必究!

一、EDG奪冠信息

11月6日,在英雄聯盟總決賽中,EDG戰隊以3:2戰勝韓國隊,獲得2021年英雄聯盟全球總決賽冠軍,這個比賽在全網各大平台也是備受矚目:

 

1、微博熱搜第一名,截止2021-11-10已有億級觀看量,微博粉絲數到達638.4萬

 

2、嗶哩嗶哩已有幾億人氣,總彈幕有22.3萬,全站排行榜最高第2名,B站粉絲已有219.9萬

 

 

 

3、騰訊愛奇藝優酷等視頻平台800萬人看過

 

4、虎牙等直播平台熱度也是居高不下

 

5、央視新聞也發微博慶祝EDG奪冠

 

 

 

 

既然比賽熱度這么高,那么本次我們就以bilibili為基准,通過采集EDG奪冠比賽視頻在嗶哩嗶哩的22.3萬條彈幕數據,再通過Python來分析進而感受粉絲的熱情

 


 

二、實戰目標 

2.1 網絡爬蟲

利用爬蟲技術抓取EDG戰隊在B站奪冠比賽視頻的22.3萬條彈幕數據

 

2.2 數據可視化

通過jieba、numpy等Python庫對抓取來的彈幕數據進行分析並且可視化

 

 

2.3 自然語言處理(情感分析)

利用pandas+自然語言處理(NLP)等對EDG奪冠比賽視頻的彈幕數據進行情感分析,根據分析結果得出一些結論

 

 

 

 

 

 

 

 

 


 

三、bilibili接口分析 

首先進入EDG奪冠比賽視頻URL:

https://www.bilibili.com/video/BV1EP4y1j7kV?p=1

 

嗶哩嗶哩已為大家整理好了EDG比賽視頻,從開幕式到奪冠時刻,共有7個視頻

 

嗶哩嗶哩彈幕數據接口:

http://api.bilibili.com/x/v1/dm/list.so?oid=XXX

這個接口就是B站彈幕數據專用接口,我們可以直接拿來用,這個接口中的oid可以理解為每個視頻中的唯一標識符,它由數字組成,每一個視頻都有唯一的一個oid,那么我們只要找到oid就可以請求相應比賽視頻彈幕的API接口,從而抓取彈幕數據

 

獲取oid

打開開發者工具,切換到Network選項,然后找到以pagelist為開頭的請求接口

 

 

接着找到Request URL這個請求接口,打開新窗口直接用這個API接口請求,如下圖:

 

當我們直接請求這個API接口時可以看到JSON格式的數據,而在里面的cid就是我們需要的oid,如下所示:

1 {"code":0,"message":"0","ttl":1,"data":[{"cid":437586584,"page":1,"from":"vupload","part":"第一局 4K","duration":2952,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}},{"cid":437626309,"page":2,"from":"vupload","part":"第二局 4K","duration":3031,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}},{"cid":437659159,"page":3,"from":"vupload","part":"第三局 4K","duration":3406,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}},{"cid":437727348,"page":4,"from":"vupload","part":"第四局 4K","duration":3212,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}},{"cid":437729555,"page":5,"from":"vupload","part":"第五局 4K","duration":3478,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}},{"cid":437550300,"page":6,"from":"vupload","part":"開幕式","duration":984,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}},{"cid":437717574,"page":7,"from":"vupload","part":"奪冠時刻","duration":2017,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}}]

 

當然我們也可以點擊Preview選項,點擊data,打開數據,而里面的JSON數據是折疊的,包括cid在內,如下圖所示:

 

可以看到,每個cid對應每一個比賽視頻。我們也可以點擊Response選項,里面的數據是真實的數據,意味着數據沒有經過折疊,與直接請求Request URL返回的JSON數據是一樣的

 


 

 四、編碼 

4.1 爬取數據

定義一個獲取cid的方法

 1 import requests
 2 import json
 3 
 4 
 5 def get_cid():
 6   url = 'https://api.bilibili.com/x/player/pagelist?bvid=BV1EP4y1j7kV&jsonp=jsonp'
 7   try:
 8     response = requests.get(url,timeout=None)
 9     if response is not None:
10       return response.text
11     else:
12       return Nnone
13   except Exception as e:
14     print(e.args)
15 
16 
17 if __name__ == '__main__':
18   data = get_cid()
19   json_data = json.loads(data)
20   for cid_datas in json_data['data']:
21     cid = cid_datas.get('cid')
22     print(cid)

 

控制台輸出如下:

 

拼接URL彈幕數據API接口

1 if __name__ == '__main__':
2   data = get_cid()
3   json_data = json.loads(data)
4   base_api = 'http://api.bilibili.com/x/v1/dm/list.so?oid='
5   for cid_datas in json_data['data']:
6     cid = cid_datas.get('cid')
7     detail_api = base_api + str(cid)
8     print(detail_api)

 

控制台輸出如下:

 

一共有7個網址,對應7個EDG比賽視頻的彈幕數據,我們點開第一個網址查看

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

抓取彈幕數據

從上一張圖可以看到,每一條彈幕數據都在每一個<d>標簽中,面對這種格式我們思考一下用哪種解析工具比較合適?答案當然是正則表達式,接下來我們要獲取7個比賽視頻的22.3萬條數據,代碼如下:

 1 base_api = 'http://api.bilibili.com/x/v1/dm/list.so?oid='
 2   all_api = []
 3   for cid_datas in json_data['data']:
 4     cid = cid_datas.get('cid')
 5     detail_api = base_api + str(cid)
 6     all_api.append(detail_api)
 7   for api in all_api:
 8     edg_datas = get_api_data(detail_api)
 9     edg_datas = re.findall('<d.*?>(.*?)</d>',edg_datas,re.S)
10     with open('EDG.txt','a',encoding='utf-8') as f:
11       for edg_data in edg_datas:
12         print(edg_data)
13         f.write(edg_data + '\n')

 

避免亂碼,加上如下代碼:

1 response.encoding = chardet.detect(response.content)['encoding']

 

控制台輸出如下:

 

由於彈幕數據共有22.3萬條,這里僅展示EDG.txt部分彈幕數據,如下圖所示:

 

4.2 數據可視化(詞雲圖)

詞雲圖制作

我們已經抓取到彈幕數據,接下來利用EDG背景圖做一個詞雲圖

 

代碼如下:

 1 import jieba
 2 from wordcloud import WordCloud
 3 import matplotlib.pyplot as plt
 4 from PIL import Image
 5 import numpy as np
 6 
 7 def do_wordcloud():
 8   text = open('EDG.txt','r',encoding='utf-8').read()
 9   text = text.replace('\n','').replace('\u3000','')
10   text_cut = jieba.lcut(text)
11   text_cut = ' '.join(text_cut)
12 
13   #過濾一些沒有關系的詞
14   stop_words = ['','',' ','','','','','','','','','','','','我們']
15 
16   background = Image.open("EDG.jpg")
17   graph = np.array(background)
18 
19   word_cloud = WordCloud(font_path='simsun.ttc', 
20                          background_color='white', 
21                          mask=graph, # 指定詞雲的形狀
22                          stopwords=stop_words) 
23 
24   word_cloud.generate(text_cut)
25   plt.subplots(figsize=(12,8))
26   plt.imshow(word_cloud)
27   plt.axis('off')
28   plt.show()
29   word_cloud.to_file('edg.png')

 

控制台輸出如下:

 

迪迦奧特曼背景圖片也制作一波吧,哈哈哈!

 

制作成迪迦奧特曼詞雲圖形狀,如下所示:

 

當然你也可以使用pyecharts/echarts制作也行,還可以制作成你喜歡的圖片形狀。如果你接觸過情感分析的話,也可以用這些彈幕數據分析一波

 


 

五、自然語言處理(NLP)

5.1 數據導入

1 data = pd.read_csv('EDG.csv')
2 data = data.head()
3 print(data)

 

控制台輸出:

 

5.2 數據預處理

1 data = pd.read_csv('EDG.csv')
2 data = data[['id','content']]
3 data = data.head(10)
4 print(data)

 

控制台輸出:

 

5.3 情感分析

先安裝一下用於情感分析的Python庫:

1 pip install snownlp -i https://pypi.doubanio.com/simple

 

效果如下:

 

情感分析

1 from snownlp import SnowNLP
2 data1['emotion'] = data1['content'].apply(lambda x:SnowNLP(x).sentiments)
3 data1 = data1.head()
4 print(data1)

 

控制台輸出:

 

情感數據描述

1 data1 = data1.describe()

 

控制台輸出:

數據說明emotion的平均值為0.63,中位數為0.67,25%分位數為0.49,可見不到25%的數據造成了整體均值的較大下移。另外上圖的最下面可以看到,情感分析執行時間為48.8s,數據量還是挺大的。

 

5.4 情感分析直方圖

 1 plt.rcParams['font.sans-serif'] = ['SimHei']
 2 plt.rcParams['axes.unicode_minus'] = False
 3 
 4 bins = np.arange(0,1.1,0.1)    #設置區間
 5 plt.hist(data1['emotion'],bins,color='#4F94CD',alpha=0.9)
 6 plt.xlim(0,1)
 7 plt.xlabel('情感分析')
 8 plt.ylabel('數量')
 9 plt.title('情感分析直方圖')
10 plt.show()

 

控制台輸出:

數據說明:

  • 由直方圖可見,彈幕情感呈逐漸上升的趨勢,說明粉絲對EDG奪冠情緒逐漸興奮,很激動;
  • 彈幕數據中有約4500條彈幕情感分在[0.5,0.6區間內;同時,有約4800條彈幕情感分在[0.8,0.9]區間內,這個區間粉絲的情緒最亢奮,估計是奪冠時刻,哈哈哈!
  • 從區間[0.5,0.6]過渡到[0.6,0.7]以及從區間[0.8,0.9]過渡到[0.9,1.0]彈幕情緒出現下降,可能是因為在比賽中出現一些問題或者是比賽落幕了

 

5.5 關鍵詞提取

1 from jieba import analyse
2 key_words = analyse.extract_tags(sentence=text_cut,topK=10,withWeight=True,allowPOS=())
3 print(key_words)

 

控制台輸出:

數據說明:

  • 以上關鍵詞顯示,粉絲發的彈幕中“冠軍”是最多的,然后是“翻譯”,”我們”,“卧槽”,“小姐姐”,“EDG”,“淚目“,”聖槍哥“,”賀電“,”edg“,由此看來,EDG真的很受歡迎,翻譯小姐姐也挺受歡迎的。這在上面的詞雲圖中也可以看得出來

 

參數說明:

  • sentence是需要提取的字符串,必須是str類型,不能是list
  • topK表示提取前多少個關鍵字
  • withWeight表示是否返回每個關鍵詞的權重
  • allowPOS表示允許提取的詞性,默認提取地名(ns)、名詞(n)、動名詞(vn)、動詞(v)

 

5.6 積極彈幕與消極彈幕

計算積極彈幕與消極彈幕各自的數目:

1 pos,neg = 0,0
2 for  i in data1['emotion']:
3     if i >= 0.5:
4         pos += 1
5     else:
6         neg += 1
7 print(f'積極彈幕數據為:{pos}' + '\n' + f'消極彈幕數據為:{neg}')

 

控制台輸出:

積極彈幕數據為:17941
消極彈幕數據為:6054

 

5.7 餅圖分析

1 import matplotlib.pyplot as plt
2 
3 plt.rcParams['font.sans-serif'] = ['SimHei']
4 plt.rcParams['axes.unicode_minus'] = False
5 
6 pie_labels = 'positive','negative'
7 plt.pie([pos,neg],labels=pie_labels,autopct='%1.2f%%',shadow=True)
8 
9 plt.show()

 

控制台輸出:

由上圖可見,由74.77%的彈幕數據是積極的,有25.23%的彈幕數據是消極的,總體來看,積極彈幕還是比較多的

 

5.8 消極彈幕分析

取出部分消極彈幕數據

1 data2 = data1[data1['emotion'] < 0.5]
2 data2 = data2.head()
3 print(data2)

 

控制台輸出:

 

數據說明:

  • 圖中的“回血”,“求生欲”等消極彈幕有可能是EDG戰隊或者韓國隊比賽不佳造成的

 


 

六、總結

PIL庫

jieba庫

numpy庫

pandas庫

requests庫

wordcloud庫

matplotlib庫

json,re,chardet庫

snownlp情感分析庫

 


 

七、完整項目及源碼下載

完整項目(包括源碼)獲取方式:下載

也可添加本人微信號獲取完整項目:MakerChen66

本人原創公眾號原文鏈接:閱讀原文

本人CSDN博客鏈接:閱讀原文

 

原創不易,如果覺得有趣好玩,希望可以隨手點個贊,拜謝各位老鐵!

最近發現CSDN上好多人抄襲本人博客,還比我熱度高,哎!畢竟是10月份剛剛創建的賬號,知名度和粉絲沒有別人高啊!

 


 

八、作者Info

作者:南柯樹下,Goal:讓編程更有趣!

原創微信公眾號:『小鴻星空科技』,專注於算法、爬蟲,網站,游戲開發,數據分析、自然語言處理,AI等,期待你的關注,讓我們一起成長、一起Coding!

版權聲明:本文禁止抄襲、轉載 ,侵權必究!

 


 更多獨家精彩內容  掃碼關注個人公眾號,我們一起成長,一起Coding,讓編程更有趣!


 

——  ——  ——  ——  —  END  ——  ——  ——  ——  ———— 

         歡迎掃碼關注我的公眾號

          小鴻星空科技

       

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM