分析《嚮往的生活3》彈幕了解真正的「慢生活」
- 2019 年 10 月 8 日
- 筆記
作者 | 超哥
來源 | 超哥的雜貨鋪
本文轉載自超哥的雜貨鋪
以清凈心看世界;
用歡喜心過生活。
超哥的雜貨鋪,你值得擁有~
《嚮往的生活》是湖南衛視一檔十分溫馨的生活類真人秀綜藝節目,目前第三季正在更新中,常駐嘉賓加入了張子楓,深受廣大觀眾的喜歡。而該節目的豆瓣評分也達到了7.9。這檔綜藝以明星藝人到村寨里體驗生活為主線,融入了美食,勞動,幽默的元素,讓人邊看邊有身臨其境的感覺,彷彿自身也真正進入了「嚮往的生活」。

嚮往的生活豆瓣評分
近些天在看節目的時候,看到彈幕上大家討論的特別熱鬧,突發奇想能不能把所有的彈幕爬下來做一下分析呢。一方面探究一下彈幕數據抓取有沒有特別之處,另一方面通過彈幕對這個節目的口碑一探究竟。接下來以上周五剛更新的第5期為例,進行彈幕數據抓取。程式碼主要使用requests庫,抓取結果存儲在csv文件中。
網頁分析
在芒果TV網頁版打開第5期節目,等待廣告載入完畢,同時打開chrome開發者工具的network選項卡。由於請求很多,而且隨著時間推移,會越來越多。所以我採取了先清空再等待的方式。發現前面大多載入的都是圖片,自然這不是我們的目標。過了一會兒之後,發現一條可疑的請求,見下圖所示,點擊一看,真的出現了彈幕內容。interval是60,猜測可能是表示一個間隔,每60s會有一個新的請求。於是使用filter過濾了以「rdb」開頭的請求,發現這些都是彈幕,而且next都是60000的倍數,猜測表示的是60000毫秒,也就是60秒。

找到彈幕請求鏈接

過濾彈幕請求
接下來我們需要確認彈幕的翻頁邏輯,也就是這些彈幕鏈接的統一規律。這裡推薦一個很好用的網頁請求分析工具postman。它不僅可以用來分析網頁的請求參數,還能夠提供不同語言的請求程式碼,稍加修改就可以使用。把剛剛我們找到的鏈接貼到postman中。如圖所示,可以看到請求的參數,點擊send按鈕之後能看到請求的結果。由於參數很多,可以考慮去掉一些無用的參數。最終發現,只需要保留vid,cid,time三個參數即可。猜測vid表示節目id,cid表示影片id,time應該是請求時刻,是一個相對值。並且請求結果中,而每一條彈幕的時間,都要比time數值大。結合上文的分析邏輯,可以得出每一個請求結果都是請求時間60s內的彈幕。如果我們要獲取所有的彈幕,就可以通過改變time的值來實現。最小的time取值應該是0,最大的應該就是和影片時長最接近的60000倍數的毫秒數。這裡的節目時長為89:49。經過驗證,果然如此,接下來我們就可以用程式碼來實現了。

使用postman測試請求參數

使用postman測試time請求參數
程式碼實現
使用requests構造網路請求,並用一個循環控制翻頁,爬取全部的彈幕。解析返回的json數據並使用pandas存儲到Excel中。詳細程式碼如下所示,一共45行。
註:左右滑動查看全部程式碼
import requests import pandas as pd import time import datetime from fake_useragent import UserAgent ua = UserAgent() url = "https://galaxy.bz.mgtv.com/rdbarrage" rdb_content = {'id': [], 'type': [], 'uid': [], 'content': [], 'add_time': [], 'ups': []} count = 0 print("爬取開始時間: {}".format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) for i in range(0, 91): querystring = {"version": "2.0.0", "vid": "5683459", "cid": "328724", "time": i*60000} headers = { 'User-Agent': ua.random } try: response = requests.request("GET", url, headers=headers, params=querystring).json() items = response['data']['items'] if items is None: print("爬取完畢!彈幕數量{}".format(count)) break else: for item in items: rdb_content['id'].append(item.get('id')) #彈幕id rdb_content['type'].append(item.get('type')) #彈幕類型 rdb_content['uid'].append(item.get('uid')) #用戶id rdb_content['content'].append(item.get('content')) #彈幕內容 rdb_content['add_time'].append(item.get('time')) #彈幕時間 rdb_content['ups'].append(item.get('up', 0)) #d彈幕點贊數 count = count + 1 print("爬取第{}分鐘的彈幕...,當前彈幕數量{}".format(i + 1, count)) time.sleep(5) except: print("第{}分鐘彈幕爬取失敗!當前彈幕數量{}".format(i + 1, count)) continue rdb_df = pd.DataFrame(rdb_content) rdb_df.to_csv('rdb.csv', index=None)
運行效果截圖:

爬蟲運行效果
可以看出,在本次爬取時,彈幕數量已經將近3w條,而此時節目更新還不到2天,在一定程度可以反映出該節目的火爆程度。接下來我們對彈幕數據做一些深入的分析,從數據的角度看這期節目。
數據可視化
以上爬取的數據,有一些欄位存在缺失,但是佔比極小,因此採取刪除的方式處理,最終剩餘28602條有效數據。

數據預處理-刪除重複值
01 不同時間段彈幕數量的分布
節目時長大約90分鐘,我們分別以1分鐘和10分鐘為單位,看一下彈幕數量。每分鐘彈幕都在200以上,最小的為207,最大的為360,平均值為318。30-40分鐘彈幕最多,一般此時是節目的高潮時段,80-90分鐘彈幕數量最少,此時節目已經接近尾聲。可以看出,雖然隨著時間推移,彈幕數量有所波動,但整體來講,在各個時間,彈幕波動不劇烈,也反映齣節目能夠持續保持較高的熱度,可謂「分分鐘都是精彩」。

每分鐘彈幕數量柱形圖

每十分鐘彈幕數量柱形圖
02 不同長度的彈幕數量分布

不同彈幕長度柱形圖
可以看出,彈幕長度最大為64,長度越長,彈幕數量越少,長度為6的彈幕數量最多,達到2470條。大多數彈幕的長度都集中於10個字上下,趨向於口語化。這也符合我們的認知,10字左右已經足以表達用戶看劇的心情和觀點。當然也有不嫌麻煩的用戶,彈幕數量達到了30字以上,也有極少量的彈幕長度達到了50以上。出於好奇,我們可以看一下長度超過50的彈幕都說了啥,見下圖所示,多少能夠感受到觀眾十分走心地在享受節目。

長度超過50彈幕 03 彈幕點贊數分布

點贊數量區間
可以看出有接近四分之一分彈幕沒有獲得點贊。近6成的彈幕點贊量在20以下,點贊量20以上的彈幕不到20%。我們同樣可以看一下點贊大於300的彈幕都說了啥,但從彈幕就能感受到節目整體的歡樂氣氛。

點贊超過300彈幕
04 用戶發布的彈幕數量,點贊數,彈幕總字數對比
我們的數據中共有17268名用戶發布了28602條彈幕,人均發布彈幕1.66條。按照點贊數降序排列取前10,觀察彈幕數量,點贊數,彈幕總字數。可以看出,點贊數高的用戶,發布的彈幕數量也多,字數相應也很多。下圖只展示了前10的情況,也可以調整下面的區間,看更多用戶的彈幕表現。需要指出的是,只能取到用戶ID,無法分析用戶的偏好情況。

各用戶彈幕情況對比
05 彈幕使用emoji表情情況

彈幕emoji表情使用情況我們的數據中,使用表情的彈幕數量為1430,共使用了166種,2439次表情,"笑哭"?這個表情使用數量最多,遠遠超過其他表情。一定程度上說明了這個表情受歡迎的程度,也側面反映齣節目本身的幽默效果很多,讓網友們哭笑不得。
06 詞雲圖
通過對彈幕進行分詞處理,繪製出以下的詞雲圖。

彈幕詞雲圖
看著這個詞雲圖,瞬間感覺有溢出螢幕的歡樂,好像耳朵也能音樂聽見斷斷續續的「哈哈哈哈」聲,群眾的眼睛是雪亮的,能讓人如此開心的節目,火起來自然也就不足為奇了。
至此,我們基本完成了《嚮往的生活》第5期節目彈幕的抓取與簡單的可視化分析工作。更多有趣的點大家可以自己去分析和發現。