通过手动添加id从云音乐接口一键下载音乐(Python3实现)

  首先,谈论下思路和准备工作。

  思路是,先去网易云音乐平台试试水,看看各大音乐库是否“有机可乘”。当然这过程是用谷歌Network监控浏览器与服务器交互请求,如下图:

  结果发现,果然是大厂,竟然把相关的有歌曲重要信息的json都给屏蔽了。

  可以看到里面都是些无关紧要的东西:

  通过网络一些博主,了解到了一些有用的接口,可以直接获取歌曲信息,比如这个:

https://music.163.com/api/playlist/detail?id=10169002

还有这个

https://music.163.com/api/song/enhance/download/url?br=320000&id=28445467  (歌曲下载 id为歌曲id,br为播放码率)

结果发现,前者的重要字段mp3Url缺失values值,而后者依赖song_id,没有id无法获取对应信息。

扫描二维码关注公众号,回复: 15265579 查看本文章

如图:

--没有输入id的情况:

  我们要获取什么信息呢,主要是歌曲下载链接,歌曲id,歌词下载链接,之类的~

  现在唯一的希望是通过歌曲id,来通过这个接口一条条获取下载url:https://music.163.com/api/song/enhance/download/url?br=320000&id=  (需补充歌曲id)

  那么完整流程是这样的:获取歌曲id,以获取下载链接,若能获取歌曲名最好,不能则命名,通过程序批量下载到指定文件夹,以新命名的名字保存。

放下代码:

...
r = requests.get('https://music.163.com/api/playlist/detail?id=10169002') 
arr = r.json()['result']['tracks']   #热歌榜歌
# mp3_id = arr[i]['id']  #API变更,现在从id入手
# mp3_id = 27808044  #测试专用~~

这里的http获取链接是测试链接,是  #香港电台音乐龙虎榜

通过浏览器开发者选项(Chrome里)可看到json 的封装层次:

需要注意的是:刷新才可看到此请求

我们展开它,得到下图:

按照代码逻辑,这样mp3_id可以正常获取到,但是笔者发现有点尴尬的是,只要是热榜的歌曲,就算有歌曲id了,但是获取不了,url。举个列子:

图中青春终老的id:574963447

去接口查看url:很遗憾是空的

无奈,只能去非热榜抠出歌曲id,但是非热榜没有查出对应接口可以列出全部歌曲id,

所以这些准备没有用。只能通过美丽汤(BeautifulSoup)过滤或者,手动录入。这里笔者尚未用过美丽汤,暂时手动录入。

于是有了:

L = [1294910785,32507038,557583281,557581967,471385043,574921549,415792881,417859631,27955653,27890306,
32192436,516657051,571340283,468517654,27955658,27955654,35528482,515803379,474567044,525241230,553543014,
466122271,27955656,518894283,412902689,32507039,27955652,169140,169137,429450375]  #在薛之谦#个人专辑录入

for i in range(30):
	print(L[i])

for mp3_id in L:   
	# name = str(i+1) + ' ' + arr[i]['name'] + '.mp3'
	n = len(L)
	n = n - 1
	global name
	name = str(mp3_id) + '_薛之谦.mp3'
	apiUrl = 'http://music.163.com/api/song/enhance/download/url?br=320000&id=' + str(mp3_id)  #可以通过apiUrl查到Mp3的url
	print('apiUrl = ' + apiUrl)
	# print(name)


	# mp3_id = arr[i]['id']  #API变更,现在从id入手
	# mp3_id = 27808044  #测试专用~~
	newr = requests.get(apiUrl)

这里可以看到是另命名的方式命名歌曲,以id+薛之谦.mp3命名,

newr可以获取到单个歌曲的歌曲信息,

通过正常的字典操作,获取url

这样就可以顺利下载了。这里因为已经下载就不下载了,复制代码文件到其它目录,dos环境下切换到此目录,运行:

----

好的,收工。

放下完整代码:

# -*- coding: utf8 -*-

'this is a greate beginning'
__author__ = 'Hardy'
#python3.7.0

########import this
import requests   #注意request库和requests有根本区别,!去python.org官网的pypi里下载正确的库
import urllib

test = 'test'
#网易云音乐下载-python爬虫尝试
#榜单歌曲批量下载
# r = requests.get('https://music.163.com/discover/toplist?id=19723756')  #云音乐飙升榜
# r = requests.get('https://music.163.com/api/playlist/detail?id=3779629')   #云音乐新歌榜
# r = requests.get('https://music.163.com/api/playlist/detail?id=2884035')   #网易原创歌曲榜
# r = requests.get('https://music.163.com/api/playlist/detail?id=3778678')   #云音乐热歌榜
r = requests.get('https://music.163.com/api/playlist/detail?id=10169002')  #香港电台音乐龙虎榜
# r = requests.get('https://music.163.com/api/playlist/detail?id=2250011882')  #抖音排行榜

#歌单歌曲批量下载
# r = requests.get('https://music.163.com/api/playlist/detail?id=2388322013')   #最是粤语最为情深 也唯独你最难忘怀
# r = requests.get('https://music.163.com/api/playlist/detail?id=118289341')    #♫乡村音乐你是如此好听

arr = r.json()['result']['tracks']   #热歌榜歌
L = [1294910785,32507038,557583281,557581967,471385043,574921549,415792881,417859631,27955653,27890306,
32192436,516657051,571340283,468517654,27955658,27955654,35528482,515803379,474567044,525241230,553543014,
466122271,27955656,518894283,412902689,32507039,27955652,169140,169137,429450375]
for i in range(30):
	print(L[i])

for mp3_id in L:   
	# name = str(i+1) + ' ' + arr[i]['name'] + '.mp3'
	n = len(L)
	n = n - 1
	global name
	name = str(mp3_id) + '_薛之谦.mp3'
	apiUrl = 'http://music.163.com/api/song/enhance/download/url?br=320000&id=' + str(mp3_id)  #可以通过apiUrl查到Mp3的url
	print('apiUrl = ' + apiUrl)
	# print(name)


	# mp3_id = arr[i]['id']  #API变更,现在从id入手
	# mp3_id = 27808044  #测试专用~~
	newr = requests.get(apiUrl)

	s = str(mp3_id)
	if s == '':
		print('error,now we can\'t download it')
	else:
		n_arr = newr.json()['data']['url']    #这里正常情况下可以获取url
		if n_arr != '':
			link = n_arr
			urllib.request.urlretrieve(link,'网易云音乐\\' + name)
			print(name + ' 下载完成')
print('Download Completed!!!')


#歌词:http://music.163.com/api/song/media?id=429450375
#单曲Json包:http://music.163.com/api/song/enhance/download/url?br=320000&id=429450375
#歌曲播放器: https://music.163.com/api/song/enhance/player/url 
# https://music.163.com/api/song/enhance/download/url?br=320000&id=28445467  --歌曲下载 id为歌曲id,br为播放码率
# 接口数据用的id=123456&ids=[123456]&br=3200000  --经测试可用,请各位合理使用,免得又被封禁

环境准备说明:Python3、Requests库、request库  (库都是在Python.org官网的Pypi菜单里下的)、BeautifulSoup库。Sublime代码编辑器、Chrome浏览器、一定硬盘空间。

美中不足的是此此操作没有用美丽汤完成。

需要注意的是:在代码路径需要创建名为“网易云音乐”的目录

关于库的一些小技巧:新建个文件以py结尾:

里面输入导入库的code:然后按Ctrl+B执行

如果没有以下提示是正常的

正确的结果:

好的,就写到这。

猜你喜欢

转载自blog.csdn.net/qq_17195161/article/details/82665843