《向往的生活》彈幕抓取與分析
《向往的生活》是湖南衛(wèi)視一檔十分溫馨的生活類真人秀綜藝節(jié)目,目前第三季正在更新中鸭叙,常駐嘉賓加入了張子楓熬甚,深受廣大觀眾的喜歡。而該節(jié)目的豆瓣評(píng)分也達(dá)到了7.9聊品。這檔綜藝以明星藝人到村寨里體驗(yàn)生活為主線飞蹂,融入了美食,勞動(dòng)翻屈,幽默的元素陈哑,讓人邊看邊有身臨其境的感覺,仿佛自身也真正進(jìn)入了“向往的生活”伸眶。
近些天在看節(jié)目的時(shí)候惊窖,看到彈幕上大家討論的特別熱鬧,突發(fā)奇想能不能把所有的彈幕爬下來做一下分析呢厘贼。一方面探究一下彈幕數(shù)據(jù)抓取有沒有特別之處界酒,另一方面通過彈幕對(duì)這個(gè)節(jié)目的口碑一探究竟。接下來以上周五剛更新的第5期為例嘴秸,進(jìn)行彈幕數(shù)據(jù)抓取毁欣。代碼主要使用requests庫,抓取結(jié)果存儲(chǔ)在csv文件中岳掐。
網(wǎng)頁分析
在芒果TV網(wǎng)頁版打開第5期節(jié)目凭疮,等待廣告加載完畢,同時(shí)打開chrome開發(fā)者工具的network選項(xiàng)卡串述。由于請(qǐng)求很多执解,而且隨著時(shí)間推移,會(huì)越來越多纲酗。所以我采取了先清空再等待的方式衰腌。發(fā)現(xiàn)前面大多加載的都是圖片新蟆,自然這不是我們的目標(biāo)。過了一會(huì)兒之后右蕊,發(fā)現(xiàn)一條可疑的請(qǐng)求琼稻,見下圖所示,點(diǎn)擊一看尤泽,真的出現(xiàn)了彈幕內(nèi)容欣簇。interval是60,猜測可能是表示一個(gè)間隔坯约,每60s會(huì)有一個(gè)新的請(qǐng)求熊咽。于是使用filter過濾了以“rdb”開頭的請(qǐng)求,發(fā)現(xiàn)這些都是彈幕闹丐,而且next都是60000的倍數(shù)横殴,猜測表示的是60000毫秒,也就是60秒卿拴。
接下來我們需要確認(rèn)彈幕的翻頁邏輯衫仑,也就是這些彈幕鏈接的統(tǒng)一規(guī)律。這里推薦一個(gè)很好用的網(wǎng)頁請(qǐng)求分析工具postman堕花。它不僅可以用來分析網(wǎng)頁的請(qǐng)求參數(shù)文狱,還能夠提供不同語言的請(qǐng)求代碼,稍加修改就可以使用缘挽。把剛剛我們找到的鏈接貼到postman中瞄崇。如圖所示,可以看到請(qǐng)求的參數(shù)壕曼,點(diǎn)擊send按鈕之后能看到請(qǐng)求的結(jié)果苏研。由于參數(shù)很多,可以考慮去掉一些無用的參數(shù)腮郊。最終發(fā)現(xiàn)摹蘑,只需要保留vid,cid轧飞,time三個(gè)參數(shù)即可衅鹿。猜測vid表示節(jié)目id,cid表示視頻id过咬,time應(yīng)該是請(qǐng)求時(shí)刻塘安,是一個(gè)相對(duì)值。并且請(qǐng)求結(jié)果中援奢,而每一條彈幕的時(shí)間,都要比time數(shù)值大忍捡。結(jié)合上文的分析邏輯集漾,可以得出每一個(gè)請(qǐng)求結(jié)果都是請(qǐng)求時(shí)間60s內(nèi)的彈幕切黔。如果我們要獲取所有的彈幕,就可以通過改變time的值來實(shí)現(xiàn)具篇。最小的time取值應(yīng)該是0纬霞,最大的應(yīng)該就是和視頻時(shí)長最接近的60000倍數(shù)的毫秒數(shù)。這里的節(jié)目時(shí)長為89:49驱显。經(jīng)過驗(yàn)證诗芜,果然如此,接下來我們就可以用代碼來實(shí)現(xiàn)了埃疫。
代碼實(shí)現(xiàn)
使用requests構(gòu)造網(wǎng)絡(luò)請(qǐng)求伏恐,并用一個(gè)循環(huán)控制翻頁,爬取全部的彈幕栓霜。解析返回的json數(shù)據(jù)并使用pandas存儲(chǔ)到Excel中翠桦。詳細(xì)代碼如下所示,一共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("爬取開始時(shí)間: {}".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("爬取完畢销凑!彈幕數(shù)量{}".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')) #彈幕內(nèi)容
rdb_content['add_time'].append(item.get('time')) #彈幕時(shí)間
rdb_content['ups'].append(item.get('up', 0)) #d彈幕點(diǎn)贊數(shù)
count = count + 1
print("爬取第{}分鐘的彈幕...,當(dāng)前彈幕數(shù)量{}".format(i + 1, count))
time.sleep(5)
except:
print("第{}分鐘彈幕爬取失敗!當(dāng)前彈幕數(shù)量{}".format(i + 1, count))
continue
rdb_df = pd.DataFrame(rdb_content)
rdb_df.to_csv('rdb.csv', index=None)
運(yùn)行效果截圖:
可以看出仅炊,在本次爬取時(shí)斗幼,彈幕數(shù)量已經(jīng)將近3w條,而此時(shí)節(jié)目更新還不到2天抚垄,在一定程度可以反映出該節(jié)目的火爆程度蜕窿。接下來我們對(duì)彈幕數(shù)據(jù)做一些深入的分析,從數(shù)據(jù)的角度看這期節(jié)目督勺。
數(shù)據(jù)可視化
以上爬取的數(shù)據(jù)渠羞,有一些字段存在缺失,但是占比極小智哀,因此采取刪除的方式處理次询,最終剩余28602條有效數(shù)據(jù)。
01 不同時(shí)間段彈幕數(shù)量的分布
節(jié)目時(shí)長大約90分鐘瓷叫,我們分別以1分鐘和10分鐘為單位屯吊,看一下彈幕數(shù)量∧〔ぃ可以看出盒卸,雖然隨著時(shí)間推移,彈幕數(shù)量有所波動(dòng)次氨,但整體來講蔽介,在各個(gè)時(shí)間,彈幕波動(dòng)不劇烈,也反映出節(jié)目能夠持續(xù)保持較高的熱度虹蓄,可謂“分分鐘都是精彩”犀呼。
02 不同長度的彈幕數(shù)量分布
可以看出,大多數(shù)彈幕的長度都集中于10個(gè)字上下薇组,趨向于口語化外臂。這也符合我們的認(rèn)知,10字左右已經(jīng)足以表達(dá)用戶看劇的心情和觀點(diǎn)律胀。當(dāng)然也有不嫌麻煩的用戶宋光,彈幕數(shù)量達(dá)到了30字以上,也有極少量的彈幕長度達(dá)到了50以上炭菌。出于好奇罪佳,我們可以看一下長度超過50的彈幕都說了啥,見下圖所示娃兽,多少能夠感受到觀眾十分用心地在享受節(jié)目菇民。
03 彈幕點(diǎn)贊數(shù)分布
可以看出有接近四分之一分彈幕沒有獲得點(diǎn)贊。近6成的彈幕點(diǎn)贊量在20以下投储,點(diǎn)贊量20以上的彈幕不到20%第练。我們同樣可以看一下點(diǎn)贊大于300的彈幕都說了啥,但從彈幕就能感受到節(jié)目整體的歡樂氣氛玛荞。
04 用戶發(fā)布的彈幕數(shù)量娇掏,點(diǎn)贊數(shù),彈幕總字?jǐn)?shù)對(duì)比
我們的數(shù)據(jù)中共有17268名用戶發(fā)布了28602條彈幕勋眯,按照點(diǎn)贊數(shù)降序排列取前10婴梧,觀察彈幕數(shù)量,點(diǎn)贊數(shù)客蹋,彈幕總字?jǐn)?shù)塞蹭。可以看出讶坯,點(diǎn)贊數(shù)高的用戶番电,發(fā)布的彈幕數(shù)量也多,字?jǐn)?shù)相應(yīng)也很多辆琅。
05 彈幕使用emoji表情情況
06 詞云圖
通過對(duì)彈幕進(jìn)行分詞處理漱办,繪制出以下的詞云圖。
看著這個(gè)詞云圖婉烟,瞬間感覺有溢出屏幕的歡樂娩井,好像耳朵也能音樂聽見斷斷續(xù)續(xù)的“哈哈哈哈”聲,群眾的眼睛是雪亮的似袁,能讓人如此開心的節(jié)目洞辣,火起來自然也就不足為奇了咐刨。
至此,我們基本完成了《向往的生活》第5期節(jié)目彈幕的抓取與簡單的可視化分析工作屋彪。更多有趣的點(diǎn)大家可以自己去分析和發(fā)現(xiàn)所宰。本來我還調(diào)用了百度的情感分析API,想對(duì)彈幕的情感傾向進(jìn)行分析畜挥,但效果好像不是太好,結(jié)果就沒有貼出來婴谱。感興趣的盆友可以看代碼蟹但。歡迎關(guān)注公眾號(hào)“超哥的雜貨鋪”,在后臺(tái)回復(fù)“向往的生活”索取源代碼谭羔。祝大家生活愉快华糖!