MOJITO 發布一周,爬一波彈幕分析下

2021-02-25 極客挖掘機
MOJITO

文章技術一覽:

最近一直啥都沒寫,追個熱點都趕不上熱乎的,鄙視自己一下。

周董的新歌 「MOJITO」 發售(6 月 12 日的零點)至今大致過去了一周,翻開 B 站 MV 一看,播放量妥妥破千萬,彈幕破十萬,這人氣還真是槓槓的。

說實話, 「MOJITO」 這個名字對我來講有點超綱了,第一次見到完全不知道啥意思。

不過問題不大,沒有什麼是百度解決不了的,如果有,那就再加一個知乎。

MOJITO 的中文名是莫吉託,百度百科上是這麼介紹莫吉託的:

莫吉託(Mojito)是最有名的朗姆調酒之一。起源於古巴。傳統上,莫吉託是一種由五種材料製成的雞尾酒:淡朗姆酒、糖(傳統上是用甘蔗汁)、萊姆(青檸)汁、蘇打水和薄荷。最原始的古巴配方是使用留蘭香或古巴島上常見的檸檬薄荷。萊姆(青檸)與薄荷的清爽口味是為了與朗姆酒的烈性相互補,同時也使得這種透明無色的調酒成為夏日的熱門飲料之一。這種調酒有著相對低的酒精含量(大約10%)。

酒精度數在 10% 左右的話,姑且可以認為一種飲料吧。

當然,如果要開車的話就不能把 MOJITO 當成飲料了,酒精含量再低那也是酒精。

整個 MV 我翻來覆去的看了好幾遍, 「MOJITO」 這個東西除了在歌詞和名字中有出現,在 MV 當中一次都沒出現,毫無存在感。

爬取 B 站彈幕

彈幕數據的爬取比較簡單,我就不一步一步的抓請求給各位演示了,注意下面這幾個請求連接:

彈幕請求地址:

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

https://comment.bilibili.com/XXX.xml

第一個地址由於 B 站的網頁做了更換,現在在 Chrome 工具的 network 裡面已經找不到了,不過還可以用,這個是我之前找到的。

第二個地址來源於百度,我也不知道各路大神是從哪找出來這個地址的,供參考吧。

上面這兩個彈幕地址實際上都需要一個叫 oid 的東西,這個 oid 獲取方式如下:

首先可以找到一個目錄頁接口:

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

這個接口也是來源於 Chrome 的 network ,其中 bvid 這個參數來源於視頻地址,比如周董的這個 「MOJITO」 的 MV ,地址是 https://www.bilibili.com/video/BV1PK4y1b7dt ,那麼這個 bvid 的值就是最後那一部分 BV1PK4y1b7dt 。

接下來在 https://api.bilibili.com/x/player/pagelist?bvid=BV1PK4y1b7dt&jsonp=jsonp 這個接口中,我們可以看到返回的 json 參數,如下:

{
"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
}
}
]
}

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

當然,這裡的 cid 就是我們剛才想找的那個 oid ,把這個 cid 拼到剛才的連結上,可以得到 https://api.bilibili.com/x/v1/dm/list.so?oid=201056987 這樣一個地址,然後輸入到瀏覽器中,可以看到彈幕的返回數據,是一個 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 文件中,方便後續分析。

繪製詞雲圖

第一步先將剛才保存在 dan_mu.txt 文件中的彈幕讀取出來,放到了一個 list 當中:

# 讀取彈幕 txt 文件
with open("dan_mu.txt", encoding="utf-8") as f:
txt = f.read()
danmu_list = txt.split("\n")

然後使用分詞工具對彈幕進行分詞,我這裡使用的分詞工具是最好的 Python 中文分詞組件 jieba ,沒有安裝過 jieba 的同學可以使用以下命令進行安裝:

pip install jieba

使用 jieba 對剛才獲得的彈幕 list 進行分詞:

# jieba 分詞
danmu_cut = [jieba.lcut(item) for item in danmu_list]

這樣,我們獲得了分詞後的 danmu_cut ,這個同樣是一個 list 。

接著我們對分詞後的 danmu_cut 進行下一項操作,去除停用詞:

# 獲取停用詞
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])

這裡我引入了一個 baidu_stopwords.txt 文件,這個文件是百度停用詞庫,這裡我找到了幾個常用的中文停用詞庫,來源:https://github.com/goto456/stopwords 。

詞表文件詞表名baidu_stopwords.txt百度停用詞表hit_stopwords.txt哈工大停用詞表scu_stopwords.txt四川大學機器智能實驗室停用詞庫cn_stopwords.txt中文停用詞表

這裡我使用的是百度停用詞表,大家可以根據自己的需要使用,也可以對這幾個停用詞表先做整合後再使用,主要的目的就是去除一些無需關注的詞,上面這幾個停用詞庫我都會提交到代碼倉庫,有需要的自取。

接著我們統計去除停用詞後的詞頻:

# 詞頻統計
all_words = []
for i in all_words_after:
all_words.extend(i)
word_count = pd.Series(all_words).value_counts()

最後一步就是生成我們的最終結果,詞雲圖:

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

最終結果就是下面這個:

從上面這個詞雲圖中可以看到,粉絲對「MOJITO」這首歌是真愛啊,出現頻率最高的就是 啊啊啊 和 愛 還有 粉 。

當然哈,這個 粉 也有可能是說 MV 當中那臺騷氣十足的粉色的老爺車。

還有一個出現頻率比較高的是 爺青回 ,我估計這個意思應該是 爺的青春回來啦 ,確實,周董伴隨著我這個年齡段的人一路走來,做為一位 79 年的人現在已經是 41 歲的「高齡」了,回首往昔,讓人唏噓不已。

當年一首 「雙節棍」 火遍了中華大地,大街上的音像店整天都在循環這幾首歌,在學校上學的我這一代人,基本上是人人都能哼兩句,「快使用雙截棍,哼哼哈嘿」成了我們這一代人共有的回憶。

智能情感傾向分析

我們還可以對彈幕進行一次情感傾向分析,這裡我使用的是 「百度 AI 開放平臺」 的情感傾向分析接口。

百度 AI 開放平臺文檔地址:https://ai.baidu.com/ai-doc/NLP/zk6z52hds

首先是根據文檔接入 「百度 AI 開放平臺」 ,獲取 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 開放平臺有兩個情感分析接口,一個是通用的,還有一個是定製化的,我這裡使用的是經過訓練的定製化的接口,如果沒有定製化的接口,使用通用的接口也沒有問題。

上面使用到的 grant_type , client_id , client_secret 這幾個參數,大家註冊一下就能得到, 「百度 AI 開放平臺」 上的這些接口都有調用數量的限制,不過我們自己使用已經足夠了。

然後讀取我們剛才保存的彈幕文本:

with open("dan_mu.txt", encoding="utf-8") as f:
txt = f.read()
danmu_cat = txt.split("\n")

在調用接口獲得情感傾向之前,我們還需要做一件事情,對彈幕進行一次處理,因為彈幕中會有一些 emoji 表情,而 emoji 直接請求百度的接口會返回錯誤,這裡我使用另一個工具包對 emoji 表情進行處理。

首先安裝工具包 emoji :

pip install emoji

使用是非常簡單的,我們對彈幕數據使用 emoji 進行一次處理:

import emoji

with 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))

我們的彈幕數據中是有這樣的 emoji 表情的:

❤❤❤❤❤❤❤

# 處理後:
:red_heart::red_heart::red_heart::red_heart::red_heart::red_heart::red_heart:

然後,我們就可以調用百度的情感傾向分析接口,對我們的彈幕數據進行分析了:

# 情感計數器
optimistic = 0
neutral = 0
pessimistic = 0

for danmu in danmu_list:
# 因調用 QPS 限制,每次調用間隔 0.5s
time.sleep(0.5)
req_data = {
'text': emoji.demojize(danmu)
}
# 調用情感傾向分析接口
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 += 1
if item['sentiment'] == 1:
# 中性情感
neutral += 1
if item['sentiment'] == 0:
# 負向情感
pessimistic += 1

print('正向情感:', optimistic)
print('中性情感:', neutral)
print('負向情感:', pessimistic)

attr = ['正向情感','中性情感','負向情感']
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")
)

最後的結果圖長這樣:

從最後的結果上來看,正向情感佔比大約在 2/3 左右,而負向情感只有不到 1/4 ,看來大多數人看到周董的新歌還是滿懷激動的心情。

不過這個數據不一定準確,最多可以做一個參考。

原始碼

需要原始碼的同學可以在公眾號後臺回復「MOJITO」獲取。

相關焦點

  • Python 爬取周杰倫《Mojito》MV 彈幕,這個評論亮了!
    作者 | 黃偉呢來源 | 數據分析與統計學之美6月12日凌晨0點,周杰倫最新單曲《Mojito》正式上線,僅上線1小時銷售量就超過百萬張
  • Python爬取並分析 201865 條《隱秘的角落》彈幕
    今天我們就來用Python爬一爬這部熱門劇的彈幕,看看大家都在聊什麼?由於《隱秘的角落》是在愛奇藝獨播,所以數據從愛奇藝下手最直接。除了愛奇藝,可以考慮使用豆瓣、微博、知乎(電視劇數據分析 · 萬能三件套)的數據。
  • Python 爬取 394452 條《都挺好》彈幕數據,發現彈幕比劇還精彩?
    劇很精彩,但追劇界有句俗話說得好:「彈幕往往比劇更精彩」,為了讓精彩延續下去,我終究沒能忍住對(騰訊視頻)彈幕下手。經過一番折騰,發現彈幕是 JSON 格式動態加載的,而且加載得非常有規律,30 秒一發(80-100 條),多出的會隱藏。共計爬取了 394452 條彈幕(雨露均沾,每集平均 8575 條,每 30s 的間隔爬取),來挖一挖彈幕這個寶藏。
  • 用Python爬取B站、騰訊視頻、芒果TV和愛奇藝視頻彈幕
    不知道大家看視頻的時候會不會點開彈幕,於我而言,彈幕是視頻內容的良好補充,是一個組織良好的評論序列。通過分析彈幕,我們可以快速洞察廣大觀眾對於視頻的看法。 J哥通過一個關於《八佰》的視頻彈幕數據,繪製了如下詞雲圖,感覺效果還是可以的。 海量的彈幕數據不僅可以繪製此類詞雲圖,還可以調用百度AI進行情感分析。那麼,我們該如何獲取彈幕數據呢?
  • 周杰倫新歌《mojito》發布,周董又雙叒叕瘦了
    就在6月12日凌晨0點,周杰倫正式發布了他的新歌《mojito》,一度引起了QQ音樂、酷狗音樂等音樂平臺的癱瘓。就在網友們紛紛討論周杰倫的新歌如何的時候,摸魚哥我卻注意到另外一件事——周杰倫瘦了。這可是件大事!
  • Python 爬取 201865 條《隱秘的角落》彈幕,發現看劇不如爬山?
    如果沒爬過愛奇藝,可以考慮使用豆瓣、微博、知乎(電視劇數據分析 · 萬能三件套)的數據爬蟲劇很精彩,但追劇界有句俗話說得好:「彈幕往往比劇更精彩」,為了讓精彩延續下去,我終究沒能忍住對彈幕下手。[1]愛奇藝的彈幕數據是以 .z 形式的壓縮文件存在的,先獲取 tvid 列表,再根據 tvid 獲取彈幕的壓縮文件,最後對其進行解壓及存儲,大概就是這樣一個過程。這裡參考了「數據兔小白[2]的代碼,我又修改後實現分集爬取所有彈幕。
  • 周杰倫新歌《mojito》凌晨發布,歌迷徹夜難眠,單曲循環聽一夜
    周杰倫新歌《mojito》單曲在6月12日凌晨發布正式上線,除了音樂版同時還有精心拍攝的MV可供觀看,據QQ音樂數據顯示,預約人數多達300萬,並且導致伺服器短暫崩潰,為聽周杰倫新歌很多歌迷可謂是徹夜不眠。
  • 爬取24w+彈幕信息後,我果斷去追劇了
    本文以最近熱播排行榜第一名的《流金歲月》為例子,手把手教你如何獲取愛奇藝電視劇彈幕數據。尋找彈幕信息愛奇藝的彈幕數據是以.z形式的壓縮文件存在,先通過以下步驟找到彈幕url, tvid列表,再獲取壓縮文件。利用工具對獲取的壓縮文件進行解壓、處理、存儲及分析。
  • 檢驗版《mojito》,周董聽了也上頭
    2020年新冠疫情期間,中央紀委國家監委網站曾發布過一個微視頻《看不見的英雄》。 作為一名檢驗人,我想通過改編《mojito》這種歡快的方式,讓大家能夠看到檢驗科、以及對檢驗科的日常工作有進一步的了解認識。戴上口罩,我們盡心竭力;摘下口罩,我們意氣風發!
  • Python分析《哈哈哈哈哈》47687條彈幕,看看大家都在說些啥!
    本文通過爬取騰訊視頻《哈哈哈哈哈》47687條彈幕,進行可視化分析和情感分析,完整代碼後臺回復「哈哈哈哈哈」即可自動獲取。《哈哈哈哈哈》目前已播出10期,本文爬取了第10期上下兩篇彈幕。= pd.DataFrame({'用戶名':[name],'彈幕':[content],'會員等級':[user_degree],                              '發布時間':[timepoint],'彈幕點讚':[upcount],'彈幕id':[comment_id]})        df = pd.concat([df,cache])df.to_csv
  • Python爬《沉默的真相》3萬+彈幕,告訴你這劇到底「香」在哪?
    本文數據分析思路及步驟如下圖所示,閱讀本文需要10min,你可添加小數獲取彈幕數據進行測試。《沉默的真相》共12集,分集爬取,共生成12個csv格式的彈幕數據文件,保存在danmu文件夾中。目前常見的情感極性分析方法主要是兩種:基於情感詞典的方法和基於機器學習的方法。本文主要運用Python的第三方庫SnowNLP對彈幕內容進行情感分析,使用方法很簡單,計算出的情感score表示語義積極的概率,越接近0情感表現越消極,越接近1情感表現越積極。
  • 周杰倫凌晨發布單曲《Mojito》,導致QQ音樂癱瘓,粉絲點評各不同
    周杰倫12日凌晨發布新歌《Mojito》,你的朋友圈有沒有被刷屏?仿佛雙十一零點的秒殺,又如農曆新年的零點祝福,粉絲們都踩著點發送。反正,早上打開朋友圈,整個朋友圈都被他的新歌給刷屏了。其中不乏一些忠實粉絲,也許轉發是正在熬夜的夜貓子,塗個新鮮。
  • 百萬彈幕分析:關於五五開開掛,彈幕到底講了啥?
    本文目的是拋開那些扎眼的彩色彈幕,落實關心到那些普通人的直播彈幕發言,給大家統計講一講他們對此事的看法。統計時間:12.3-12.4日(不包括黑屏彈幕)在這兩天,五五開的房間彈幕量爆炸,有87萬條彈幕。
  • 《Mojito》和弦譜+教學視頻+和聲分析來了!Neo老師:我好累
    哎呀妞提前幾天就微信轟炸我,軟磨硬泡,喊我抽時間來給大家分析這首歌,所以今天我啥其他活也沒幹,把這首歌的譜子和教學視頻都肝出來了!先來看看演奏效果:加我助教微信funkydash,可以獲取完整高清譜加好友時,記得備註mojito哦~教學視頻在這裡:以下是文字版的詳細講解。
  • 周杰倫新歌《mojito》涉嫌抄襲?總有人盼著周杰倫晚節不保
    因為,不定時營業的周杰倫時隔半年之後,終於又發了新歌《mojito》,而周杰倫上一首歌曲還是為老婆昆凌主演的電影《天火》獻唱的《我是如此相信》。《mojito》這首歌由黃俊郎作詞,周杰倫作曲,MV遠赴古巴拍攝,有著濃濃的古巴風格。很多熟悉周杰倫的粉絲們都知道,周杰倫對古董車有著近乎痴迷的熱愛。
  • Python鬥魚虎牙直播平臺視頻彈幕
    基本開發環境 Python 3.6 Pycharm 相關模塊的使用 鬥魚直播視頻彈幕爬取分析
  • 公然叫板各路Mojito,麻煩給我倫哥來一塊Mojito芝士蛋糕
    前些日子,周杰倫發布他的最新單曲《Mojito》,「麻煩給我的愛人來一杯Mojito,我喜歡閱讀她微醺時的眼眸,而我的咖啡,糖不用太多,這世界已經因為她甜得過頭。」歡快復古的拉丁小調,豔麗神秘的古巴風情,讓人忍不住幻想自己手持一杯mojito,開著亮麗老爺車沐浴在陽光下的場景(當然這僅限於幻想!
  • 誰說周杰倫新歌《mojito》MV沒有女主角?只能說你沒有用心看
    周杰倫發新歌了,周杰倫最新發布一支《mojito》,很多歌迷表示周杰倫的新歌MV沒有女主角,其實說沒有女主角的人,請你仔細看清楚點,女主的身影貫穿了整首歌的始終。有人說周杰倫的以往的歌曲都會有女主角,以前的廣為人知的《告白氣球》的女主角nana混血美豔了多少人的心靈、《布拉格廣場》中的女主蔡依林、《不能說的秘密》桂綸鎂,還有去年發布的一支歌曲
  • 周杰倫新歌Mojito刷爆朋友圈!但Mojito的英語發音,真的是「摸雞頭...
    > 麻煩給我的愛人來一杯Mojito 我喜歡閱讀她微醺時的眼眸 而我的咖啡 糖不用太多 這世界已經因為她甜得過頭 …… 6月12日,周董全新單曲Mojito正式發布
  • 周董新歌裡的mojito,究竟是什麼
    6月12日,周董發布了最新單曲《MOJITO》,再次引爆了他的歌迷。那麼問題來了,莫吉託(mojito)究竟是什麼呢?我們先來看看《MOJITO》歌詞的第一句:麻煩給我的愛人來一杯Mojito我喜歡閱讀她微醺時的眼眸其實,莫吉託(mojito)是一種源自古巴的雞尾酒。