用 Python 爬取分析周杰倫《Mojito》MV彈幕

2020年6月12日凌晨0點(diǎn),Jay Chou最新單曲《Mojito》正式上線,僅上線1小時(shí)銷(xiāo)售量就超過(guò)百萬(wàn)張,預(yù)計(jì)今天這首單曲的銷(xiāo)量仍然會(huì)繼續(xù)攀升。這次新歌的歌名叫做《Mojito》,翻譯成中文是莫吉托,一種巴西雞尾酒,怪不得觀看這首歌MV的時(shí)候,感受到一股很濃烈的異域風(fēng)情呢。

杰倫的上一首單曲《說(shuō)好不哭》是在2019.9發(fā)布的,這首歌是與老搭檔方文山搭檔的歌曲,當(dāng)時(shí)這首歌在QQ音樂(lè)上的銷(xiāo)量超過(guò)了1500萬(wàn)張,創(chuàng)造歷史新高。而新歌《Mojito》則是與另外一位搭檔黃俊郎合作的單曲,相信這首歌肯定也會(huì)有不錯(cuò)的銷(xiāo)量。
好了回歸到正題,既然這首歌大家反應(yīng)這么大,那么大家都是怎么評(píng)論這首歌曲的呢?我們爬取了B站上面的彈幕數(shù)據(jù),看看粉絲們都說(shuō)了什么。
1.B站彈幕的爬取
B站的網(wǎng)頁(yè)確實(shí)變化的很快,我還記得5月份的時(shí)候,彈幕的接口數(shù)據(jù)還找得到。然而今天我找了好久都沒(méi)有找到,難道是今天的狀態(tài)不行?沒(méi)關(guān)系,在網(wǎng)頁(yè)中雖然沒(méi)找的這個(gè)彈幕數(shù)據(jù)的接口,但是我們之前找到了,我們直接拿過(guò)來(lái)用就好了。
爬取B站彈幕數(shù)據(jù)的API:https://api.bilibili.com/x/v1/dm/list.so?oid=XXX
從上述網(wǎng)址中我們看到了一個(gè)叫做oid的東西,后面是一串?dāng)?shù)字,不同的網(wǎng)頁(yè)有著不同的數(shù)字串,因此我這里用“XXX”代替了。我們現(xiàn)在就要思考的是,這個(gè)oid我們應(yīng)該怎么獲取呢?不要著急下面帶大家一步步查找。
我們要想知道這個(gè)oid是什么,首先要獲取到cid。彈幕數(shù)據(jù)的接口我們雖然找不到,但是目錄頁(yè)接口還是可以找到的,網(wǎng)址如下。通過(guò)這個(gè)網(wǎng)址我們可以獲取到我們要的那個(gè)cid,cid這個(gè)鍵對(duì)應(yīng)的值,就是我們要的oid數(shù)字串。
https://api.bilibili.com/x/player/pagelist?bvid=BV1PK4y1b7dt&jsonp=jsonp

注意:由于這個(gè)MV只有一個(gè)完整的視頻,所以這里只有一個(gè)cid,如果一個(gè)視頻是分不同小節(jié)發(fā)布的,這里就會(huì)有多個(gè)cid,不同的cid代表不同的視頻。
我們將上面接口的url地址和拿到的oid數(shù)字串進(jìn)行拼接,就可以得到這首MV彈幕的真正地址啦,現(xiàn)在把地址提供給大家。我們只需要請(qǐng)求這個(gè)網(wǎng)址,解析網(wǎng)頁(yè)后就可以獲取我們想要的數(shù)據(jù)啦。
https://api.bilibili.com/x/v1/dm/list.so?oid=201056987

這里還有最后一點(diǎn)需要提醒大家的。觀察目錄頁(yè)的那個(gè)接口(網(wǎng)址如下),里面有一串字符串BV1PK4y1b7dt,我們先不管這個(gè)參數(shù)是什么,我們只關(guān)心這個(gè)字符串從哪里來(lái)的呢?
https://api.bilibili.com/x/player/pagelist?bvid=BV1PK4y1b7dt&jsonp=jsonp
最后我們觀察這首MV的原始網(wǎng)址(網(wǎng)址如下),原來(lái)這個(gè)字符串就在這首MV的原始網(wǎng)址中。好了,說(shuō)到這里,我就將B站彈幕數(shù)據(jù)爬取的一些參數(shù)的來(lái)龍去脈,給大家講清楚了,下面我們開(kāi)始代碼部分吧。
https://www.bilibili.com/video/BV1PK4y1b7dt?t=1
代碼如下:
import?requests
import?json
import?chardet
import?re
from?pprint?import?pprint
#?1.根據(jù)bvid請(qǐng)求得到cid
def?get_cid():
????url?=?'https://api.bilibili.com/x/player/pagelist?bvid=BV1PK4y1b7dt&jsonp=jsonp'
????res?=?requests.get(url).text
????json_dict?=?json.loads(res)
????#pprint(json_dict)
????return?json_dict["data"][0]["cid"]
#?2.根據(jù)cid請(qǐng)求彈幕,解析彈幕得到最終的數(shù)據(jù)
"""
注意:?jiǎn)袅▎袅ǖ木W(wǎng)頁(yè)現(xiàn)在已經(jīng)換了,那個(gè)list.so接口已經(jīng)找不到,但是我們現(xiàn)在記住這個(gè)接口就行了。
"""
def?get_data(cid):
????final_url?=?"https://api.bilibili.com/x/v1/dm/list.so?oid="?+?str(cid)
????final_res?=?requests.get(final_url)
????final_res.encoding?=?chardet.detect(final_res.content)['encoding']
????final_res?=?final_res.text
????pattern?=?re.compile('(.*?)' )
????data?=?pattern.findall(final_res)
????#pprint(final_res)
????return?data
#?3.保存彈幕列表
def?save_to_file(data):
????with?open("dan_mu.txt",?mode="w",?encoding="utf-8")?as?f:
????????for?i?in?data:
????????????f.write(i)
????????????f.write("\n")
cid?=?get_cid()
data?=?get_data(cid)
save_to_file(data)
結(jié)果如下:
2.詞云圖的制作
#?1?導(dǎo)入相關(guān)庫(kù)
import?pandas?as?pd
import?jieba
from?wordcloud?import?WordCloud
import?matplotlib.pyplot?as?plt
from?imageio?import?imread
import?warnings
warnings.filterwarnings("ignore")
#?2?讀取文本文件,并使用lcut()方法進(jìn)行分詞
with?open("dan_mu.txt",encoding="utf-8")?as?f:
????txt?=?f.read()
txt?=?txt.split()
data_cut?=?[jieba.lcut(x)?for?x?in?txt]
data_cut
#?3?讀取停用詞
with?open(r"G:\6Tipdm\wordcloud\data\stoplist.txt",encoding="utf-8")?as?f:
????stop?=?f.read()
stop?=?stop.split()
stop?=?["?","道","說(shuō)道","說(shuō)"]?+?stop
#?4?去掉停用詞之后的最終詞
s_data_cut?=?pd.Series(data_cut)
all_words_after?=?s_data_cut.apply(lambda?x:[i?for?i?in?x?if?i?not?in?stop])
#?5?詞頻統(tǒng)計(jì)
all_words?=?[]
for?i?in?all_words_after:
????all_words.extend(i)
word_count?=?pd.Series(all_words).value_counts()
#?6?詞云圖的繪制
#?1)讀取背景圖片
back_picture?=?imread(r"G:\6Tipdm\wordcloud\jay1.jpg")
# 2)設(shè)置詞云參數(shù)
wc?=?WordCloud(font_path="G:\\6Tipdm\\wordcloud\\simhei.ttf",
???????????????background_color="white",
???????????????max_words=2000,
???????????????mask=back_picture,
???????????????max_font_size=200,
???????????????random_state=42
??????????????)
wc2?=?wc.fit_words(word_count)
#?3)繪制詞云圖
plt.figure(figsize=(16,8))
plt.imshow(wc2)
plt.axis("off")
plt.show()
wc.to_file("ciyun.png")
結(jié)果如下:
從詞云圖可以看到,整個(gè)彈幕屏幕都是表達(dá)了粉絲對(duì)于《Mojito》這首歌的熱愛(ài),可能有些詞語(yǔ)顯得有些莫名其妙,像震動(dòng)、手機(jī)等詞語(yǔ),但是看過(guò)MV的人都知道確實(shí)都是贊美之詞。
首先,啊啊啊這個(gè)感嘆詞出現(xiàn)的次數(shù)是最多的,難道大家是剛剛聽(tīng)到這首歌,驚喜之情無(wú)法用言語(yǔ)來(lái)表達(dá)?只好借用這樣的感嘆詞來(lái)表達(dá)自己內(nèi)心的激動(dòng)?這可不是我的風(fēng)格,我要是喜歡就會(huì)用直白的話表達(dá)出來(lái)。
其次,手機(jī)、震動(dòng)這樣的詞出現(xiàn)的也很多。我剛剛看到這樣的詞語(yǔ)時(shí)候,我很莫名其妙。一首新歌MV和手機(jī)震動(dòng)有啥關(guān)系呢?這原來(lái)是一個(gè)梗,恕我當(dāng)時(shí)也沒(méi)怎么關(guān)注,含義就是:周杰倫新歌銷(xiāo)量太好,網(wǎng)友調(diào)侃便說(shuō)杰倫手機(jī)一直在震動(dòng)。如果你也不知道這是一個(gè)什么梗,提供一個(gè)網(wǎng)址給大家了解一下。
https://www.ixiumei.com/a/20190917/364084.shtml
我們還可以注意到,有一個(gè)詞的頻率出現(xiàn)次數(shù)也是很高的,那就是爺青回。哈哈,剛剛看到這個(gè)詞語(yǔ)的人肯定是很懵逼的,這是什么意思呢?其實(shí)就是爺?shù)那啻夯貋?lái)了的意思。不得不說(shuō)周杰倫的歌確實(shí)影響了我們這一代人,新歌一發(fā)布,不少人感嘆:杰倫,回不去了嗎?雖然我們的年紀(jì)在慢慢長(zhǎng)大,但是我們卻始終習(xí)慣停留在青春的狀態(tài)。

當(dāng)然像愛(ài)、好聽(tīng)、粉、億遍這樣的詞語(yǔ)大家也都知道是什么意思,我也就不詳細(xì)說(shuō)明了,總的來(lái)說(shuō)從整個(gè)詞云圖來(lái)看,基本上是0差評(píng)。《Mojito》整首歌給我的感覺(jué)就是節(jié)奏歡快,周杰倫雖然成了無(wú)數(shù)人的青春,不少人也是感嘆青春回不去了嗎?但是在這個(gè)炎炎夏日聆聽(tīng)這首歡快的歌曲,也是及其不錯(cuò)的。
推薦閱讀


點(diǎn)擊下方閱讀原文加入社區(qū)會(huì)員
點(diǎn)贊鼓勵(lì)一下

