《中餐厅》弹幕数据分析,我不要你觉得,我只要我觉得!
這段時間奇怪了,周圍朋友都愛上了同一個口頭禪“我不要你覺得,我只要我覺得”;我就納悶了漢語文字那么多,你們偏偏都愛上了同一句,我懷疑他們在玩梗,果不其然,在B站的鬼畜區了解到了真相。
綠大暗僅憑一己之力,將綜藝節目《中餐廳3》推上了熱門,成為了本季度當之無愧的綜藝之王,“我不要你覺得,我只要我覺得”,“別說話,聽我的”等是綠大暗的經典名言,這些名言被稱為“明學”,甚至隱隱與“六學”齊名,兩開花。
對一部視頻作品,如果說評論是觀眾觀看后的沉思,那么彈幕就是吃瓜群眾情感的實時流露,為了一窺“明學”的真諦,我打算爬一爬《中餐廳3》的彈幕數據,做一個情感分析。
廢話不多說,“起鍋燒油”
一、分析網頁爬數據
1.確認加載方式
《中餐廳3》在芒果TV獨播,打開Chrome瀏覽器,訪問第1集的鏈接https://www.mgtv.com/b/330026/6086563.html,通過禁用頁面javaScript發現頁面視頻和彈幕都無法加載,并且右鍵-查看頁面源碼,搜索不到彈幕的文字,說明數據是異步加載的
2.抓包分析
打開剛剛關閉的javaScript,重新加載頁面,F12打開開發者工具,仔細查找XHR或JS最終在js中找到了彈幕數據,鏈接是這樣的
https://galaxy.bz.mgtv.com/rdbarrage?version=2.0.0&vid=6086563&abroad=0&pid=&os=&uuid=&deviceid=&cid=330026&ticket=&time=60102&mac=&platform=0&callback=jsonp_1568127366004_84552
彈幕數據是json格式,但是偽裝成了jQuery藏在JS里面。
3.鏈接分析
從抓包的地址看,彈幕的真實請求地址是https://galaxy.bz.mgtv.com/rdbarrage?,其后是一堆相關的參數,相關的參數見下圖
上圖中許多參數字段是沒有值的,所以我們試著簡化請求地址鏈接,最終發現https://galaxy.bz.mgtv.com/rdbarrage?vid=6086563&cid=330026&time=60102仍然可以請求成功,也就是說只保留vid,cid.time3個參數就可以了
接下來分析vid,cid.time這3個參數
首先我們把前3期的url列出來
第1期:https://www.mgtv.com/b/330026/6086563.html
第2期:https://www.mgtv.com/b/330026/6128068.html
第3期:https://www.mgtv.com/b/330026/6168375.html
發現上述url中330026沒有變化,只有后面的一串文字發生了變化,通過和下圖中參數對比,發現url中第一個不變的數字串就是我們要尋找的vid,而后面的數字串就是cid,不難看出,vid是“中餐廳3”在芒果TV平臺中的編號,而cid是中餐廳3不同期數的編號。
那么參數time是什么?
首先通過time英文的本身來看,她是一個和時間有關系的變量,那么可以有以下猜測
https://galaxy.bz.mgtv.com/rdbarrage?vid=6086563&cid=330026&time=120083中的time值修改為120000,然后再次請求數據,發現仍然可以成功請求到對應的數據
上圖中在next參數的旁邊還有個參數interval,她的英文意思是“間隔,間距”,而彈幕的time值依次是60000、120000、180000….,差值為60000,所以推測next=1000*interval,所以很有可能next的單位是ms,而interval的單位是s。為了驗證猜想,我們把視頻進度條拉到最后,本期的視頻長度為104.01分鐘,而最后一條彈幕的next為6240000,6240000ms轉化為分鐘剛好是104min,驗證成立:time是每條彈幕開始播放的時間。至此所有的參數都已經搞清楚了
二、爬取數據
采用request請求數據,導入我們需要調用的包import?requestsimport?json?
import?pandas?as?pd
import?time
首先定義一個主函數用來獲取每條彈幕js文件的內容,并將獲得的數據轉化為json格式。傳入的參數time_zimu是每條彈幕開始播放的時間def?main(time_zimu):
????url='https://galaxy.bz.mgtv.com/rdbarrage?vid=6337608&cid=330026&time='+str(time_zimu)
????html=requests.get(url,headers=headers)
????html.encoding="utf-8"
????html_data=html.text[html.text.find('['):-2]
????html_data_json=json.loads(html_data)
這需要注意一點,因為我們要獲取的json數據是在jQuery中,為了避免出錯,我們這里直接獲取json部分的數據html_data=html.text[html.text.find('['):-2],效果如下圖將數據轉為json格式后,其中type,uid,content,time是我們想要的數據構造獲取彈幕信息函數,傳入json的數據orgin_data,通過循環重復取出單條彈幕信息,并提取對應的字段def?get_infos(orgin_data):
????for?infos?in?orgin_data:
????????yield[
????????infos['type'],
????????infos['uid'],
????????infos['content'],
????????infos['time']
????????]
構造保存數據函數,將獲得的數據構建成DaraFrame,將數據保存到csv文件中def?save_data(single_data):
????data=[]
????data.extend(single_data)
????columns=['type','uid','content','time']
????data_frame=pd.DataFrame(data=data,columns=columns)
????data_frame.to_csv('data2019.csv',mode='a')
最后封裝函數,循環獲取所有彈幕文件if?__name__?==?"__main__":
????time_c=60000?#加載彈幕時間間隔
????for?i?in?range(0,110):?#此處110取決于最后彈幕的出現時間
????????print('開始?時間為'+str(i)+'的字幕')
????????main(time_c*i)
????????time.sleep(3)
三、展示成果
運行爬蟲,開始工作爬取彈幕展示下我們爬取到的彈幕數據文件的前幾行數據,達成獲得彈幕數據成就data=pd.read_csv('data2019.csv')
print(data.head())
四、one more thing
這篇文章并沒有太大難度,但是對于新手來說,網上的的教程都集中在代碼部分,而前期的分析工作則一筆帶過,其實這部分才是最重要的部分,這也是我寫本文的初衷。本文完整代碼,在「小詹學Python」后臺回復「中餐廳」即可獲取!推薦閱讀:(點擊下方標題即可跳轉)與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的《中餐厅》弹幕数据分析,我不要你觉得,我只要我觉得!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python数据分析实战基础 | 初识P
- 下一篇: 命令行的艺术