現(xiàn)在大家的生活中,已經(jīng)越來越離不開B站了,
2020年的第一季度,B站月活躍用戶達(dá)到了1.72億,日活躍用戶也已經(jīng)突破了5000萬個(gè)用戶。
而B站的彈幕區(qū)一直是人才圣地。今天我們就用戶python來爬取B站排行榜熱門視頻彈幕'我和高中時(shí)喜歡的女孩子在一起了'
看完視頻只想說“好羨慕哦”!

工作原理
那么我們?cè)撊绾潍@取此視頻10000+彈幕呢?
在B站中,只要視頻中有彈幕,就會(huì)有一個(gè) cid 參數(shù)。cid 用來表示某個(gè)視頻對(duì)應(yīng)的彈幕池。每個(gè)彈幕都有一個(gè)對(duì)應(yīng)的 XML 文件,我們可以通過解析 XML 文件獲取到 B 站視頻的彈幕。
所以,只要知道了 cid 參數(shù)值,就可以找到視頻彈幕數(shù)據(jù)的位置了。
那我們?cè)谟^看視頻的時(shí)候該如何拿到這個(gè) XML 文件呢?
B 站的彈幕是在 XML 文件里,每個(gè)視頻都有其對(duì)應(yīng)的 cid 和 aid,我們?nèi)〉?cid 中的數(shù)字放入?http://comment.bilibili.com/cid.xml,即可得到該視頻對(duì)應(yīng)的彈幕 XML 文件。
思路分析
b站是提供彈幕接口的,所以我們的整體操作進(jìn)行如下:
1.到B站獲取cid
2.將cid與網(wǎng)站固定格式進(jìn)行鏈接
3.用python請(qǐng)求網(wǎng)頁
4.進(jìn)行簡(jiǎn)單的單詞處理
5.生成詞云
接下來我們就按照剛才說的順序進(jìn)行詳細(xì)解釋
網(wǎng)站分析
我們要抓取得視頻鏈接地址:
https://www.bilibili.com/video/BV1u34y1y7tY
先來思考一個(gè)問題,B站一個(gè)視頻的彈幕最多會(huì)有多少?
比較多的會(huì)有2000條吧,這么多數(shù)據(jù),B站肯定是不會(huì)直接把彈幕和這個(gè)視頻綁在一起的。
也就是說,有一個(gè)視頻地址為https://www.bilibili.com/video/BV1u34y1y7tY
你如果直接去requests.get這個(gè)地址,里面是不會(huì)有彈幕的,因?yàn)锽站的彈幕是先加載當(dāng)前視頻的界面,然后再異步填充彈幕的。
接下來我們可以打開谷歌瀏覽器(平常可以火狐谷歌控制臺(tái)都使用,因?yàn)楣雀枥锩嬉驗(yàn)椴寮粩r截下來的包在火狐可以抓到,同理谷歌也是)的控制臺(tái)來觀察網(wǎng)絡(luò)請(qǐng)求了。
首先我們打開視頻播放地址,F(xiàn)12打開瀏覽器開發(fā)者模式,如下圖找到視頻對(duì)應(yīng)的cid就可以構(gòu)造出彈幕鏈接
http://comment.bilibili.com/512470713.xml
到此可為止,有了彈幕文件,后面將通過爬蟲方式解析彈幕,并進(jìn)行彈幕內(nèi)容分析。
請(qǐng)求發(fā)送
我們使用request模擬瀏覽器發(fā)送請(qǐng)求獲取彈幕數(shù)據(jù)
url?=f'http://comment.bilibili.com/{cid}.xml'
headers?=?{
'referer':'xxxxxxxx',
'User-Agent':'xxxxxxxx',
'cookie':"xxxxxxxx"
}
resp?=?requests.get(url,?headers?=?headers)
print(resp.text)
成功獲取到了數(shù)據(jù)但是全部都是亂碼,這里我們不用設(shè)置字符的編碼格式,
只需要讓request獲取到的編碼格式和網(wǎng)頁的編碼格式相等即可
一行代碼即可搞定
#?調(diào)用.encoding屬性獲取requests模塊的編碼方式
#?調(diào)用.apparent_encoding屬性獲取網(wǎng)頁編碼方式
#?將網(wǎng)頁編碼方式賦值給response.encoding
resp.encoding?=?resp.apparent_encoding

信息提取
數(shù)據(jù)已經(jīng)給成功的獲取到,接下來我們要提取出所有的彈幕信息,
我們從獲取到網(wǎng)站的響應(yīng)信息后可以看出,所有的彈幕文字信息其實(shí)都是在
<d></d>標(biāo)簽之內(nèi)的
痛!太痛了
所以我們選擇使用正則提取。
#?獲取所有評(píng)論內(nèi)容
content_list?=?re.findall('<d?p=".*?">(.*?)</d>',?resp.text)
數(shù)據(jù)保存
我們使用函數(shù)將所有的彈幕數(shù)據(jù)存儲(chǔ)在'B站彈幕1.csv'文件中
ifos.path.exists(comment_file_path):
os.remove(comment_file_path)
foritemincontent_list:
withopen(comment_file_path,'a',?encoding?='utf-8')asfin:
fin.write(item?+'\n')
print(item)
print('-------------彈幕獲取完畢!-------------')
數(shù)據(jù)處理
接下來就是對(duì)數(shù)據(jù)去重和去空處理了,然后隨機(jī)抽取五條數(shù)據(jù)展示如下:
#?讀取數(shù)據(jù)
rcv_data?=?pd.read_csv('./B站彈幕1.csv',?encoding='gbk',?header=None,?sep='\t')
#?刪除重復(fù)記錄
rcv_data?=?rcv_data.drop_duplicates()
#?刪除缺失值
rcv_data?=?rcv_data.dropna()
#?抽樣展示5條數(shù)據(jù)
print(rcv_data.sample(5))
精彩彈幕
388葫蘆娃葫蘆娃一根藤上七朵花,
95徹骨傷,
646氣死我啦,
11太甜了,大叔祝你們幸福,
272一個(gè)單身狗看的津津有味,
詞頻展示
文章評(píng)論出現(xiàn)頻率最高的前十個(gè)詞分別如下:
defvisual_cipin():
#?詞頻設(shè)置
all_words?=?[wordforwordinresult.split('?')iflen(word)?>1andwordnotinstop_words]
wordcount?=?Counter(all_words).most_common(10)
x1_data,?y1_data?=?list(zip(*wordcount))
'''
('幸福',?'恭喜',?'祝福',?'太痛',?'一起',?'這么',?'哈哈哈',?'你們',?'嗚嗚',?'兩個(gè)')
(29,?27,?26,?18,?17,?17,?16,?16,?14,?14)
'''
詞云展示
我們使用結(jié)巴分詞
最后使用stylecloud繪制漂亮的詞云圖展示
#?詞云展示
defvisual_ciyun():
pic?='./img.jpg'
gen_stylecloud(text=result,
icon_name='fas?fa-heart',
font_path='msyh.ttc',
background_color='white',
output_name=pic,
custom_stopwords=stop_words
)
print('詞云圖繪制成功!')