python 爬取周董新歌《Mojito》MV彈幕,看看粉絲們都說了些啥

前言

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。

作者:黃偉/數據分析與統計學之美

PS:如有需要Python學習資料的小夥伴可以加點擊下方鏈接自行獲取http://t.cn/A6Zvjdun

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

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

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

1.B站彈幕的爬取

通過Chrome的開發者工具裏的Network頁面,可以找到B站彈幕數據的接口。如果你自己沒找到也沒關係,網上能也可找到相關的介紹。

爬取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")

結果如下:
在這裏插入圖片描述

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