Python數據可視化:網易云音樂歌單
網易云音樂2018年度聽歌報告—遇見你,真好。
相信有不少人在上周,應該已經看過自己網易云音樂的年度報告了。
小F也是去湊湊熱鬧,瞅了一波自己的年度聽歌報告。
那么你在云村又聽了多少首歌,聽到最多的歌詞又是什么呢?
2018年你的年度歌手又是誰,哪些又是你***的歌呢?
不過相比去年,我的票圈并沒有很多發自己年度報告的朋友。
不得不說,版權之爭開始,網易云音樂似乎就在走下坡路。
很多喜歡的歌聽不了,這應該是大家共同的痛點。
***的印象就是周董的歌,在愚人節時下架了,原以為只是個玩笑,不想卻是真的。
本次通過對網易云音樂華語歌單數據的獲取,對華語歌單數據進行可視化分析。
可視化庫不采用pyecharts,來點新東西。
使用matplotlib可視化庫,利用這個底層庫來進行可視化展示。
一、網頁分析
01 歌單索引頁
選取華語熱門歌單頁面。
獲取歌單播放量,名稱,及作者,還有歌單詳情頁鏈接。
本次一共獲取了1302張華語歌單。
02 歌單詳情頁
獲取歌單詳情頁信息,信息比較多。
有歌單名,收藏量,評論數,標簽,介紹,歌曲總數,播放量,收錄的歌名。
這里歌曲的時長、歌手、專輯信息在網頁的iframe中。
需要用selenium去獲取信息,鑒于耗時過長,小F選擇放棄...
有興趣的小伙伴,可以試一下哈...
二、數據獲取
01 歌單索引頁
- from bs4 import BeautifulSoup
- import requests
- import time
- headers = {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
- }
- for i in range(0, 1330, 35):
- print(i)
- time.sleep(2)
- url = 'https://music.163.com/discover/playlist/?cat=歐美&order=hot&limit=35&offset=' + str(i)
- response = requests.get(url=url, headers=headers)
- html = response.text
- soup = BeautifulSoup(html, 'html.parser')
- # 獲取包含歌單詳情頁網址的標簽
- ids = soup.select('.dec a')
- # 獲取包含歌單索引頁信息的標簽
- lis = soup.select('#m-pl-container li')
- print(len(lis))
- for j in range(len(lis)):
- # 獲取歌單詳情頁地址
- url = ids[j]['href']
- # 獲取歌單標題
- title = ids[j]['title']
- # 獲取歌單播放量
- play = lis[j].select('.nb')[0].get_text()
- # 獲取歌單貢獻者名字
- user = lis[j].select('p')[1].select('a')[0].get_text()
- # 輸出歌單索引頁信息
- print(url, title, play, user)
- # 將信息寫入CSV文件中
- with open('playlist.csv', 'a+', encoding='utf-8-sig') as f:
- f.write(url + ',' + title + ',' + play + ',' + user + '\n')
獲取歌單索引頁信息如下,共1302張華語歌單。
02、歌單詳情頁
- from bs4 import BeautifulSoup
- import pandas as pd
- import requests
- import time
- df = pd.read_csv('playlist.csv', header=None, error_bad_lines=False, names=['url', 'title', 'play', 'user'])
- headers = {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
- }
- for i in df['url']:
- time.sleep(2)
- url = 'https://music.163.com' + i
- response = requests.get(url=url, headers=headers)
- html = response.text
- soup = BeautifulSoup(html, 'html.parser')
- # 獲取歌單標題
- title = soup.select('h2')[0].get_text().replace(',', ',')
- # 獲取標簽
- tags = []
- tags_message = soup.select('.u-tag i')
- for p in tags_message:
- tags.append(p.get_text())
- # 對標簽進行格式化
- if len(tags) > 1:
- tag = '-'.join(tags)
- else:
- tag = tags[0]
- # 獲取歌單介紹
- if soup.select('#album-desc-more'):
- text = soup.select('#album-desc-more')[0].get_text().replace('\n', '').replace(',', ',')
- else:
- text = '無'
- # 獲取歌單收藏量
- collection = soup.select('#content-operation i')[1].get_text().replace('(', '').replace(')', '')
- # 歌單播放量
- play = soup.select('.s-fc6')[0].get_text()
- # 歌單內歌曲數
- songs = soup.select('#playlist-track-count')[0].get_text()
- # 歌單評論數
- comments = soup.select('#cnt_comment_count')[0].get_text()
- # 輸出歌單詳情頁信息
- print(title, tag, text, collection, play, songs, comments)
- # 將詳情頁信息寫入CSV文件中
- with open('music_message.csv', 'a+', encoding='utf-8-sig') as f:
- f.write(title + ',' + tag + ',' + text + ',' + collection + ',' + play + ',' + songs + ',' + comments + '\n')
- # 獲取歌單內歌曲名稱
- li = soup.select('.f-hide li a')
- for j in li:
- with open('music_name.csv', 'a+', encoding='utf-8-sig') as f:
- f.write(j.get_text() + '\n')
獲取的1302張華語歌單的詳情。
1302張歌單里的121118首歌。
三、數據可視化
可視化代碼已上傳GitHub,點擊左下角閱讀原文即可訪問!!!
01 歌曲出現次數 ***0
榜上的十首歌,除了「水星記」,小F聽得次數都不少。
那么你又是如何的呢?
在小F的印象里,這些歌都曾在網易云音樂熱歌榜的榜首出現過。
02 歌單貢獻UP主 ***0
10大歌單貢獻UP主,感謝這些辛勤的“搬運工”,給大家帶來優質的歌單。
給廣大懶人癌患者,亦或選擇困難癥患者,帶來福利。
03 歌單播放量 ***0
歌單播放量前十名單,***名7000多萬播放量。
其實matplotlib生成的圖是挺清楚的,只不過一上傳就變模糊了。
所以這里你可能會覺得圖片質量不行...
其實并不是,為此小F做了相應的圖表,具體見文末~
04 歌單收藏量 ***0
同樣是好東西,收藏收藏!!!
有一些歌單和播放量***0里歌單有重復。
05 歌單評論數 ***0
歌單「再見大俠:武俠小說泰斗金庸逝世」評論數最多。
相信不少人的閱讀時光,就是與金庸前輩的武俠小說一起度過。
飛雪連天射白鹿,笑書神俠倚碧鴛。
還有由小說改編成的電視劇,都是經典!!!
小F武俠小說看的少,武俠電視劇看的多...
06 歌單收藏數量分布情況
將收藏數做對數處理,使得能直觀看出歌單收藏數的分布。
主要分布在0-15萬之間(ln(150000)=12)。
07 歌單播放數量分布情況
歌單播放數主要分布在0-1000萬。
其中ln(10000000)=16。
08 歌單標簽圖
既然選取的是華語歌單,那么華語這二字必不可少,而且還占大頭。
那么就看看除了華語,還有什么其他標簽。
「流行」沒啥好說的。
「古風」「說唱」「民謠」近些年來熱度是越來越高,不過也有玩壞的時候。
比如「離人愁」、「一人我飲酒醉」,小F作為吃瓜群眾,只能說且行且珍惜...
09 歌單介紹詞云圖
歌單介紹詞云圖,希望你能找到你喜歡某首歌的原因!!!
到底是希望,還是青春,亦或是回憶呢?
四、總結
***,把本次搜刮的干貨,分享給大家。
可視化及相關代碼都放「GitHub」上頭了。
GitHub:https://github.com/Tobby-star/music_163
作者:法納斯特,Python愛好者,喜歡爬蟲,數據分析以及可視化。