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

2020-12-12 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

相關焦點

  • 毛不易備受好評的6首歌曲,除了《消愁》和《借》,你還聽過幾首
    毛不易自從《明日之子》出道以後,就收穫了很多外號,例如:毛毛、巨星、王毛毛等等,而對於這樣的稱呼,表達的確實粉絲們對他的喜愛,從成名到現在,毛不易的每首歌曲都讓人有不同的感受,今天就讓我們來簡單了解一下其中的6首1.
  • 毛不易:在囈語中感慨人生,在消愁中淹沒愁緒,在不染中洗盡鉛華
    如果在《囈語》中我們感慨人生;如果我們在《消愁》中淹沒了愁緒;那麼在《不染》中,洗盡鉛華。這首歌是電視劇《香蜜沉沉燼如霜》的主題曲,由薩頂頂製作、簡弘亦作曲、海雷作詞、毛不易演唱。雖然不是毛毛自己作詞作曲,但整首歌的風格,簡直為他量身打造。
  • 其貌不揚的毛不易,為什麼能寫出消愁等走心的歌曲
    毛不易說自己最遺憾的就是:自己的母親在臨死之前,都覺得自己的兒子是一個不成功的人,因為那時候的毛不易學習不好,容易掛科,母親害怕他會拿不到畢業證。並且覺得毛不易也不會做飯,也不會照顧自己,因此毛不易的母親一直到臨終前,都對兒子今後的生活充滿著深深的擔憂。
  • 毛不易:只是剛好那500位評審團裡沒有薛之謙罷了
    雖然毛不易的歌還是一如既往的唱到人心裡去了,但是這500位評審團裡沒有了薛之謙呀!第一次知道毛不易,是在2017年的那個夏天。他說上臺之前喝了一點小酒,因為緊張。他帶著《假如有一天我變得很有錢》來到了薛之謙的面前,笑稱自己是「巨星」,不過是業餘的。他不是第一個唱歌的人,也不是最後一個。在那麼多小鮮肉裡,他實在算不上帥氣,帶著眼鏡的他,甚至有些呆滯。
  • 毛不易:《明日之子》冠軍出道,一曲《消愁》刷爆朋友圈,他真牛
    一曲《消愁》,24小時播放量破千萬,一夜之間,成為各大音樂榜熱門單曲。毛不易,也一夜爆紅了。 成名後,談到他的名字,很多人都以為,毛不易名字裡的「不易」代表著人生不易。 但毛不易說,「不易」是不改變的意思,代表著他的人生態度。那些他所熱愛的東西,並不會隨著周遭的環境輕易改變。
  • 毛不易《入海》歌詞完整 b站入海是什麼意思 毛不易入海觀看地址
    5月20日上午,B站發布了畢業季主題歌曲《入海》MV。該歌曲由B站出品,知名歌手毛不易演唱,音樂製作人趙兆作曲並製作。歌曲MV以主人公畢業的時候為原點,追憶過去,並用大量篇幅展現普通人畢業後的社會生活。《入海》主題為「獻給即將或已經畢業的人們」,這首歌曲的受眾不僅是2020年畢業生,也包括所有擁有畢業經歷的人。以下為bilibili和毛不易微博宣傳原文。
  • 毛不易,求求你,別唱《一葷一素》了!|百家故事
    是那個一如既往,溫柔到骨子裡的,白月光男孩啊。2017年盛夏,一檔音樂選秀節目《明日之子》火了。彼時,風頭正盛的楊冪在選秀節目裡首次擔當評委,綜藝達人薛之謙強勢坐鎮導師席位,實力唱將華晨宇手握實力星推官的選擇大權。
  • 毛不易一首《入海》再走紅,歌詞再現《像我這樣的人》的歲月如歌
    《創造營》、《青春有你》學員們紛紛畢業,身為《創造營》聲音最暖的導師毛不易,為畢業學員們演唱了一首《入海》,詞意是「關於麵包和理想,就讓時間和你們一起步入人海,讓生活回答你的夢想,讓夢想回答你們的生活。」不得不說毛不易這首歌唱得很好,加之毛不易聲喉是那種特別溫暖型的,他唱的所有歌都特別暖,十分會押韻情感。
  • 毛不易為何能連當兩屆導師?
    你在最簡單的旋律裡面找到了態度。從目前為止,可能有人這歌寫得好聽,但是還沒有讓我看到態度;有人旋律很棒,沒有讓我看到態度,你是第一個讓我看到態度的人。」當時毛不易的出現可以說是讓所有人都出其不意,是一個意外之喜。
  • 毛不易很真實很現實,不刻意表達正能量,寫的歌打動人心
    毛不易很真實很現實,不刻意表達正能量 ,他說自己就是普通人,我覺得他是這樣的。懂世故,不迴避世故,並不是完全不世故,他並不排斥對自己有利的,只是他有底線而已並且挺固執,他是有選擇性的。其實在娛樂圈裡,有業務能力,不做壞事其實就很難得了,毛不易做的好太多了。
  • 毛不易最火的三首歌是哪三首?毛不易最好聽的歌曲推薦
    毛不易,原名王維家,內地流行樂男歌手、音樂天才毛不易毛不易最火的三首歌,以及毛不易唱的好聽歌曲集錦,聽完耳朵會懷孕啊!  1、毛不易最火的三首歌  毛不易最火的三首歌分別是:《如果有一天我變得很有錢 》、《像我這樣的人》、《消愁》。
  • 從明日之子到歌手當打之年,毛不易一直都是贏家……
    毛不易在《歌手》兩次表演中選的兩首歌分別為《消愁》的姊妹歌《借》,以及對母親飽含深情的思念的歌曲《一葷一素》,這兩首歌沒有像其他歌手那樣波瀾起伏的情緒張力,更多的是一種娓娓道來的深情。尤其是《一葷一素》這首歌,即使我在電腦旁看的是2D的畫面,依然被感動的一度飆淚,足以見這首歌在現場的感染力。
  • 毛不易的「底色悲涼」,希望你永遠聽不懂
    《阿蓮》《九妹》《我的眼裡只有你》《精忠報國》......某些歌手僅靠唱一、兩首歌,不僅出道成名,甚至可以「吃一輩子」——即便現在已經過去一、二十年,但每當他們登臺獻唱,上演「回憶殺」時,依舊會覺得「這首歌,只有他唱起來最好聽」。
  • 歌手兩次被淘汰,不擅長說話的毛不易怎麼就成了綜藝界新的寵兒?
    事實證明,你要了解一個明星先要去了解他的作品,《消愁》《借》《像我這樣的人》,一首首歌曲聽過,耳朵先是被打動,後來是靈魂深處感到的某種契合,從此便愛了,而毛不易呢,還是一如既往的唱歌、上綜藝,還是容易害羞、不愛說話,然而喜歡聽他音樂的人卻感覺這樣的毛不易真是呆萌,綜藝上有這樣一個「另類」也是很不錯嘛。
  • 毛不易的歌曲為啥那麼牛?這幾點會給你答案
    其實,毛不易對於小編的影響是漸進式的,對於這個名字,我知道得並不比大家晚,幾乎也是跟大家同步在《明日之子》第一季知道的。知道他當時有一首歌曲叫《消愁》很快就流行開了。但這在小編看來,沒有什麼值得注意的。
  • 母親去世,毛不易再不做男護士,《一葷一素》唱盡世間慈母情
    1說起來毛不易的經歷,少年時期的他很有個性,本來叫王維家的他,給自己取名為毛不易,意為「平凡,不改變」,雖然一直喜歡音樂,但他並沒有選擇音樂專業,反而是就讀於護理專業。毛不易在畢業之後,成為一名實習男護士。可是在他的從業生涯裡,第一個送走的病人卻是他自己的母親。看過太多無奈,病痛和離別,這也是他放棄醫護職業,選擇去追尋自己音樂夢想的原因。
  • 88位明星合作新歌《一直到黎明》:王一博、李宇春、毛不易、何炅
    你看過的每一場戲,都值得被記錄——小井筆記。點擊「關注」,讓我為你記錄看過的每一場戲。楔子近日,由88位明星合作的新歌《一直到黎明》,在網絡上發布了,引發熱議。說到這首新歌,其實是一首公益暖心歌曲,聚集了共計88位明星,分別來自文藝界和體育界,他們有王一博、李宇春、何炅、羅志祥、許凱、毛不易、郎朗、張信哲、任家萱等等,明星人數很龐大,也只是希望這份正能量能傳遞給更多人,在這個凜冽的冬天,在這個嚴峻的疫情之下,溫暖更多人,有一分熱,發一分光。
  • 毛不易《歌手》遭淘汰,但溫柔又深情的歌者,我記住你了
    這一季的歌手主要有毛不易,周深,徐佳瑩,蕭敬騰,袁婭維, 華晨宇 ,米希亞等頂流陣容,還有新生代陣容進行排位,奇襲挑戰。他的歌不敢輕易聽,李健如是說知道毛不易還是去年春天,一次偶然的機會,聽到了他的歌《一葷一素》,頓時內心莫名被擊中,好長一段時間都在單曲循環這首歌。
  • 毛不易新歌43分鐘引轟動 《小王日記》超長串燒唱到了網友心坎裡
    川北在線核心提示:原標題:毛不易新歌43分鐘引轟動 《小王日記》超長串燒唱到了網友心坎裡 最近毛不易在網絡發布了一首新歌《小王日記》,本來就是一件普普通通的發新歌事件,但是讓人沒有想到的是,他的這首歌曲時長長達43分鐘。一時間引發了不小的轟動。
  • 終於知道為什麼毛不易火了,原來他每首歌裡都藏著自己的經歷
    認識毛不易的人,也都知道了毛不易畢業於杭州師範大學護理專業,2017年,參加騰訊視頻選秀娛樂節目《明日之子》的比賽,獲得全國總決賽冠軍,進入演藝圈。他的歌曲《消愁》《無問》《平凡的一天》《像我這樣的人》《如果有一天我變得很有錢》等作品都非常好聽。而這些歌裡也都有毛不易個人生活的影子。