zoukankan      html  css  js  c++  java
  • 用户偏爱曲风分析(二)

    这篇文章 主要是 讲述 网易云音乐 歌词、歌曲的爬取,网易云音乐API的使用
    参考文章:
    网易云音乐API获取分析

    网易云音乐的基本特点

    首先想要爬取 网易云音乐的数据,首先 需要知道 他的歌曲结构、歌单结构、URL等

    1. 网易云歌单页面分析

    主要了解 歌单的结构 和 歌曲


    (印象中,url上的 #`` 是官方用于迷惑爬虫的,如果想 爬取官方网址,可以将 #` 去掉)
    我们可以 记一下歌单id:6678233267、 歌曲id:1697004
    然后 查看网易云api文档可以发现:

    根据上面那个歌单id 调用接口可以得到结果:

    顺便说一句,浏览器 可以 使用一些json的插件,格式化后 比较好分析。

    看到上面的数据结果,可以发现和官方的是一样的(毕竟这个api就是来自于官方 →_→)
    但是这样的数据格式就比较分析 爬取,我们简单得到歌单信息
    观察这个json信息可以发现:

    通过这基本信息,我们可以得到 歌曲的id列表,之后可以通过歌曲id列表 爬取歌曲信息

    2. 网易云歌曲具体信息分析

    根据 网易云音乐api 查找 歌曲id 为1697004的信息
    这以下几个接口就能 获取到 歌曲的基本信息了

    1. 歌曲下载

      可以尝试网上查找关于新的api使用方式
      如笔者之前尝试访问的:
      http://music.163.com/api/playlist/detail?id=6678233267 获取歌单信息 和api文档上的结果 大部分相同 但 更加详细,如歌曲的作者、专辑等等
      http://music.163.com/song/media/outer/url?id=1697004.mp3 MP3资源下载,在下载前可以 通过上面截图的 查看该音乐是否可用,因为有些音乐已经下架,没有资源了
    2. 歌词获取


      可以看到,歌词的结构,是每一段都为[xx:xx.xx] 为开头。可以通过一些字符串处理将其 裁剪得到数据。
    3. 歌曲评论

    通过这些接口,歌曲的基本信息都可以获取到。

    python 爬取音乐数据

    前期基本知识

    1. 所需python库 requestsjsonos
    2. 基础信息设置
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'}
    true = True # json 关键字的转义
    false = False # json 关键字的转义
    null = None # json关键字的转义
    

    1.获取歌单 歌曲列表信息

    
    # 判断是否拥有mp3版权
    def judge_song_url(song_id):
        """
        判断音乐是否存在
        :param song_id:
        :return:
        """
        url = "http://localhost:3000/check/music?id="+str(song_id)
        html = requests.get(url).text
        dict=eval(html)
        return dict["success"]
    
    # 转义 部分字符串存在 ' 和 " 的转义问题
    def change(s):
        """
        符号转义
        :param s: 带有 " ' 字符
        :return:
        """
        s=s.replace("'", "\'")
        s=s.replace('"', '\"')
        return s
    
    
    # 得到歌单
    def get_songlist(listid,n):
        """
        根据歌单id得到歌曲列表
        :param listid:
        :param n: 歌单中歌曲个数
        :return:
        """
        url = 'http://music.163.com/api/playlist/detail?id='+str(listid)
        html = requests.get(url,headers=headers).text # 获取列表
        dits = eval(html) # 转成字典数据类型
    
        dits = dits["result"]
        dits = dits["tracks"]
        songs=[]
        cnt = 0
        for songmess in dits: # 遍历歌曲列表
            song_id = str(songmess["id"])
            if judge_song_url(song_id) == False: # 判断歌曲是否有用
                continue;
            song_name = songmess["name"]
            song_name = change(song_name) # 转义
            song_author = songmess["artists"]
            song_author = song_author[0]
            song_author = song_author["name"]
            song_url = "http://music.163.com/song/media/outer/url?id=" + song_id + ".mp3"
            song_lrc = get_lrc(song_id)
            songs.append({
                    "song_id":song_id,
                    "song_name":song_name,
                    "song_author":song_author,
                    "song_lrc":song_lrc,
                    "song_url":song_url
            })
            cnt+=1
            if cnt >= n:
                break
    
        print(cnt)
        return songs
    

    2.歌曲下载

    通过 1. 得到歌曲列表后,就可以下载歌曲信息了

    # 下载歌曲
    def download_song(save_name,song_id):
        """
        下载单曲
        :param save_name:保存路径
        :param song_id:歌曲id
        :return:
        """
        if judge_song_url(song_id)==False:
            print("无歌曲版权")
            return False
        else:
            song_url="http://music.163.com/song/media/outer/url?id="+str(song_id)+".mp3"
            res = requests.get(song_url, headers=headers)
            music = res.content
            with open(save_name, 'wb') as file:
                file.write(music)
                file.flush()
                file.close()
            return True
    

    3.歌词下载

    # 获取单首歌歌词
    def get_lrc(song_id):
        """
        根据id得到时间轴的歌词
        :param song_id:歌曲id
        :return:
        """
        url = 'http://localhost:3000/lyric?id='+str(song_id)
        html = requests.get(url).text
        dits = eval(html)
        if 'lrc' in dits.keys():
            tmp = dits["lrc"]
            lrc = tmp["lyric"]
        else:
            lrc=" "
        return lrc
    
    def download_lrc(file_name,song_id):
        """
        下载歌词
        :param song_id:
        :return:
        """
        lrc = get_lrc(song_id)
        with open(file_name,'w',encoding='utf-8') as file:
            file.write(lrc)
            file.close()
    

    其他

    用户偏爱曲风分析(一)
    歌曲爬取代码连接

  • 相关阅读:
    事务传播机制,搞懂。
    洛谷 P1553 数字反转(升级版) 题解
    洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here 题解
    洛谷 P1055 ISBN号码 题解
    洛谷 P2141 珠心算测验 题解
    洛谷 P1047 校门外的树 题解
    洛谷 P1980 计数问题 题解
    洛谷 P1008 三连击 题解
    HDU 1013 题解
    HDU 1012 题解
  • 原文地址:https://www.cnblogs.com/q1076452761/p/14644143.html
Copyright © 2011-2022 走看看