MOJITO 发布一周,爬一波弹幕分析下
MOJITO
最近一直啥都沒寫,追個(gè)熱點(diǎn)都趕不上熱乎的,鄙視自己一下。
周董的新歌 「MOJITO」 發(fā)售(6 月 12 日的零點(diǎn))至今大致過去了一周,翻開 B 站 MV 一看,播放量妥妥破千萬,彈幕破十萬,這人氣還真是杠杠的。
說實(shí)話, 「MOJITO」 這個(gè)名字對(duì)我來講有點(diǎn)超綱了,第一次見到完全不知道啥意思。
不過問題不大,沒有什么是百度解決不了的,如果有,那就再加一個(gè)知乎。
MOJITO 的中文名是莫吉托,百度百科上是這么介紹莫吉托的:
莫吉托(Mojito)是最有名的朗姆調(diào)酒之一。起源于古巴。傳統(tǒng)上,莫吉托是一種由五種材料制成的雞尾酒:淡朗姆酒、糖(傳統(tǒng)上是用甘蔗汁)、萊姆(青檸)汁、蘇打水和薄荷。最原始的古巴配方是使用留蘭香或古巴島上常見的檸檬薄荷。萊姆(青檸)與薄荷的清爽口味是為了與朗姆酒的烈性相互補(bǔ),同時(shí)也使得這種透明無色的調(diào)酒成為夏日的熱門飲料之一。這種調(diào)酒有著相對(duì)低的酒精含量(大約10%)。
酒精度數(shù)在 10% 左右的話,姑且可以認(rèn)為一種飲料吧。
當(dāng)然,如果要開車的話就不能把 MOJITO 當(dāng)成飲料了,酒精含量再低那也是酒精。
整個(gè) MV 我翻來覆去的看了好幾遍, 「MOJITO」 這個(gè)東西除了在歌詞和名字中有出現(xiàn),在 MV 當(dāng)中一次都沒出現(xiàn),毫無存在感。
爬取 B 站彈幕
彈幕數(shù)據(jù)的爬取比較簡單,我就不一步一步的抓請(qǐng)求給各位演示了,注意下面這幾個(gè)請(qǐng)求連接:
彈幕請(qǐng)求地址:
https://api.bilibili.com/x/v1/dm/list.so?oid=XXXhttps://comment.bilibili.com/XXX.xml第一個(gè)地址由于 B 站的網(wǎng)頁做了更換,現(xiàn)在在 Chrome 工具的 network 里面已經(jīng)找不到了,不過還可以用,這個(gè)是我之前找到的。
第二個(gè)地址來源于百度,我也不知道各路大神是從哪找出來這個(gè)地址的,供參考吧。
上面這兩個(gè)彈幕地址實(shí)際上都需要一個(gè)叫 oid 的東西,這個(gè) oid 獲取方式如下:
首先可以找到一個(gè)目錄頁接口:
https://api.bilibili.com/x/player/pagelist?bvid=XXX&jsonp=jsonp這個(gè)接口也是來源于 Chrome 的 network ,其中 bvid 這個(gè)參數(shù)來源于視頻地址,比如周董的這個(gè) 「MOJITO」 的 MV ,地址是 https://www.bilibili.com/video/BV1PK4y1b7dt ,那么這個(gè) bvid 的值就是最后那一部分 BV1PK4y1b7dt 。
接下來在 https://api.bilibili.com/x/player/pagelist?bvid=BV1PK4y1b7dt&jsonp=jsonp 這個(gè)接口中,我們可以看到返回的 json 參數(shù),如下:
{"code":0,"message":"0","ttl":1,"data":[{"cid":201056987,"page":1,"from":"vupload","part":"JAY-MOJITO_完整MV(更新版)","duration":189,"vid":"","weblink":"","dimension":{"width":1920,"height":1080,"rotate":0}}] }注意:由于這個(gè) MV 只有一個(gè)完整的視頻,所以這里只有一個(gè) cid ,如果一個(gè)視頻是分不同小節(jié)發(fā)布的,這里就會(huì)有多個(gè) cid ,不同的 cid 代表不同的視頻。
當(dāng)然,這里的 cid 就是我們剛才想找的那個(gè) oid ,把這個(gè) cid 拼到剛才的鏈接上,可以得到 https://api.bilibili.com/x/v1/dm/list.so?oid=201056987 這樣一個(gè)地址,然后輸入到瀏覽器中,可以看到彈幕的返回?cái)?shù)據(jù),是一個(gè) xml 格式的文本。
源代碼如下:
import requests import re# 獲取 cid res = requests.get("https://api.bilibili.com/x/player/pagelist?bvid=BV1PK4y1b7dt&jsonp=jsonp") cid = res.json()['data'][0]['cid']# 將彈幕 xml 通過正則取出,生成 list danmu_url = f"https://api.bilibili.com/x/v1/dm/list.so?oid={cid}" result = requests.get(danmu_url).content.decode('utf-8') pattern = re.compile('<d.*?>(.*?)</d>') danmu_list = pattern.findall(result)# 將彈幕 list 保存至 txt 文件 with open("dan_mu.txt", mode="w", encoding="utf-8") as f:for item in danmu_list:f.write(item)f.write("\n")這里我將獲取到的彈幕保存在了 dan_mu.txt 文件中,方便后續(xù)分析。
繪制詞云圖
第一步先將剛才保存在 dan_mu.txt 文件中的彈幕讀取出來,放到了一個(gè) list 當(dāng)中:
# 讀取彈幕 txt 文件 with open("dan_mu.txt", encoding="utf-8") as f:txt = f.read() danmu_list = txt.split("\n")然后使用分詞工具對(duì)彈幕進(jìn)行分詞,我這里使用的分詞工具是最好的 Python 中文分詞組件 jieba ,沒有安裝過 jieba 的同學(xué)可以使用以下命令進(jìn)行安裝:
pip install jieba使用 jieba 對(duì)剛才獲得的彈幕 list 進(jìn)行分詞:
# jieba 分詞 danmu_cut = [jieba.lcut(item) for item in danmu_list]這樣,我們獲得了分詞后的 danmu_cut ,這個(gè)同樣是一個(gè) list 。
接著我們對(duì)分詞后的 danmu_cut 進(jìn)行下一項(xiàng)操作,去除停用詞:
# 獲取停用詞 with open("baidu_stopwords.txt",encoding="utf-8") as f:stop = f.read() stop_words = stop.split()# 去掉停用詞后的最終詞 s_data_cut = pd.Series(danmu_cut) all_words_after = s_data_cut.apply(lambda x:[i for i in x if i not in stop])這里我引入了一個(gè) baidu_stopwords.txt 文件,這個(gè)文件是百度停用詞庫,這里我找到了幾個(gè)常用的中文停用詞庫,來源: https://github.com/goto456/stopwords 。
| baidu_stopwords.txt | 百度停用詞表 | 
| hit_stopwords.txt | 哈工大停用詞表 | 
| scu_stopwords.txt | 四川大學(xué)機(jī)器智能實(shí)驗(yàn)室停用詞庫 | 
| cn_stopwords.txt | 中文停用詞表 | 
這里我使用的是百度停用詞表,大家可以根據(jù)自己的需要使用,也可以對(duì)這幾個(gè)停用詞表先做整合后再使用,主要的目的就是去除一些無需關(guān)注的詞,上面這幾個(gè)停用詞庫我都會(huì)提交到代碼倉庫,有需要的自取。
接著我們統(tǒng)計(jì)去除停用詞后的詞頻:
# 詞頻統(tǒng)計(jì) all_words = [] for i in all_words_after:all_words.extend(i) word_count = pd.Series(all_words).value_counts()最后一步就是生成我們的最終結(jié)果,詞云圖:
wordcloud.WordCloud(font_path='msyh.ttc',background_color="#fff",max_words=1000,max_font_size=200,random_state=42,width=900,height=1600 ).fit_words(word_count).to_file("wordcloud.png")最終結(jié)果就是下面這個(gè):
從上面這個(gè)詞云圖中可以看到,粉絲對(duì)「MOJITO」這首歌是真愛啊,出現(xiàn)頻率最高的就是 啊啊啊 和 愛 還有 粉 。
當(dāng)然哈,這個(gè) 粉 也有可能是說 MV 當(dāng)中那臺(tái)騷氣十足的粉色的老爺車。
還有一個(gè)出現(xiàn)頻率比較高的是 爺青回 ,我估計(jì)這個(gè)意思應(yīng)該是 爺?shù)那啻夯貋砝?,確實(shí),周董伴隨著我這個(gè)年齡段的人一路走來,做為一位 79 年的人現(xiàn)在已經(jīng)是 41 歲的「高齡」了,回首往昔,讓人唏噓不已。
當(dāng)年一首 「雙節(jié)棍」 火遍了中華大地,大街上的音像店整天都在循環(huán)這幾首歌,在學(xué)校上學(xué)的我這一代人,基本上是人人都能哼兩句,「快使用雙截棍,哼哼哈嘿」成了我們這一代人共有的回憶。
智能情感傾向分析
我們還可以對(duì)彈幕進(jìn)行一次情感傾向分析,這里我使用的是 「百度 AI 開放平臺(tái)」 的情感傾向分析接口。
百度 AI 開放平臺(tái)文檔地址:https://ai.baidu.com/ai-doc/NLP/zk6z52hds
首先是根據(jù)文檔接入 「百度 AI 開放平臺(tái)」 ,獲取 access_token ,代碼如下:
# 獲取 Baidu API access_token access_token_url = f'https://aip.baidubce.com/oauth/2.0/token?grant_type={grant_type}&client_id={client_id}&client_secret={client_secret}&'res = requests.post(access_token_url)access_token = res.json()['access_token']# 通用情感接口 # sentiment_url = f'https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?charset=UTF-8&access_token={access_token}' # 定制化情感接口 sentiment_url = f'https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify_custom?charset=UTF-8&access_token={access_token}'百度 AI 開放平臺(tái)有兩個(gè)情感分析接口,一個(gè)是通用的,還有一個(gè)是定制化的,我這里使用的是經(jīng)過訓(xùn)練的定制化的接口,如果沒有定制化的接口,使用通用的接口也沒有問題。
上面使用到的 grant_type , client_id , client_secret 這幾個(gè)參數(shù),大家注冊(cè)一下就能得到, 「百度 AI 開放平臺(tái)」 上的這些接口都有調(diào)用數(shù)量的限制,不過我們自己使用已經(jīng)足夠了。
然后讀取我們剛才保存的彈幕文本:
with open("dan_mu.txt", encoding="utf-8") as f:txt = f.read() danmu_cat = txt.split("\n")在調(diào)用接口獲得情感傾向之前,我們還需要做一件事情,對(duì)彈幕進(jìn)行一次處理,因?yàn)閺椖恢袝?huì)有一些 emoji 表情,而 emoji 直接請(qǐng)求百度的接口會(huì)返回錯(cuò)誤,這里我使用另一個(gè)工具包對(duì) emoji 表情進(jìn)行處理。
首先安裝工具包 emoji :
pip install emoji使用是非常簡單的,我們對(duì)彈幕數(shù)據(jù)使用 emoji 進(jìn)行一次處理:
import emojiwith open("dan_mu.txt", encoding="utf-8") as f:txt = f.read() danmu_list = txt.split("\n")for item in danmu_list:print(emoji.demojize(item))我們的彈幕數(shù)據(jù)中是有這樣的 emoji 表情的:
???????# 處理后: :red_heart::red_heart::red_heart::red_heart::red_heart::red_heart::red_heart:然后,我們就可以調(diào)用百度的情感傾向分析接口,對(duì)我們的彈幕數(shù)據(jù)進(jìn)行分析了:
# 情感計(jì)數(shù)器 optimistic = 0 neutral = 0 pessimistic = 0for danmu in danmu_list:# 因調(diào)用 QPS 限制,每次調(diào)用間隔 0.5stime.sleep(0.5)req_data = {'text': emoji.demojize(danmu)}# 調(diào)用情感傾向分析接口if len(danmu) > 0:r = requests.post(sentiment_url, json = req_data)print(r.json())for item in r.json()['items']:if item['sentiment'] == 2:# 正向情感optimistic += 1if item['sentiment'] == 1:# 中性情感neutral += 1if item['sentiment'] == 0:# 負(fù)向情感pessimistic += 1print('正向情感:', optimistic) print('中性情感:', neutral) print('負(fù)向情感:', pessimistic)attr = ['正向情感','中性情感','負(fù)向情感'] value = [optimistic, neutral, pessimistic]c = (Pie().add("", [list(attr) for attr in zip(attr, value)]).set_global_opts(title_opts=opts.TitleOpts(title="「MOJITO」彈幕情感分析")).render("pie_base.html") )最后的結(jié)果圖長這樣:
從最后的結(jié)果上來看,正向情感占比大約在 2/3 左右,而負(fù)向情感只有不到 1/4 ,看來大多數(shù)人看到周董的新歌還是滿懷激動(dòng)的心情。
不過這個(gè)數(shù)據(jù)不一定準(zhǔn)確,最多可以做一個(gè)參考。
源代碼
需要源代碼的同學(xué)可以在公眾號(hào)后臺(tái)回復(fù)「MOJITO」獲取。
您的掃碼關(guān)注,是對(duì)小編堅(jiān)持原創(chuàng)的最大鼓勵(lì):)總結(jié)
以上是生活随笔為你收集整理的MOJITO 发布一周,爬一波弹幕分析下的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: java utill scanner_j
- 下一篇: [置顶] 忆往昔,看今朝(2012-20
