Python下载网易云音乐(云音乐飙升榜)

2023-05-16

最近突然想用python写一个自动下载的工具,于是就先拿网易云来练练手,并把过程中的心得写下来便于后面有想玩这个的童鞋们参考。
首先我们分析网页源码,找到我们想要的获取数据位置:
在这里插入图片描述
每一个标签对应着飙升榜中的一首歌曲,想要查看歌曲的详细信息,可以点开标签查看。
在这里插入图片描述

点开后,我们发现,关于歌曲时长,歌曲名称,歌曲id,图片,以及作者都可以在两个标签下找到,且想要获取的歌曲名,ID,图片以及作者都是后一个标签的不同属性值,分别对应的是‘data-res-nam’,‘data-res-id’,‘data-res-pic’,'data-res-author’属性的值。
知道我们要获取的数据具体位置后,我们就可以直接写代码来获取了。

在写代码前,我们再仔细看下网页源码,我们发现一个很有意思的现象:
在这里插入图片描述
我们发现我们要获取的数据,位于一个标签再嵌套的一个标签下面,然后我们发现中间有一个标签节点,其实这相当于是当前界面的子界面,最外层的是父界面,里面的是子界面(可以这么理解),当我们想要用Selenium获取子界面的节点时,是直接获取不到的,需要切换到子界面,然后再去获取才可以。
切换方法很简单,直接用:
driver.switch_to.frame(‘contentFrame’)
其中‘contentFrame’为到name属性的值。

关于获取歌曲名称,作者,时长以及下载图片的方式可以从上面网页源码中直接获取,但是下载歌曲以及歌词时,直接通过API来获取。
获取歌曲:url = “https://music.163.com/song/media/outer/url?id=”+str(id)+".mp3"
获取歌词:url = “http://music.163.com/api/song/lyric?id=”+str(id)+"&lv=1&kv=1&tv=-1"

好了,接下来就可以直接上代码了:

# --encode:utf-8 --
from selenium import webdriver
import pymongo
import requests
import os
import json
'''
实现思路:
1.将网易云音乐'云音乐飙升榜'中的歌曲名,歌手,歌曲时长,图片,歌词获取下来
2.将获取的信息存入本地文档,以"云音乐飙升榜/歌曲名/歌曲名.mp3"的格式存放
3.将获取的信息存入mongo数据库中         
'''
class wangyiyun():
    def __init__(self, url, headers, num):
        self.url = url
        self.headers = headers
        self.num = num
        self.songs_name_list = []            # 用于存放歌曲名的列表
        self.songs_times_list = []           # 存放歌曲时长的列表
        self.songs_author_list = []          # 存放歌曲歌手的列表
        self.songs_pic_list = []             # 存放歌曲图片的列表
        self.songs_href_list = []            # 存放歌曲链接的列表(非歌曲下载链接)
        self.songs_id_list = []              # 存放歌曲id的列表(网易云中显示的歌曲id)
        self.songs_download_url_list = []    # 存放歌曲下载链接的列表
        self.songs_info_list = []            # 存放歌曲所有信息的列表(便于后面存入数据库)

    def get_songs(self):
        downloading_num_time = 1             # 用于控制下载数量的临时变量
        download_songs_pic = 1               # 用于控制下载数量的临时变量
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument('--headless')
        self.driver = webdriver.Chrome('./chromedriver',chrome_options=chrome_options)    # 执行时不弹出浏览器界面,适用于Chrome 59版本以上

        self.driver.get(self.url)
        self.driver.switch_to.frame('contentFrame')        # 由于需要获取的数据位于子frame中,因此需要切换一下frame
        # 获取歌曲时间
        self.songs_times = self.driver.find_elements_by_class_name('u-dur')
        for song_time in self.songs_times:
            self.songs_times_list.append(song_time.text)
            # 判断下载数量是否达到预期
            if downloading_num_time < int(self.num):
                downloading_num_time += 1
            else:
                break

        # 获取歌曲名称、作者、以及图片链接
        self.songs = self.driver.find_elements_by_xpath('//div[@class="j-flag"]/table/tbody//tr/td[3]/div/span[2]')
        for song in self.songs:
            song_name = song.get_attribute('data-res-name') # 获取歌曲名称
            self.songs_name_list.append(song_name)
            self.songs_author_list.append(song.get_attribute('data-res-author'))    # 获取歌曲作者
            pic_url = song.get_attribute('data-res-pic')
            self.songs_pic_list.append(pic_url)  # 获取歌曲图片路径
            songs_url = 'https://music.163.com/song?id=' + song.get_attribute('data-res-id')      # 获取歌曲链接(非下载链接)
            self.songs_href_list.append(songs_url)
            songs_id = song.get_attribute('data-res-id')    # 获取歌曲id
            songs_download_url = 'https://music.163.com/song/media/outer/url?id=' + songs_id + '.mp3'   # 获取歌曲下载链接
            self.songs_download_url_list.append(songs_download_url)

            # 将数据下载到本地,文件以"云音乐飙升榜/song_name/song_name.mp3"的格式存放
            # 下载歌曲图片
            if not os.path.exists('./云音乐飙升榜/'+ song_name):
                os.makedirs('./云音乐飙升榜/'+ song_name)
            # 将获取到图片信息写入文件
            pic_response = requests.get(pic_url, headers=self.headers)
            with open('./云音乐飙升榜/'+ song_name + '/' + song_name+ '.jpg', 'wb') as file_pic:
                file_pic.write(pic_response.content)
            # 下载歌曲
            songs_response = requests.get(songs_download_url, headers=self.headers)
            with open('./云音乐飙升榜/'+ song_name + '/' + song_name+ '.mp3', 'wb') as file_song:
                file_song.write(songs_response.content)
            # 下载歌词
            lrc_url = 'http://music.163.com/api/song/lyric?id='+songs_id+'&lv=1&kv=1&tv=-1'
            lrc_response = requests.get(lrc_url, headers=self.headers)
            lrc_json = json.loads(lrc_response.text)
            with open('./云音乐飙升榜/'+ song_name + '/' + song_name+ '.txt', 'a') as file_lrc:
                file_lrc.write(lrc_json['lrc']['lyric'])

            # 判断下载数量是否达到预期
            if download_songs_pic < int(self.num):
                download_songs_pic += 1
            else:
                print("下载完成!")
                break
        # 将数据存储在数据库中
        self.save_info()
        self.driver.close()

    # 将数据存放入数据库中
    def save_info(self):
        client = pymongo.MongoClient(host='localhost', port=27017)
        db = client.wangyiyun
        collection = db.music
        for i in range(len(self.songs_name_list)):
            songs_info = {
                'num': i+1,
                'name': self.songs_name_list[i],
                'time': self.songs_times_list[i],
                'author': self.songs_author_list[i],
                'pic_href': self.songs_pic_list[i],
                'href': self.songs_href_list[i],
                'download_rul': self.songs_download_url_list[i]
            }
        collection.remove({})
        self.songs_info_list.append(songs_info)
        collection.insert_many(self.songs_info_list)

if __name__ == "__main__":
    download_songs_num = input("需要下载歌曲数量: ")
    url = 'https://music.163.com/#/discover/toplist'
    headers = {
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36'
    }
    wangyiyun = wangyiyun(url,headers=headers,num=download_songs_num)
    wangyiyun.get_songs()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python下载网易云音乐(云音乐飙升榜) 的相关文章

随机推荐

  • 汇总maven配置失败问题

    1 maven的下载路径里面有中文或者符号 每个路径都要用英文 xff01 xff01 xff01 2 在系统环境中新建 变量名 xff1a MAVEN HOME 变量值 xff1a D Program Files apache maven
  • emq中测试连接8083成功,连接8084失败

    今天在emq中测试连接 xff0c 发现不加密的8083可以连上 xff0c 但加密的8084却连接不上 xff0c 搞半天才发现还有ssl文件未配置 经过找资料得知 xff0c 我是因为服务器上的emqx未配置 1 在域名配置ssl证书后
  • 〖小狼毫〗小狼毫初次使用配置

    这次配置是在中文全拼方式下进行的 xff0c 其他的输入方式可参考一下 xff1b 配置相关资料均来自于网络 一 这次配置实现的功能 英文单词输入日期时间类型输入 xff08 包括年 月 日 星期 几点几分 xff09 表情及颜文字输入 x
  • Windows10桌面美化——打造简洁高效美观桌面

    这是小编的Windows桌面 xff1a 常用的软件都固定在了任务栏上且进行了居中美化 所有的软件都固定在了开始屏幕上 我们的思路是 xff1a 把所有软件全部放在开始屏幕中 xff0c 需要使用时 按下键盘上的 window徽标键 打开
  • 学习笔记:医学图像配准简介—附voxelmorph模型

    VoxelMorph官方代码 xff1a GitHub voxelmorph voxelmorph Unsupervised Learning for Image Registrationb 本文参考了博客 xff1a 基于深度学习的单模医
  • 解决Powershell前面没有base,无法激活虚拟环境问题

    解决Powershell前面没有base xff0c 无法激活虚拟环境问题 1 Windows Powershell与CMD区别 在Win10系统下 xff0c 按住Shift然后点击鼠标右键进入Windows Powershell xff
  • LAMT配置

    tomcat项目部署 java环境安装 span class token punctuation span root 64 host span class token punctuation span span class token co
  • atc: invalid option -- ‘-‘

    最近在参加CANN训练营第三期 xff0c 在做应用课后作业的时候使用atc转化工具出现了如下错误 xff0c 百思不得其解 xff0c 看错误的原因是输入的atc命令都是合法的 xff0c 再看最后一行发现atc在 usr share g
  • 使用Anaconda安装Pychorm和torch ,cmd窗口进入python环境没有问题,但是在Pychorm中编写代码报错找不到torch包

    遇到这种问题很可能的原因是在Pychorm中创建工程时候选择的python解释器选择错误 xff0c 如果自己的电脑上之前就有安装的python IDE xff0c 但是没有安装torch包 xff0c 当选择这个解释器的时候就会出现找不到
  • MindSpore实现手写数字识别代码

    MindSpore是华为自研的一套AI框架 xff0c 最佳匹配昇腾处理器 xff0c 最大程度地发挥硬件能力 作为AI入门的LeNet手写字体识别网络 xff0c 网络大小和数据集都不大 xff0c 可以在CPU上面进行训练和推理 下面是
  • ATC模型转换

    xff08 1 xff09 在使用昇腾硬件 xff08 例如Atlas200 xff09 进行模型推理的时候 xff0c 首先需要使用ATC工具将原始模型转换为适合昇腾硬件的模型 xff08 om xff09 xff0c 支持原始框架类型为
  • TypeError: unsupported operand type(s) for *: ‘NoneType‘ and ‘float‘

    TypeError unsupported operand type s for 39 NoneType 39 and 39 float 39 xff0c 如果遇到这种情况说明NoneType和float不允许 的操作 xff0c 检查一下
  • 使用Image.open时,错误提示找不到文件

    Image open img path 这里的img path要是绝对路径 xff08 也就是图片在电脑上的路径 xff09 或者是执行的 py文件图片是在同一个目录下 xff0c 如果图片在另一个目录下 xff0c 编写代码的 py文件在
  • ToTensor() takes no arguments

    在写深度学习网络的时候如果出现如上错误 xff1a ToTensor takes no arguments 我当时的情况是transform 61 torchvision transforms ToTensor 这句代码 由于刚开始ToTe
  • 2022CANN训练营进阶班大作业1调试分享

    题目 xff1a 也就是输入一张JPEG图片 xff0c 经过DVPP解码 43 缩放 43 编码后将结果输出 xff0c 由于gitee代码仓中没有直接可以实现的代码 xff0c 不过提供了jpege xff0c resize xff0c
  • b660和b660m的区别 b660和b660m差多少

    1 xff1a B660M K D4 CPU供电部分有散热片 xff0c 有利于高负载供电的稳定性 2 xff1a B660M K D4具有2个M 2硬盘插槽 xff0c 而B660M P D4是1个M 2硬盘插槽 3 xff1a B660
  • OpenCV4遇到的报错及解决办法

    刚开始学习OpenCV4 xff0c 遇到一些错 xff0c 网上搜索错误原因和解决办法 xff0c 做个记录吧 报错 xff1a CV LOAD IMAGE COLOR 解决办法 xff1a 加入头文件 include opencv2 i
  • nginx的配置和详解

    nginx简介 nginx xff08 发音同engine x xff09 是一款轻量级的Web服务器 反向代理服务器及电子邮件 xff08 IMAP POP3 xff09 代理服务器 xff0c 并在一个BSD like协议下发行 ngi
  • The following packages have unmet dependencies问题解决

    当出现这些问题时一直追加安装即可
  • Python下载网易云音乐(云音乐飙升榜)

    最近突然想用python写一个自动下载的工具 xff0c 于是就先拿网易云来练练手 xff0c 并把过程中的心得写下来便于后面有想玩这个的童鞋们参考 首先我们分析网页源码 xff0c 找到我们想要的获取数据位置 xff1a 每一个标签对应着