首先,谈论下思路和准备工作。
思路是,先去网易云音乐平台试试水,看看各大音乐库是否“有机可乘”。当然这过程是用谷歌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无法获取对应信息。
如图:
--没有输入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执行
如果没有以下提示是正常的
正确的结果:
好的,就写到这。