Python告訴你:從《入海》到《消愁》毛不易的歌裡都在唱些什麼?

2021-01-07 CDA數據分析師

【導語】:今天我們來聊聊——B站聯合毛不易發布的畢業季主題曲《入海》,以及背後不一樣的毛不易。Python技術部分請看第三部分。

Show me data,用數據說話!今天我們聊一聊 毛不易的《入海》,沒錯,還是那個B站,在520這個既浪漫且有營銷價值的一天又「搞事情」了。

5月20日, B站聯合毛不易發布畢業季主題曲《入海》。這首歌主題是「獻給即將或已經畢業的人們」,歌曲MV中以主人公畢業的時候為原點,追憶過去,並用大量篇幅展現普通人畢業後的社會生活。

這首歌一經發布就在B站引爆了話題點,截止到5月24日在B站播放量達到了800萬+,收穫了5.2萬彈幕,最高全站日排行1名。

今天我們就帶你來解讀這首《入海》,以及背後不一樣的毛不易。

01、毛不易的歌裡,都喜歡唱些什麼?

毛不易,本名王維家。本來畢業於杭州師範大學護理專業的他一直有個歌手夢。在2017年,參加騰訊視頻選秀音樂娛樂節目《明日之子》,獲得全國總決賽冠軍,從而正式進入演藝圈。誰又能想到最後拿到冠軍是這個長相平平,沒有什麼優勢,甚至有點害羞憨厚的毛不易了。

隨著《消愁》《像我這樣的人》等歌曲的大火,毛不易這個名字也被越來越多的人知曉。同時在今年鵝廠的女團選秀節目《創造營2020》中,毛不易更是以導師的身份加入,呆萌的毛老師這次也收穫了不少的粉絲。

聽著《消愁》裡的「一杯敬朝陽,一杯敬月光「,大概是因為才華,毛不易在這個年紀能寫出人生的無奈和糾葛,這是一種大的勇氣。

那麼毛不易的歌裡都在唱些什麼呢?下面讓我們來盤一盤:

我們分析整理了毛不易在網易雲音樂的歌曲,一共83首,歌詞字數加起來45577字,我們用Python對這些歌詞進行分析。

歌曲時長分布

首先在歌曲時長方面,時長為4-5分鐘的最多高達43.9%,3-4分鐘為29.27%,2-3分鐘的為13.41%。要知道一般歌曲時長多為3分鐘左右,看來毛不易的歌時長還是偏長的。

歌曲正向情感得分

我們使用boson庫對每首歌的歌詞的情感進行打分,分數介於0~100分,高於50分為積極,分數越高,積極傾向性越高。從分布圖可以看出,在83首歌曲中,大部分的歌曲正向積極情感為主。

毛不易最喜歡的詞TOP15

毛不易最喜歡的歌裡最喜歡用哪些詞呢?我們分析整理得出了歌詞中出現頻率最高的TOP15。可以看到"等待"、"生活"、"時光"等詞出現頻率最高,位列前三。

"慢慢"、"遇見"、"江水"、"角落"等比較文藝的詞也上榜了。有意思的是"有錢"出現頻率也較高,位列第四。

02、《入海》全站日排名第一,這首獻給畢業季的歌好在哪兒?

我們使用Python獲取並分析了B站上《入海》這首MV的評論數據,經過去重之後得到19099條樣本,下面讓我們看到評論的具體分析。

評論用戶性別佔比

首先,在評論用戶性別佔比方面,男性用戶佔比略高,男性用戶佔比54.69%,女性用戶佔比45.31%。

評論用戶客戶端分布

那麼看《入海》的用戶在看視頻時都用的什麼行動裝置呢?經過分析發現,用iphone的用戶佔了很大的比例,遠超Andrio系統的用戶。第三位是使用ipad的用戶。

評論用戶等級分布

同時我們知道,b站上用戶因為參與程度等因素,等級從0-6分布,數字越大等級越高。在《入海》這首歌的評論用戶上,評論中5級的佔比最高為36.1%,其次是4級佔比26.31%,6級佔比僅為3.24%,這也是因為畢竟要成為六級大佬實在太難了。

各時段評論人數

在評論時間段方面,《入海》是在5月20日 8:30發布的,在發布後評論的人數越來越多,在12點左右評論達到最高峰,這個時段共有2萬7千餘人進行評論,遠高於其他時段,之後隨著時間推移評論人數也越來越少,趨於平緩。

評論關鍵詞TOP15

在評論中大家說得最多的是什麼呢?

經過分析整理可以看到,"畢業"是提到最多的詞,其次第二位是"後浪",畢竟作為同樣聚焦在年輕人身上的話題,這次的《入海》很容易讓大家聯繫到5月4日B站發布的《後浪》視頻。

同時,"快樂"、"入海"、"大哭"等詞也被頻頻提到。

03、Python分析:B站《入海》評論數據

我們使用Python獲取並分析了B站上《入海》這首MV的評論數據。經過去重之後得到19099條樣本,來分析一下這周MV的用戶的評論信息。整個分析流程分為以下幾步:

數據獲取數據整理數據可視化

數據獲取

在獲取視頻評論之前,我們首要做的就是分析其網頁結構,尋找目標數據,也就是我們要評論的數據在哪裡。

經過抓包分析,在network-json選項卡下,很容易找到了數據傳輸的地址,經過分析和精簡,目標數據的url連結為:

https://api.bilibili.com/x/v2/reply?&type=1&oid=795637027&pn=1

其中oid是視頻的專屬oid,pn是頁面數。

由上圖可看出,其評論數據是以json數據形式存在於網頁端的,目前顯示的頁數是976頁,每頁20條評論,追評數據暫時不做抓取。

接下來,就爬取思路很明確,從第一頁的JSON文件開始,爬完20條評論,循環pn頁數,直到爬完所有的評論數據。

代碼如下:

# 導入所需包import requestsimport jsonimport pandas as pdimport timedef get_bili_comment_one(url): """ 功能:定義函數,獲取一頁的信息 """ # 添加headers headers = { 'Host': 'api.bilibili.com', 'Referer': 'https://www.bilibili.com/video/BV1YZ4y1j7s5', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36' } # 添加cookies cookies = { "cookie": "複製您的瀏覽器cookie信息" } # 發起請求 try: r = requests.get(url, headers=headers, cookies=cookies, timeout=3) except Exception as e: print(e) r = requests.get(url, headers=headers, cookies=cookies, timeout=3) # 解析為字典 r_json = json.loads(r.text) # 提取信息 replies_data = r_json['data']['replies'] # 用戶名 user_name = [i['member'].get('uname') for i in replies_data] # 性別 sex = [i['member'].get('sex') for i in replies_data] # 籤名 sign = [i['member'].get('sign') for i in replies_data] # 用戶等級 current_level = [i['member']['level_info'].get('current_level') for i in replies_data] # 評論內容 content = [i['content'].get('message') for i in replies_data] # 用戶設備 device = [i['content'].get('device') for i in replies_data] # 評論時間 content_time = [i.get('ctime') for i in replies_data] # 回複數 reply_count = [i['rcount'] for i in replies_data] # 存儲數據 df = pd.DataFrame({ 'user_name': user_name, 'sex': sex, 'sign': sign, 'current_level': current_level, 'content': content, 'device': device, 'content_time': content_time, 'reply_count': reply_count }) return dfdef get_bili_comment_all(oid, num): """ 功能:定義函數,獲取B站視頻指定頁評論信息 """ # 循環構建URL df_all = pd.DataFrame() for page_num in range(1, num): try: # 構建URL url = 'https://api.bilibili.com/x/v2/reply?&pn={}&type=1&oid={}&sort=2'.format(page_num, oid) # 調用函數 df = get_bili_comment_one(url) # 判斷 if df.shape[0] == 0: break else: # 循環追加 df_all = df_all.append(df, ignore_index=True) # 列印進度 print('我正在獲取第{}頁的信息'.format(page_num)) except: break # 休眠一秒 time.sleep(0.5) return df_all# 《入海》bilibili X 毛不易 | 躍入人海,各有風雨燦爛df = get_bili_comment_all(oid='795637027', num=973)

獲取到的數據以DataFrame的形式存儲,格式如下:

# 讀入數據df.head()

數據集有19099個樣本,8個欄位,欄位名稱為:用戶名、用戶性別、用戶籤名、用戶等級、用戶評論、設備名稱、評論時間、點讚數。

df.info()

<class 'pandas.core.frame.DataFrame'>RangeIndex: 19099 entries, 0 to 19098Data columns (total 8 columns):user_name 19099 non-null objectsex 19099 non-null objectsign 9896 non-null objectcurrent_level 19099 non-null int64content 19099 non-null objectdevice 4159 non-null objectcontent_time 19099 non-null int64reply_count 19099 non-null int64dtypes: int64(3), object(5)memory usage: 1.2+ MB

數據整理

此處我們主要對以上獲取的數據集進行部分清洗工作以方便後續的處理:

重複值處理類型轉化時間戳數據處理評論數據jieba分詞處理-(代碼暫略)

# 導入包import numpy as np import pandas as pd# 讀入數據df = pd.read_excel('../data/B站評論數據-入海5.23.xlsx')# 去重df = df.drop_duplicates()# 轉換類型df['content'] = [str(i) for i in df.content] # 定義轉換時間def transform_timestamp(time_second): timeArray = time.localtime(time_second) otherStyleTime = time.strftime('%Y-%m-%d %H:%M:%S', timeArray) return otherStyleTime# 提取時間df['content_time'] = df['content_time'].apply(lambda x:transform_timestamp(x))

數據可視化分析

我們將進行以下部分的數據可視化分析,首先導入所需包,其中pyecharts用於繪製動態圖形,stylecloud用於繪製詞雲圖,關鍵代碼如下:

from pyecharts.charts import Bar, Pie, Line, WordCloud, Pagefrom pyecharts import options as opts from pyecharts.globals import SymbolTypeimport stylecloudfrom IPython.display import Image

評論性別佔比

# 總體評分分布sex_num = df['sex'].value_counts()sex_num.drop('保密', inplace=True) # 繪製餅圖data_pair = [list(z) for z in zip(sex_num.index.tolist(), sex_num.values.tolist())]# 繪製餅圖pie1 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px'))pie1.add('', data_pair, radius=['35%', '60%'])pie1.set_global_opts(title_opts=opts.TitleOpts(title='評論用戶性別佔比'), legend_opts=opts.LegendOpts(orient='vertical', pos_top='15%', pos_left='2%'))pie1.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))pie1.set_colors(['#EF9050', '#3B7BA9', '#6FB27C'])pie1.render()

用戶客戶端分布

device_num = df.device.value_counts(ascending=True) # 柱形圖bar1 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))bar1.add_xaxis(device_num.index.tolist())bar1.add_yaxis('', device_num.values.tolist(), label_opts=opts.LabelOpts(position='right'))bar1.set_global_opts(title_opts=opts.TitleOpts(title='評論客戶端分布'), visualmap_opts=opts.VisualMapOpts(max_=3000))bar1.reversal_axis()bar1.render()

用戶等級分布

# 用戶等級level_num = df.current_level.value_counts()data_pair2 = [list(z) for z in zip(['LV' + i for i in level_num.index.astype('str').tolist()] , level_num.values.tolist())]# 繪製餅圖pie2 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px'))pie2.add('', data_pair=data_pair2, radius=['35%', '60%'])pie2.set_global_opts(title_opts=opts.TitleOpts(title='評論用戶等級分布'), legend_opts=opts.LegendOpts(orient='vertical', pos_top='15%', pos_left='2%'))pie2.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}({d}%)"))pie2.set_colors(['#EF9050', '#3B7BA9', '#6FB27C', '#FFAF34'])pie2.render()

評論時間走勢圖

# 時間數據處理df['time'] = df.content_time.str.split('-').str[1] + '-' + df.content_time.str.split('-').str[2]df['time'] = df.time.str.split(':').str[0]time_num = df.time.value_counts().sort_index()# 產生數據x1_line1 = time_num.index.values.astype('str').tolist()y1_line1 = time_num.values.tolist() # 繪製面積圖line1 = Line(init_opts=opts.InitOpts(width='1350px', height='750px'))line1.add_xaxis(x1_line1)line1.add_yaxis('', y1_line1, areastyle_opts=opts.AreaStyleOpts(opacity=0.3), markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_='max', name='最大值') ])) line1.set_global_opts(title_opts=opts.TitleOpts('各個時段評論人數'), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate='30')) ) line1.set_series_opts(label_opts=opts.LabelOpts(is_show=False), axisline_opts=opts.AxisLineOpts() )line1.render()

評論詞雲圖

import stylecloudfrom IPython.display import Image # 用於在jupyter lab中顯示本地圖片stylecloud.gen_stylecloud(text=' '.join(word_num), # txt需要傳入str格式 collocations=False, font_path=r'C:\Windows\Fonts\msyh.ttc', icon_name='fas fa-graduation-cap', size=768, output_name='B站評論詞雲圖.png')Image(filename='B站評論詞雲圖.png')

CDA數據分析師 出品

作者:Mika

數據:真達

後期:澤龍、Mika

相關焦點

  • 毛不易《消愁》不散,唱到十二星座集體水逆!
    《消愁》火了,他唱得楊冪想哭,唱到華晨宇飆淚,唱到薛之謙當場想下跪……好想深情的問他一句:你什麼星座的啊!》的毛不易到底什麼星座啊?《吐絲聯盟》#忘記原唱系列#神曲輩出,但凡你心有不快,都能寫進歌裡唱給你聽。
  • 那位唱《消愁》的少年要來神武4咪咕匯了 還記得毛不易的盛夏嗎
    提到這個問題很多人的第一反應一定是他在《明日之子》第三期演唱的《消愁》,這首歌有多火無需多言,印象中《消愁》24小時之內播放量就已經破千萬,首周更是破億,當時不少人都在朋友圈裡轉發這位新秀的歌曲,一夜之間,所有人都在感嘆於毛不易的才華,也有人開始稱毛不易為"少年李宗盛"。
  • 毛不易又一首歌火了,不亞於消愁,唱完之後全場哭了
    毛不易,相信大家都知道,17年明日之子憑藉自己14首原創歌曲拿下總冠軍,就算不認識他的朋友也肯定聽過他的歌,今日毛不易跟嶽雲鵬兩人在江蘇衛視一檔節目,無限歌謠季,又一首新曲火了,名字叫做一封情書說真的,毛不易的歌詞真的能寫進每個人的內心,比如消愁,像我這樣的人,借,還有盛夏,聽著聽著就流淚了
  • 毛不易《消愁》背後還有多少故事?
    大學時,他被調劑分到了不喜歡的護士專業,可這顯然不是他的理想職業,但性格內向、膽小的毛不易不敢重考,只能默默無言的接受了所謂命運的安排,讀了四年護理專業。也正是在這不快樂的四年裡,毛不易第一次接觸到了吉他,同時也開始了自己的創作之路。閒下來時,他會思考當下遇到的困擾,然後抱著生鏽的吉他即興作首歌,存在手機或者電腦裡。
  • 你只知道毛不易的消愁火了,卻不知消愁背後的故事
    毛不易憑著自己獨特的嗓音與音樂才華,一度被廣大聽眾接受,瞬間火遍大江南北,甚至很多明星巨星都被他圈粉,可是大家只看見他舞臺上的一面,卻不知消愁背後的故事。在2017年12月,毛不易的歌曲《消愁》獲得2017「騰訊娛樂白皮書」音樂年度之星的獎項 。2018年8月29日,獲得2018年華人歌曲音樂盛典的年度最佳編曲的獎項。
  • 毛不易這首藏了2年都不肯發的歌,竟比《消愁》更扎心…
    首先參加節目的所有唱作人只能在節目中演唱自己的歌,其次這些歌必須是自己未發表過的原創作品。 首發的八位唱作人:王源、熱狗、毛不易、汪蘇瀧、梁博、曾軼可、高進、陳意涵。他們都有一個共同點,除了有優秀的演唱能力,創作能力也不容小覷。 而對於毛不易這樣優秀的唱作人來說,無疑又是一次大展才華的機會。
  • 嚮往的生活2巴圖唱的歌叫什麼 消愁完整歌詞介紹
    那麼嚮往的生活2巴圖唱的歌叫什麼?一起來看看吧!  嚮往的生活2巴圖唱的歌叫什麼?  宋丹丹、巴圖的二次光臨讓蘑菇屋再次沸騰,何炅一見到宋丹丹就大呼「長英」,上一季的名字梗一下子給大家帶來熱絡歡笑。而宋丹丹重返蘑菇屋也給大家帶來新一輪充滿年代感的才藝展示。
  • 公認「0差評」的4首歌,毛不易《消愁》還行,而它被寫進教科書
    今天就給你們說說公認「0差評」的4首歌,毛不易《消愁》還行,而它被寫進教科書!首先就是毛不易的《消愁》;說實話當初在聽到這首歌的時候,不少人都表示自己找到了自己,毛不易的《消愁》包含了自己對於人生的感嘆,能夠引起每一個人的共鳴,加上毛不易獨特的嗓音,簡直就是給這首歌賦予了靈魂,尤其是在晚上聽的時候,似乎感觸會更深,你們一定都喜歡。
  • 毛不易的歌你聽過幾首,那麼你又聽懂幾首呢,《消愁》還是《借》
    說道毛不易,想必大家都不陌生吧。他是去年「明日之子」選秀節目中的年冠軍,也是第一季」明日之子「最強廠牌——巨星不易工作室。毛不易的成功靠的不是別的,靠的是他那種「守著我善良,催著我成長的」樸實的性格和他那種對音樂的痴愛,並且還有他橫溢的才華,毛不易在「明日之子」第一季中共演唱了14首原創歌曲,並得到了薛之謙、楊冪、華晨宇的一致認可與好評。
  • 毛不易最受歡迎的5首歌,《消愁》僅排第二,第一好聽到哭!
    第五:《浴火成詩》,電視劇《烈火如歌》的片尾曲 誰送我寒冬落魄,春暖逢生時,一次便作廢了生死,飛鴻跨雪追日添白絲,痛戛然而止,愛是指尖生悅的刺。毛不易最受歡迎的5首歌,《消愁》僅排第二,第一好聽到哭!第四:《無問》,電影《無問西東》宣傳曲。
  • 唱哭了楊冪的毛不易,公開了他不為人知的秘密
    「假如有一天我變的很有錢躺在世界上最大最軟的沙發裡......然後故作謙虛說金錢不是一切。」憑著酒勁,他唱完了這首歌。就這樣,通過了初選。畢竟,很多以藝術為生的人,都是餓死的。但小時候的王維家,身上確實也表現出些微「藝術家們」常有的氣魄,比如說,改個有趣的名字!王維家上初中時,覺得自己的名字沒有什麼特色,他給自己取了一個新名字-毛不易。「不易」並非作「不容易」解,而是不忘初心的意思。他希望自己不會被改變。
  • 毛不易,我是真喜歡你啊!你就是平而不凡,卓而不越!!
    如果要說一個我最喜歡的歌手,那一定是毛不易,2017年的那個夏天,一個歌手的誕生,白金唱片,最佳廠牌毛不易出現在大家的面前,也給樂壇刮來一陣只屬於毛不易獨一無二不可複製的暖風。我是真的喜歡他。只要一首歌裡面有他的演唱,我一定會下載來聽,因為我總能聽出屬於毛不易的,和別人不一樣的感受。
  • 毛不易的名字來源 毛不易的《消愁》歌詞表達了什麼意思
    8月5日,毛不易在結束當晚的比賽後,接受了中國青年網記者的專訪,表示《消愁》這首歌並不是為了表達感傷,而是為了「激勵我們在不那麼順利的環境裡繼續前行。」  歌曲中描述生活的不易,和名字中原本就叫的「不易」,很容易讓人產生聯想:毛不易本身就是一個嘗遍生活艱辛的人嗎?
  • 毛不易攤上事兒了,他是否還能寫出像《消愁》那樣的歌?
    毛不易知道後立馬發微博道歉,接著又在半夜發博澄清整個事件以表歉意,解釋道:「不單單是主辦方的疏忽,更是我們的疏忽,對此我表示深深的歉意」,看這誠懇的態度,自己當公關發聲明,受到眾人的理解。粉絲也幫著毛毛向李志道歉,並同時強調「毛毛自己也是一個原創音樂人,所以他很尊重其他的音樂人」並有粉絲表示心疼他「毛毛,多休息,注意身體」。毛不易從《明日之子》走到今天實屬不易。
  • 毛不易《消愁》歌詞不是表達傷感 談名字「毛不易」來源
    8月5日,毛不易在結束當晚的比賽後,接受了中國青年網記者的專訪,表示《消愁》這首歌並不是為了表達感傷,而是為了「激勵我們在不那麼順利的環境裡繼續前行。」  歌曲中描述生活的不易,和名字中原本就叫的「不易」,很容易讓人產生聯想:毛不易本身就是一個嘗遍生活艱辛的人嗎?對此,毛不易解釋稱,「不易」的意思並不是「不容易」,而是不改變,「我是在初中的時候改了名字,是自己給自己起的。
  • 《消愁》大走紅,為什麼人人都愛毛不易?
    好吧BGM只是個「回憶殺」,他唱的不是《消愁》啦到「巨星」真正開口唱……現場頓時como baby 一起哭。其實每次看大冪冪聽毛不易的歌,都感覺她心裡又嘆了一口氣。聽《消愁》的時候搖頭又微笑。要知道,一首歌一天內在騰訊視頻播放量超6千萬是什麼概念……大概就是很多很多人都在「聽歌消愁」吧。
  • 《消愁》毛不易
    明日之子第七期,雖然很多人吐槽明日之子節目的賽制,很多人對華晨宇楊冪路轉黑,很多人覺得薛之謙不該來,因為這個節目根本與音樂無關,但看節目時的揪心、心酸、心碎、遺憾、氣憤、感動、震撼都是這個節目存在的意義
  • 毛不易:在囈語中感慨人生,在消愁中淹沒愁緒,在不染中洗盡鉛華
    如果在《囈語》中我們感慨人生;如果我們在《消愁》中淹沒了愁緒;那麼在《不染》中,洗盡鉛華。這首歌是電視劇《香蜜沉沉燼如霜》的主題曲,由薩頂頂製作、簡弘亦作曲、海雷作詞、毛不易演唱。雖然不是毛毛自己作詞作曲,但整首歌的風格,簡直為他量身打造。當初毛不易錄完這首歌,也是不禁感嘆:這首歌唱的好累,也好過癮!其過癮,在於意境的完美表達。
  • 娛樂人物誌:毛不易《像我這樣的人》,《消愁》在《牧馬城市》中
    坎坷音樂人生《像我這樣的人》裡唱到「像我這樣懦弱的人,凡事都要留幾分。」知乎裡有一位網友,寫的非常實際,他說:「你會發現這個人很愛唱歌,而且十分愛唱苦情歌……隨著微博往前翻,能看到他13年就開始錄歌發唱吧。」也就是說,在2013年到2017年之間,甚至更早的從前,他一直一直很愛唱歌。而且寫出了很多的不錯的原創,但是,一直都沒有人發現。
  • 毛不易的歌為什麼總是能觸動年輕人?
    在鋼琴、吉他、弦樂的輕輕唱和裡,依然是毛不易最擅長的敘述口吻,平凡生活,一葷一素,細吞慢嚼,精確地捕捉到了年輕人離開校園庇護、進入大人世界那個瞬間的狀態。所有的同學都在趕往一場又一場的面試和試講,我始終顧不起勇氣。到了6月份,我搬出宿舍,寄居在親戚家裡,每天躲在電腦前玩遊戲,渾渾噩噩地,直到把剩下的生活費全部花光。也許大家現在看到的我總是一副理直氣壯的樣子,可如毛不易所唱的,「對於未來的想法,有太多疑問沒有回答,關於麵包和理想,還有平凡和偉大」,我們都是這樣長大的。這樣家裡蹲的狀態幾乎持續了一年。