我和高中時(shí)喜歡的女孩子在一起了

現(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('詞云圖繪制成功!')

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容