爬取B站20萬+條彈幕,我學(xué)會(huì)了如何成為B站老司機(jī)
前言
B站(嗶哩嗶哩)是國內(nèi)知名的視頻彈幕網(wǎng)站,也是中國最大的年輕人聚集地之一,想要知道B站彈幕愛刷什么梗?不同分區(qū)UP主彈幕各有什么特點(diǎn)?如何快速成為B站彈幕老司機(jī)?本文就通過Python爬取B站不同UP主近20萬+彈幕數(shù)據(jù)進(jìn)行分析,全文共分為兩個(gè)部分,第一部分為不同分區(qū)up主的彈幕分析,第二部分為Python爬取B站彈幕技術(shù)分析。
彈幕分析
戶外區(qū)-華農(nóng)兄弟
首先是戶外區(qū)up主,我們選擇了華農(nóng)兄弟,雖然往期類似竹鼠中暑、母雞發(fā)燒、打架內(nèi)傷等視頻彈幕很多,但最近的彈幕大多為考古等重復(fù)數(shù)據(jù),因此為了追蹤近期彈幕熱點(diǎn),我們選擇近期播放量較高的視頻來進(jìn)行分析(2020-07-07)

因b站限制每天只能獲取1500條,因此本文一共爬取了自7.7日發(fā)布以來共24天36000條彈幕,并制作成詞云圖如下(點(diǎn)擊圖片可以直達(dá)該視頻播放)
可以看到,彈幕刷的最多的就是?兄弟?,畢竟兄弟家的就是我家的
,其次就是村霸、危、億點(diǎn)點(diǎn)、死因?等專屬與華農(nóng)兄弟的梗,還有類似于人言否、寸草不生、兄弟敢怒不敢言?等關(guān)鍵詞也是彈幕愛刷的,學(xué)會(huì)了嗎
知識(shí)區(qū)-羅翔
接下來是最近在b站知識(shí)區(qū)很火的羅翔老師,直接搜索羅翔出來的大多是正兒八經(jīng)刑法課,要想正確混入彈幕區(qū)還需搜索張三

從標(biāo)題就能看到每一個(gè)視頻都不簡單,我們找到播放量較高的一個(gè)視頻?

該視頻講述了張三的多種死法,截止7.30日共獲得700萬+播放,實(shí)時(shí)2萬+彈幕,我們爬取近兩個(gè)月每天1500條共60000條彈幕并制作成詞云圖如下(點(diǎn)擊圖片可以直達(dá)該視頻播放)
可以看到,除了滿屏的哈哈哈,哈哈哈哈之外,開門見三、法外狂徒張三也是彈幕愛發(fā)的,其次還有類似于好慘啊、張三太慘、淚目等看上去心疼張三的彈幕。當(dāng)然眾所周知十個(gè)淚目九個(gè)笑,還有一個(gè)在狂笑
。同時(shí)我們可以發(fā)現(xiàn)在華農(nóng)兄弟彈幕區(qū)愛刷的死因來到羅老師這里成了死法,只不過一個(gè)是竹鼠的一百種死因一個(gè)是張三的一千種死法

另外和華農(nóng)兄弟的全程村霸不同,由于羅老師的相關(guān)視頻都是有具體的故事情節(jié),所以視頻不同時(shí)間段的彈幕熱詞并不一樣,我們來看一下?

從視頻開始的開門見三,到隨著案件發(fā)展張三的慘死與哈哈哈,最后是滿屏的淚目,你get到了嗎
生活區(qū)-手工耿
接下來是生活區(qū),我們選擇手工達(dá)人手工耿近期的熱門視頻

自制夫妻分分合合床,一聽就知道是廢品了,該視頻自7.17發(fā)布以來共獲得460萬+播放,1.3萬+條實(shí)時(shí)彈幕,用Python爬取21000條彈幕并制作詞云圖(點(diǎn)擊圖片可以直達(dá)該視頻播放)
除了滿屏的哈哈哈,手工耿也有屬于自己的彈幕熱詞,比如刑部尚書、害怕、申請(qǐng)專利、量產(chǎn)、有用,取關(guān)了、這個(gè)項(xiàng)目我王多魚投了等,當(dāng)然由于這期視頻為夫妻分分合合床,所以類似老婆、嫂子等詞語也被瘋狂刷屏。
美食區(qū)-我是郭杰瑞
現(xiàn)在我們來到b站美食區(qū)-郭杰瑞的彈幕區(qū),雖然現(xiàn)在更像是戰(zhàn)地記者的郭錐近期也回歸了老本行,7.21日更新了美食相關(guān)視頻,并且也獲得了七月視頻的最高播放

我們爬取該視頻的15000條彈幕進(jìn)行分析并制作詞云圖如下(點(diǎn)擊圖片可以直達(dá)該視頻播放)
除了滿屏的哈哈哈之外,這個(gè)不辣?是刷的最多的彈幕,你也可以在郭杰瑞的任何視頻中看到刷這個(gè)梗的彈幕。當(dāng)然類似于血虧、漢堡、黃金等就是和該視頻相關(guān)的熱詞了其次由于該視頻是在紐約錄制,所以美麗的風(fēng)景線、no justice no peace也是彈幕一直在刷的
鬼畜區(qū)
最后,我們來到B站的鬼畜區(qū),看看最火的鬼畜區(qū)彈幕都愛刷什么,我們打開b站鬼畜區(qū)的7月排行榜

可以看到,7月最熱的5個(gè)鬼畜視頻中,兩個(gè)是基于讓子彈飛制作,兩個(gè)是基于羅翔制作,為了采集更多的彈幕數(shù)據(jù),本文選擇月初發(fā)布的基于羅翔x愛情公寓的鬼畜視頻【張三史上最慘4分鐘】,共爬取到近4萬條彈幕數(shù)據(jù)并制作詞云圖如下(點(diǎn)擊圖片可以直達(dá)該視頻播放)
來到鬼畜區(qū)肯定就少不了好活當(dāng)賞和下次一定,當(dāng)然有張三的地方就有法外狂徒,有愛情公寓的地方就有腎寶。其次一個(gè)優(yōu)秀的鬼畜視頻開頭一定會(huì)有人刷歡迎回來和每日億遍,持續(xù)的押韻、skr、上頭也是少不了~
技術(shù)解析
本節(jié)介紹如何使用Python爬取B站指定視頻的全部彈幕,如果你嘗試去搜索Python爬取B站彈幕等關(guān)鍵詞,會(huì)發(fā)現(xiàn)大多數(shù)教程是通過請(qǐng)求存儲(chǔ)彈幕的xml文件來獲取數(shù)據(jù),但是目前已經(jīng)失效,除此之外GitHub上還有一些b站的API,不過為了更好的采集自己想要的數(shù)據(jù),本文選擇自行爬取,思路依舊是抓包—>requests請(qǐng)求數(shù)據(jù),我們已華農(nóng)兄弟的視頻為例,首先打開需要采集彈幕的視頻,然后F12—>Network,

此時(shí)無論怎樣查找,都找不到存儲(chǔ)彈幕的數(shù)據(jù)包,即使你打開彈幕列表,依舊只能找到一個(gè)被類似彈幕但是被加密的數(shù)據(jù)包,因此需要按照下圖指示點(diǎn)擊彈幕列表—>查看歷史彈幕,并選擇任意一天的歷史彈幕,此時(shí)就能找到存儲(chǔ)該日期彈幕的ajax數(shù)據(jù)包,所有的彈幕都藏在一個(gè)i標(biāo)簽中

現(xiàn)在查看請(qǐng)求的相關(guān)信息

可以發(fā)現(xiàn)RequestURL關(guān)鍵就是oid和date兩個(gè)參數(shù),date是日期沒什么好說的,oid雖然不知道是什么,但是一堆數(shù)據(jù)包中很多都是帶有一個(gè)oid

所以找到一個(gè)視頻的oid并不困難,接下來要做的就是根據(jù)這兩個(gè)參數(shù)構(gòu)造不同日期的彈幕URL
def?get_url(oid,start,end):
????'''
????獲取指定日期的彈幕
??? oid:視頻oid
??? start,end:起止日期
????'''
????url_list?=?[]
????
????date_list?=?[i?for?i?in?pd.date_range(start,end).strftime('%Y-%m-%d')]
????
????for?date?in?date_list:
????????
????????url?=?f"https://api.bilibili.com/x/v2/dm/history?type=1&oid={oid}&date={date}"
????????url_list.append(url)
????????
????return?url_list這里注意的是我們構(gòu)造日期使用了pandas中的date_range函數(shù),非常好用,感興趣的讀者可以自行搜索了解,現(xiàn)在我們獲得了指定日期的彈幕數(shù)據(jù)URL,接下來要做的就是使用requests請(qǐng)求網(wǎng)站并使用bs4解析數(shù)據(jù),最后將數(shù)據(jù)寫入TXT即可
def?get_danmu(url_list,name):
????'''
????下載彈幕存至本地txt
????'''
????headers?=?{"cookie":?"修改為你的cookie",
????"origin":?"https://www.bilibili.com",
????"referer":?"https://www.bilibili.com/video/BV1gW411b735",
????"sec-fetch-dest":?"empty",
????"sec-fetch-mode":?"cors",
????"sec-fetch-site":?"same-site",
????"user-agent":?"Mozilla/5.0?(Macintosh;?Intel?Mac?OS?X?10_15_2)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/84.0.4147.105?Safari/537.36"}
????
????file?=?open(f"{name}.txt",'w')
????
????for?i?in?trange(len(url_list)):
????????url?=?url_list[i]
????????res?=?requests.get(url,headers?=?headers)
????????res.encoding?=?'utf-8'
????????soup?=?BeautifulSoup(res.text)
????????data?=?soup.find_all("d")
????????danmu?=?[data[i].text?for?i?in?range(len(data))]
????????for?items?in?danmu:
????????????file.write(items)
????????????file.write("\n")
????????time.sleep(2)
???????
????file.close()上面的代碼并不復(fù)雜,使用自己的cookie等參數(shù)構(gòu)造請(qǐng)求頭循環(huán)請(qǐng)求數(shù)據(jù)即可,唯一要注意的就是返回的結(jié)果編碼為ISO-8859-1,需要先使用res.encoding?=?'utf-8'修改編碼,否則就會(huì)亂碼,當(dāng)然我這里還是用了tqdm來添加進(jìn)度條

以上就是有關(guān)Python爬取彈幕的技術(shù)解析,而詞云圖的制作我們在之前的文章中有過詳細(xì)的講解,此處就不再贅述,如果你對(duì)代碼感興趣的話可以在后臺(tái)回復(fù)0802獲取。最后如果你喜歡本文的話,不要忘記點(diǎn)擊文末三連,是這次而不是下次一定!






