Python爬虫 - 网易云音乐下载

爬取网易云音乐实战,仅供学习,不可商用,出现问题,概不负责!

分为爬取网易云歌单和排行榜单两部分。

因为网页中,只能显示出歌单的前20首歌曲,所以仅支持下载前20首歌曲(非VIP音乐)

在这里插入图片描述

具体过程:

1.通过抓包,获取到请求头

在这里插入图片描述

headers = {
    "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
    "Cookie": "替换为自己的Cookie",
    "Sec-Ch-Ua-Platform": "macOS",
    "Sec-Fetch-Dest": "iframe",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "same-origin",
    "Upgrade-Insecure-Requests": "1"
}

2.发送请求,获取到网页源代码,通过Xpath进行解析,获取到歌曲名称,歌手名字,以及歌曲id

url = input("请输入要抓取的歌单链接:")
url = url.replace("/#", "")
res = requests.get(url, headers=headers)
res.encoding = 'utf-8'
res = res.text
html = etree.HTML(res)
title = html.xpath('//h2[@class="f-ff2 f-brk"]/text()')
songs = html.xpath('//ul[@class="f-hide"]/li/a/@href')
names = html.xpath('//ul[@class="f-hide"]/li/a/text()')

3.并分别对歌单创建单独的文件夹,进行歌曲存放

if len(title)!=0:
    path = './网易云歌单/' + title[0] + "/"
else:
    path = "./网易云歌单/未知歌单/"

if not os.path.exists(path):
    os.makedirs(path)

4.判断是否为VIP歌曲,将VIP歌曲排除

for i in range(len(music_urls)):
    try:
        res = requests.get(music_urls[i], headers=headers).content.decode('utf-8')
        if res.find('很抱歉,你要查找的网页找不到') != -1:
            print(names[i] + ',VIP专属歌曲,无法下载')
            remove_url.append(music_urls[i])
            remove_name.append(names[i])
            continue
    except:
        pass
for item in remove_name:
    names.remove(item)
for url in remove_url:
    music_urls.remove(url)

5.下载歌曲

for i in range(len(music_urls)):
    try:
        print('正在下载..', names[i])
        res = requests.get(music_urls[i], headers=headers)
        with open(path + names[i] + ".mp3", "wb") as f:
            f.write(res.content)
        print('下载成功..', names[i])
    except Exception as e:
        if os.path.exists(path + names[i] + ".mp3"):
            os.remove(path + names[i] + ".mp3")
        print('下载失败,请联系管理员')

6.对于排行榜部分,和歌单逻辑基本相同

url = input("请输入榜单链接:")
url = url.replace("/#", "")
res = requests.get(url, headers=headers)
res.encoding = 'utf-8'
res = res.text
html = etree.HTML(res)
title = html.xpath('//h2[@class="f-ff2"]/text()')
songs = html.xpath('//ul[@class="f-hide"]/li/a/@href')
names = html.xpath('//ul[@class="f-hide"]/li/a/text()')
if len(title)!=0:
    path = './网易云歌单/' + title[0] + "/"
else:
    path = "./网易云歌单/未知歌单/"

if not os.path.exists(path):
    os.makedirs(path)

for item in songs:
    temp = str(item).replace("/song?id=", "")
    ids.append(temp)

music_urls = []
for id in ids:
    music_urls.append(baseUrl + id + '.mp3')
downLoad(music_urls, names, path)

下载部分与下载歌单歌曲相同。

结果:

在这里插入图片描述

在这里插入图片描述

完整代码

联系邮箱:mango_1698@163.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/331923.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

滑动窗口经典入门题-——长度最小子数组

文章目录 算法原理题目解析暴力枚举法的代码优化第一步初始化第二步right右移第三步left右移 滑动窗口法的代码 算法原理 滑动窗口是一种在序列(例如数组或链表)上解决问题的算法模式。它通常用于解决子数组或子字符串的问题,其中滑动窗口表示…

【Redis】Redis基础

Redis基础 初识Redis 认识NoSQL SQL:结构化查询语言 > 关系型数据库 NoSQL:非关系型数据库 SQL与NoSQL的差异: 数据结构 SQL结构化:表的信息依赖于表的结构NoSQL非结构化:存储的信息为KV形式 数据关联 SQL关联…

Android NDK Crash信息收集捕获和日志异常定位分析(addr2line)

Android NDK 闪退日志收集与分析 我们在开发过程中,Android JNI层Crash问题或者我们引用的第三方.so库文件报错,都是一个比较头疼的问题。相对Java层来说,由于c/c++造成的crash没有输出如同Java的Exception Strace堆栈信息,所以定位问题也是个比较艰难的事情。 Google Br…

Nomogram文献分析:提取数据

前言 今天教大家如何分析Nomogram类型的文章,并使用我们开发的系统零代码提取数据。 系统地址:https://clinicaldata.fun/ 要分析的文章:https://pubmed.ncbi.nlm.nih.gov/36504658/ 。这是一篇典型的mimic-iii数据分析的套路,…

智能小程序开发项目步骤流程

快速开始 在开发小程序之前,请确保电脑上已经安装node运行环境。可前往Node.js官网(opens in a new tab)下载安装。智能小程序环境搭建和面板小程序一致,请参考面板小程序搭建环境指南。 开发小程序的流程: 使用涂鸦开发者 IoT 账号登录 T…

c语言-结构体内存对齐

文章目录 前言一、结构体内存对齐总结 前言 本篇文章介绍结构体内存对齐。 一、结构体内存对齐 定义两个结构体: struct S1 {char c1;int i;char c2; };struct S2 {char c1;char c2;int i; }; //输出结构体大小 int main() {printf("%u\n", sizeof(st…

未来能源转型之路:2023年第十三届中国国际储能大会启示录

在2023年第十三届中国国际储能大会上,全球各地的能源专家、学者和企业代表齐聚一堂,共同探讨了储能技术在推动能源转型中的重要作用。对于我们普通人来说,从这场大会中可以学到什么呢? 一、储能技术是未来能源发展的关键 随着可再…

李沐《动手学深度学习》线性神经网络 softmax回归

系列文章 李沐《动手学深度学习》预备知识 张量操作及数据处理 李沐《动手学深度学习》预备知识 线性代数及微积分 李沐《动手学深度学习》线性神经网络 线性回归 目录 系列文章一、softmax回归(一)问题背景(二)网络架构&#xf…

win11启动docker desktop报错 docker desktop unexpected wsl error

win11启动docker desktop报错 docker desktop unexpected wsl error 解决方式, 第一步:控制面板-启动或关闭windows功能窗口勾选下面两个框框 第二步:执行我下面这些命令,不需要重启电脑

Linux:shell脚本:基础使用(7)《exit和break》

exit是结束脚本,不论在脚本任何地方使用,这个脚本就会立马结束,不会继续执行后面的所有命令 break 是结束循环,break只能在循环中使用,并且只对距离自己最近的循环生效,如果循环嵌套循环那么break在哪个循环…

js菜单隐藏显示

1、树状结构对应的表: 2、生成menulist的SQL语句 select {"id":"MenuID","parent":"ParentID","FirstLvMenu":"FirstLvMenu", "text":"MenuName","url":"MenuUrl",&quo…

Linux基础命令和文件操作理解

1.基础命令 快捷键 ctrl alt t 打开终端 ctrl e 跳转终端输入的末尾 ctrl u 清除一行的命令数据 ctrl a 跳转到终端命令开头 ctrl l 清除整个屏幕,不包括当前行 ctrl r 搜索命令 开启历史模式 寻找最近记录的命令:↑ ↓ 移动光标位置 :← →…

游戏《泰坦陨落2》msvcr120.dll丢失的多种解决方法分享

在Windows 11操作系统环境下,众多玩家在体验《泰坦陨落2》这款备受瞩目的射击游戏时,遭遇了一个令人困扰的技术问题:系统提示缺失msvcr120.dll文件。这一关键的动态链接库文件对于游戏的正常运行至关重要,它的缺失直接导致了《泰坦…

拿出最少数目的魔法豆

说在前面 🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。 题目描述 请你从每个袋子中 拿出 一些豆子(也可以 不拿出),使得剩…

基于Python+django影片数据爬取与数据分析设计与实现

目录 一、 前言介绍: 二 、功能设计: 三、功能实现: 系统登录实现 管理员实现 用户模块实现 四、库表设计: 五、关键代码: 六、论文参考: 七、其他案例: 八、源码获取: 一…

fastJson和jackson的日期数据处理

目录 1.jackson 2.fastjson 3.总结 1.jackson jackson是spring mvc默认的JSON解析方法,前端的数据序列化处理之后,后端经过反序列化处理可以直接使用实体对象进行接收。后端接口返回实体对象,经过序列化处理后前端可以接收并进行处理。 …

目标检测--02(Two Stage目标检测算法1)

Two Stage目标检测算法 R-CNN R-CNN有哪些创新点? 使用CNN(ConvNet)对 region proposals 计算 feature vectors。从经验驱动特征(SIFT、HOG)到数据驱动特征(CNN feature map),提高特…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-4 label

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>label</title> </head><body> 性别: <label for"male">男</label> <input type"radio" name"sex&quo…

多输入多输出 | Matlab实现基于LightGBM多输入多输出预测

多输入多输出 | Matlab实现基于LightGBM多输入多输出预测 目录 多输入多输出 | Matlab实现基于LightGBM多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于LightGBM多输入多输出预测&#xff08;完整源码和数据&#xff09; 1.data为数据集&a…

java多线程(线程池)

1、创建一个可缓存线程池&#xff0c;如果线程池长度超过处理需要&#xff0c;可灵活回收空闲线程&#xff0c;若无可回收&#xff0c;则新建线程。 public static void main(String[] args) {ExecutorService cachedThreadPool Executors.newCachedThreadPool();for (int i …