用Python分析许嵩的歌

作者: 罗罗攀 | 来源:发表于2019-07-08 20:07 被阅读34次
    01 前言

    是否还记得断桥残雪,一听就是一下午
    是否还记得认错,上课前必点歌曲
    是否还记得素颜,同桌那清秀的脸庞

    最近许嵩在开演唱会,借此机会,听着许嵩的歌,做了这篇分享,不禁唏嘘,我们在慢慢的长大,竟记不起当年模样。

    02 网页分析

    这里,我们进入网易云音乐官网,找到许嵩的个人单曲。

    这里是post请求,而且参数较复杂,所以使用selenium来进行爬虫,这里除了获取基本信息外,需要获取每首歌的id,用于歌词爬虫。

    歌词爬虫,我们使用下面的url即可,换不同的id,就是不同歌的歌词。

    http://music.163.com/api/song/lyric?id=1309642305&lv=1&kv=1&tv=-1
    
    03 爬虫代码

    首先是所有歌曲的爬虫,使用selenium,部分代码见下。

    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的,而有些是伴奏,在下载歌词之前,我们对这些数据进行清洗,尽量保证是许嵩原创而且不是伴奏的。

    def foo1(singer):
        if '许嵩' in singer:
            return 'no cover'
        else:
            return 'cover'
        
    def foo2(song):
        if '伴奏' in song:
            return '是'
        else:
            return '否'
        
    music['原创'] = music['singer'].apply(foo1)
    music['伴奏'] = music['song'].apply(foo2)
    
    music[(music['原创'] == 'no cover') & (music['伴奏'] == '否')].to_csv('music_original.csv',index=None,encoding='utf-8')
    

    最后,我们根据前面的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 数据分析

    01 数据基本情况

    许嵩歌曲共计175首,妥妥的原创高产歌手~

    02 专辑单曲数

    早期的许嵩,是一个网络歌手,所以都放在了许嵩单曲集中,随后发的苏格拉没有底,寻雾启示是很不错的优秀专辑。

    03 歌词词云

    最后利用jieba分词,制作许嵩歌词的词云。

    许嵩的歌偏悲伤爱情,通过词云也可以看出来。

    公众号后台回复【入群】,加入学习交流群,需要代码的可以加群。

    相关文章

      网友评论

        本文标题:用Python分析许嵩的歌

        本文链接:https://www.haomeiwen.com/subject/rjhbhctx.html