Python 爬取周杰倫《Mojito》MV 彈幕,這個評論亮了!

BAT面試題連接已更新,之前下載失敗的筒子們回覆“面試”獲取!(程序員生活志)

6月12日凌晨0點,周杰倫最新單曲《Mojito》正式上線,僅上線1小時銷售量就超過百萬張,預計今天這首單曲的銷量仍然會繼續攀升。這次新歌的歌名叫做《Mojito》,翻譯成中文是莫吉托,一種巴西雞尾酒,怪不得觀看這首歌MV的時候,感受到一股很濃烈的異域風情呢。

杰倫的上一首單曲《說好不哭》是在2019.9發佈的,這首歌是與老搭檔方文山搭檔的歌曲,當時這首歌在QQ音樂上的銷量超過了1500萬張,創造歷史新高。而新歌《Mojito》則是與另外一位搭檔黃俊郎合作的單曲,相信這首歌肯定也會有不錯的銷量。

好了迴歸到正題,既然這首歌大家反應這麼大,那麼大家都是怎麼評論這首歌曲的呢?我們爬取了B站上面的彈幕數據,看看粉絲們都說了什麼。

 

B站彈幕的爬取

B站的網頁確實變化的很快,我還記得5月份的時候,彈幕的接口數據還找得到。然而今天我找了好久都沒有找到,難道是今天的狀態不行?沒關係,在網頁中雖然沒找的這個彈幕數據的接口,但是我們之前找到了,我們直接拿過來用就好了。

爬取B站彈幕數據的API:https://api.bilibili.com/x/v1/dm/list.so?oid=XXX

從上述網址中我們看到了一個叫做oid的東西,後面是一串數字,不同的網頁有着不同的數字串,因此我這裏用“XXX”代替了。我們現在就要思考的是,這個oid我們應該怎麼獲取呢?不要着急下面帶大家一步步查找。

我們要想知道這個oid是什麼,首先要獲取到cid。彈幕數據的接口我們雖然找不到,但是目錄頁接口還是可以找到的,網址如下。通過這個網址我們可以獲取到我們要的那個cid,cid這個鍵對應的值,就是我們要的oid數字串。

https://api.bilibili.com/x/player/pagelist?bvid=BV1PK4y1b7dt&jsonp=jsonp

注意:由於這個MV只有一個完整的視頻,所以這裏只有一個cid,如果一個視頻是分不同小節發佈的,這裏就會有多個cid,不同的cid代表不同的視頻。

我們將上面接口的url地址和拿到的oid數字串進行拼接,就可以得到這首MV彈幕的真正地址啦,現在把地址提供給大家。我們只需要請求這個網址,解析網頁後就可以獲取我們想要的數據啦。

https://api.bilibili.com/x/v1/dm/list.so?oid=201056987

這裏還有最後一點需要提醒大家的。觀察目錄頁的那個接口(網址如下),裏面有一串字符串BV1PK4y1b7dt,我們先不管這個參數是什麼,我們只關心這個字符串從哪裏來的呢?

https://api.bilibili.com/x/player/pagelist?bvid=BV1PK4y1b7dt&jsonp=jsonp

最後我們觀察這首MV的原始網址(網址如下),原來這個字符串就在這首MV的原始網址中。好了,說到這裏,我就將B站彈幕數據爬取的一些參數的來龍去脈,給大家講清楚了,下面我們開始代碼部分吧。

https://www.bilibili.com/video/BV1PK4y1b7dt?t=1

代碼如下:


 

 

import requests
import json
import chardet
import re
from pprint import pprint
# 1.根據bvid請求得到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.根據cid請求彈幕,解析彈幕得到最終的數據
"""
注意:嗶哩嗶哩的網頁現在已經換了,那個list.so接口已經找不到,但是我們現在記住這個接口就行了。
"""
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('<d.*?>(.*?)</d>')
    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)

結果如下:

 

詞雲圖的製作

# 1 導入相關庫
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()方法進行分詞
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 = [" ","道","說道","說"] + 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 詞頻統計
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)設置詞雲參數
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")

結果如下:

從詞雲圖可以看到,整個彈幕屏幕都是表達了粉絲對於《Mojito》這首歌的熱愛,可能有些詞語顯得有些莫名其妙,像震動、手機等詞語,但是看過MV的人都知道確實都是讚美之詞。

首先,啊啊啊這個感嘆詞出現的次數是最多的,難道大家是剛剛聽到這首歌,驚喜之情無法用言語來表達?只好借用這樣的感嘆詞來表達自己內心的激動?這可不是我的風格,我要是喜歡就會用直白的話表達出來。

其次,手機、震動這樣的詞出現的也很多。我剛剛看到這樣的詞語時候,我很莫名其妙。一首新歌MV和手機震動有啥關係呢?這原來是一個梗,恕我當時也沒怎麼關注,含義就是:周杰倫新歌銷量太好,網友調侃便說杰倫手機一直在震動。如果你也不知道這是一個什麼梗,提供一個網址給大家瞭解一下。

https://www.ixiumei.com/a/20190917/364084.shtml

我們還可以注意到,有一個詞的頻率出現次數也是很高的,那就是爺青回。哈哈,剛剛看到這個詞語的人肯定是很懵逼的,這是什麼意思呢?其實就是爺的青春回來了的意思。不得不說周杰倫的歌確實影響了我們這一代人,新歌一發布,不少人感嘆:杰倫,回不去了嗎?雖然我們的年紀在慢慢長大,但是我們卻始終習慣停留在青春的狀態。

當然像愛、好聽、粉、億遍這樣的詞語大家也都知道是什麼意思,我也就不詳細說明了,總的來說從整個詞雲圖來看,基本上是0差評。《Mojito》整首歌給我的感覺就是節奏歡快,周杰倫雖然成了無數人的青春,不少人也是感嘆青春回不去了嗎?但是在這個炎炎夏日聆聽這首歡快的歌曲,也是及其不錯的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章