01 前言
是否還記得斷橋殘雪拂到,一聽(tīng)就是一下午
是否還記得認(rèn)錯(cuò)遏匆,上課前必點(diǎn)歌曲
是否還記得素顏法挨,同桌那清秀的臉龐
最近許嵩在開(kāi)演唱會(huì),借此機(jī)會(huì)幅聘,聽(tīng)著許嵩的歌凡纳,做了這篇分享,不禁唏噓帝蒿,我們?cè)诼拈L(zhǎng)大荐糜,竟記不起當(dāng)年模樣。
02 網(wǎng)頁(yè)分析
這里葛超,我們進(jìn)入網(wǎng)易云音樂(lè)官網(wǎng)暴氏,找到許嵩的個(gè)人單曲。
這里是post請(qǐng)求绣张,而且參數(shù)較復(fù)雜答渔,所以使用selenium來(lái)進(jìn)行爬蟲(chóng),這里除了獲取基本信息外侥涵,需要獲取每首歌的id沼撕,用于歌詞爬蟲(chóng)。
歌詞爬蟲(chóng)芜飘,我們使用下面的url即可务豺,換不同的id,就是不同歌的歌詞嗦明。
http://music.163.com/api/song/lyric?id=1309642305&lv=1&kv=1&tv=-1
03 爬蟲(chóng)代碼
首先是所有歌曲的爬蟲(chóng)冲呢,使用selenium,部分代碼見(jiàn)下招狸。
from selenium import webdriver
from lxml import etree
import time
import csv
def get_info(url):
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)
driver.implicitly_wait(10)
iframe = driver.find_elements_by_tag_name('iframe')[0]
driver.switch_to.frame(iframe)
html = etree.HTML(driver.page_source)
infos = html.xpath('//div[@class="srchsongst"]/div')
for info in infos:
song_id = info.xpath('div[2]/div/div/a/@href')[0].split('=')[-1]
song = info.xpath('div[2]/div/div/a/b/text()')[0]
singer1 = info.xpath('div[4]/div/a')[0]
singer = singer1.xpath('string(.)')
album = info.xpath('div[5]/div/a/@title')[0]
print(song_id,song,singer,album)
writer.writerow([song_id, song, singer, album])
if __name__ == '__main__':
fp = open('music.csv', 'w', newline='', encoding='utf-8')
writer = csv.writer(fp)
writer.writerow(['song_id', 'song', 'singer', 'album'])
url = 'https://music.163.com/#/search/m/?s=%E8%AE%B8%E5%B5%A9&type=1'
get_info(url)
在這些歌中敬拓,有些是cover的,而有些是伴奏裙戏,在下載歌詞之前乘凸,我們對(duì)這些數(shù)據(jù)進(jìn)行清洗,盡量保證是許嵩原創(chuàng)而且不是伴奏的累榜。
def foo1(singer):
if '許嵩' in singer:
return 'no cover'
else:
return 'cover'
def foo2(song):
if '伴奏' in song:
return '是'
else:
return '否'
music['原創(chuàng)'] = music['singer'].apply(foo1)
music['伴奏'] = music['song'].apply(foo2)
music[(music['原創(chuàng)'] == 'no cover') & (music['伴奏'] == '否')].to_csv('music_original.csv',index=None,encoding='utf-8')
最后营勤,我們根據(jù)前面的url灵嫌,下載歌詞。
import requests
import re
import json
url = ''
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
def get_info(id):
res = requests.get('http://music.163.com/api/song/lyric?id={}&lv=1&kv=1&tv=-1'.format(id),headers=headers)
json_data = json.loads(res.text)
lyric = json_data['lrc']['lyric']
lyric = re.sub('\[.*\]','',lyric)
return lyric
for i in range(music_original.shape[0]):
try:
fp = open('song/{}.txt'.format(music_original.iloc[i,1]),'w',encoding='utf-8')
fp.write(get_info(music_original.iloc[i,0]))
fp.close()
except:
pass
04 數(shù)據(jù)分析
01 數(shù)據(jù)基本情況
許嵩歌曲共計(jì)175首葛作,妥妥的原創(chuàng)高產(chǎn)歌手~
02 專輯單曲數(shù)
早期的許嵩寿羞,是一個(gè)網(wǎng)絡(luò)歌手,所以都放在了許嵩單曲集中赂蠢,隨后發(fā)的蘇格拉沒(méi)有底绪穆,尋霧啟示是很不錯(cuò)的優(yōu)秀專輯。
03 歌詞詞云
最后利用jieba分詞虱岂,制作許嵩歌詞的詞云玖院。
許嵩的歌偏悲傷愛(ài)情,通過(guò)詞云也可以看出來(lái)第岖。
公眾號(hào)后臺(tái)回復(fù)【入群】难菌,加入學(xué)習(xí)交流群,需要代碼的可以加群蔑滓。