如果你常听音乐的话,肯定绕不开网易云,作为一款有情怀的音乐 App,我对网易云也是喜爱有加。虽然说现在都已经是 5G 时代了,大家的手机流量都绰绰有余,但在线播放还是不如本地存着音乐文件靠谱,今天我们就用 Python 来一键下载网易云音乐乐库。

先来看下最终的效果。

其实下载音乐不难,只需要获取到音乐文件播放的地址就可以通过文件流读取的方式直接下载下来。那么问题就转化为如何获取音乐文件的播放地址了。

榜单分析

我们可以打开网易云排行榜 https://music.163.com/#/discover/toplist?id=19723756 ,仔细分析我们发现该网页左边一列全是排行榜,每个排行榜都对应这不同的排行榜 ID,具体 ID 是多少,直接调开开发者工具即可清晰的看到。

由上图我们可以看到榜单是放在一个 class='f-cb' 的 ul 列表里面的,所以只需要获取到该 ul 列表的 li 标签即可。而对于每一个 li 标签来说,其 data-res-id 属性则是榜单 id,而榜单名称则是属于该 li 标签下的 div 中 class='name' 的 p 标签下的 a 标签的内容。因此我们获取到 li 标签的集合之后,遍历该集合依次取出榜单 id 和榜单名称即可。

于是我们有了下面的函数,获取所有的榜单,该函数返回值是一个字典,key 为 榜单 id,值为榜单名称。

url = 'https://music.163.com/discover/toplist'
hd = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
}def get_topic_ids():r = requests.get(url, headers=hd)html = etree.HTML(r.text)nodes = html.xpath("//ul[@class='f-cb']/li")logger.info('{}  {}'.format('榜单 ID', '榜单名称'))ans = dict()for node in nodes:id = node.xpath('./@data-res-id')[0]name = node.xpath("./div/p[@class='name']/a/text()")[0]ans[id] = namelogger.info('{}  {}'.format(id, name))return ans

歌曲分析

上面我们获取到了所有的榜单数据,那么针对单个榜单来说,就是要获取其下的所有歌曲了。

分析页面原属可知,歌曲列表是在一个 table 中的,但是通过 requests.get(url,headers=hd)方式获取返回的网页文本内容的话,貌似是获取不到 table 元素的。于是我们将其返回值输出后做了仔细分析,发现歌曲是在 class="f-hide" 的 ul 标签中。与获取榜单类似,同样需要先获取所有的 li 标签,然后在逐个获取歌曲 id 和歌曲 name 就可以了。

def get_topic_songs(topic_id, topic_name):params = {'id': topic_id}r = requests.get(url, params=params, headers=hd)html = etree.HTML(r.text)nodes = html.xpath("//ul[@class='f-hide']/li")ans = dict()logger.info('{} 榜单 {} 共有歌曲 {} 首 {}'.format('*' * 10, topic_name, len(nodes), '*' * 10))for node in nodes:id = node.xpath('./a/@href')[0].split('=')[1]name = node.xpath('./a/text()')[0]ans[id] = namelogger.info('{}  {}'.format(id, name))return ans

同样该函数返回一个字典,key 为歌曲 id,value 为歌曲名称。

下载歌曲

我们还需要一个下载歌曲的函数,该函数接收歌曲 id,然后以文件流的形式直接读取到本地。

def down_song_by_song_id_name(id, name):if not os.path.exists(download_dir):os.mkdir(download_dir)url = 'http://music.163.com/song/media/outer/url?id={}.mp3'r = requests.get(url.format(id), headers=hd)is_fail = Falsetry:with open(download_dir + name + '.mp3', 'wb') as f:f.write(r.content)except:is_fail = Truelogger.info("%s 下载出错" % name)if (not is_fail):logger.info("%s 下载完成" % name)

最后将所有的操作组合到 main 函数中,作为程序的入口函数。

def main():ids = get_topic_ids()while True:print('')logger.info('输入 Q 退出程序')logger.info('输入 A 下载全部榜单歌曲')logger.info('输入榜单 Id 下载当前榜单歌曲')id = input('请输入:')if str(id) == 'Q':breakelif str(id) == 'A':for id in ids:down_song_by_topic_id(id, ids[id])else:print('')ans = get_topic_songs(id, ids[id])print('')logger.info('输入 Q 退出程序')logger.info('输入 A 下载全部歌曲')logger.info('输入歌曲 Id 下载当前歌曲')id = input('请输入:')if str(id) == 'Q':breakelif id == 'A':down_song_by_topic_id(id, ans[id])else:down_song_by_song_id_name(id, ans[id])if __name__ == "__main__":main()

总结

今天我们以网易云网页版为数据源来下载音乐文件,其中下载操作是最简单的,比较麻烦的是分析榜单 id 和获取榜单下的歌曲列表,但榜单下的歌曲列表其实远不止 10 条,而我们获取歌曲的函数 get_topic_songs 每次只可以获取 10 条歌曲,这是因为我们没有在 headers 添加 cookie 导致的,因为只有登录之后才会显示所有的歌曲。小伙伴们可以登录自己的账户然后添加 cookie 做下尝试。

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入

利用 Python 一键下载网易云音乐 10W+ 乐库相关推荐

  1. 使用Python实现下载网易云音乐的高清MV

    Python下载网易云音乐的高清MV,没有从首页进去解析,直接循环了.... downPage1.py ''' 想要学习Python?Python学习交流群:984632579满足你的需求,资料都已经 ...

  2. python免费下载歌曲_实现python批量下载网易云音乐的免费音乐

    python视频教程栏目介绍实现下载免费音乐 相关免费学习推荐:python视频教程 运行效果 代码# -*- coding:utf-8 -*- import requests, hashlib, s ...

  3. python下载歌曲教程视频_实现python批量下载网易云音乐的免费音乐

    python视频教程栏目介绍实现下载免费音乐 运行效果 代码# -*- coding:utf-8 -*- import requests, hashlib, sys, click, re, base6 ...

  4. 怎么用python下载网易云_实现python批量下载网易云音乐的免费音乐

    python视频教程栏目介绍实现下载免费音乐 相关免费学习推荐:python视频教程 运行效果 代码# -*- coding:utf-8 -*- import requests, hashlib, s ...

  5. Python批量下载网易云音乐飙升榜所有音乐文件

    Python小屋刷题神器最近升级的新功能介绍 推荐教材:<Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社,2018.8出版,2021.3第 ...

  6. python批量下载网易云音乐的免费音乐

    python视频教程栏目介绍实现下载免费音乐 相关免费学习推荐:python视频教程 运行效果 代码 # -*- coding:utf-8 -*-import requests, hashlib, s ...

  7. 零基础也能看懂python_零基础也能看懂的Python下载网易云音乐爬虫

    Python Selenium(配置方法参照:Selenium配置) Chrome浏览器(其它的也可以,需要进行相应的修改) 解析 以前抓取过网易云网页的朋友可能都清楚网易云有反爬虫策略的,post时 ...

  8. Python3批量下载网易云音乐热歌榜

    Python3批量下载网易云音乐热歌榜 可以批量下载网易云音乐热歌榜的歌曲,可以自己设定数量,速度非常快. https://music.163.com/#/discover/toplist?id=37 ...

  9. 如何下载网易云音乐APP里的MV和短视频?

    本人:网易云音乐死粉,朋友圈大多都用的是云音乐,因为推荐功能牛逼 然后:发现云音乐APP里越来越多吸引我的短视频,经常看到好的就想保存到相册,然后微信发给朋友 但是:不知道怎么下载网易云音乐的短视频, ...

最新文章

  1. 影响数千万APP的安卓APP“寄生兽”漏洞技术分析
  2. 关于运算符重载的问题
  3. 控制台调用win32 API 示例二则
  4. mysql5.7配置_MySQL5.7详细配置教程
  5. 骗子是这样把1G硬盘变成120G的
  6. 曹大带我学 Go(7)—— 如何优雅地指定配置项
  7. 一个程序员的爱情故事
  8. spring+hibernate中的Result object returned from HibernateCallback isn't a List
  9. Spring Security中的SecurityContext和SecurityContextHolder是什么?
  10. I/O模型系列之四:两种高性能IO设计模式 Reactor 和 Proactor
  11. MySql 、Oracle 获取表结构和字段信息
  12. 以图搜图 图像匹配_图像匹配,基于深度学习DenseNet实现以图搜图功能
  13. keil 快捷键_KEIL 那些编辑技巧与方法
  14. q learning简单理解_如何用简单例子讲解 Q learning 的具体过程?
  15. Go 大败!Google 宣布 Fuchsia 终端开发只支持 C/C++/Dart
  16. 清华自主招生复试,南大综合评价录取,全都考了人工智能
  17. Zabbix 触发器函数方法整理
  18. Delphi Open Tools Api实例研究(一)
  19. 虚拟机安装win10教程
  20. 苹果亮度自动调节怎么关闭_Redmi K30 Pro自动亮度调节和iPhone基本一致,安卓手机的大进步...

热门文章

  1. MATLAB怎么做心电图,教你如何做心电图以及教程.ppt
  2. Unity 2017.1正式版发布
  3. python三行情书_三行代码作品
  4. python 西门子触摸屏通讯_触摸屏通讯
  5. Python基础学习-1-廖雪峰课程-Python的数据类型和面向对象
  6. Linux下的用户与用户组管理命令(含上机作业)
  7. arm架构安装虚拟XP
  8. orcad与pads的转换
  9. 数学建模常用模型16 :对应分析
  10. oracle10g安装教程