小项目实现:下载网易云某个歌单的全部音乐
第一步:用歌曲地址先实现一首歌的下载
利用:
- song_url (例如:
- 头文件 实现 把歌曲保存到本地指定的文件夹 思路 用两个函数:一个实现返回音乐文件,一个实现保存
import urllib.request
import os
import re
import pprint
import requests
def m4aurl_open(url):
response = requests.get(url)
with open("千与千寻.mp3", mode = "wb") as f: #wb表示写入二进制数据(图片)
f.write(response.content) #content表示response中的内容
def main():
url = "https://m701.music.126.net/20190719182334/a17b4018e5fad319f1291b3b648c0886/jdyyaac/035a/545e/040e/40e68c744cc4b9e7bbdc3daa6c91c8bd.m4a"
m4aurl_open(url)
遇到的问题,当开始用urllib中的urlopen访问歌曲的url,结果一直是forbidden,后来改为request.get()问题得到解决!
第二步:用网址实现一首歌的下载
利用:
- url (例如:
- 头文件
实现 把歌曲保存到本地指定的文件夹
思路 用两个函数:一个实现返回音乐文件,一个实现保存
利用网页url -----找到------》歌曲地址song_url--------保存———》保存到本地
在这一步遇到了无法解决的难题:网易云是动态网页,请求音乐时使用的附加文件是params和encSecKey键值的一串无规则数字:
该项目的目的和我想得一样(下载网易云某个歌单上的全部音乐),所以我的这个小项目到这里就结束了。
解决思路大致如下:
params和encSecKey的值是和歌曲的id有关的加密信息,并且是一一对应、有规律可循的。
通过全局搜索encSecKey,定位encSecKey所在位置:
在encSecKey所在位置设置断点,刷新网页,分析encSecKey的产生函数window.asrsea,并找到该函数的本质(d函数):
可以看到d函数是一个和a、b、c三个函数有关的,而且经过b函数两次加密后得到encText和encSecKey,顺藤摸瓜,找到a、b、c函数:
大功告成 至此:我们得到了请求音乐时使用的附加文件params和encSecKey!!
————————————第二步 end————————————————————————————————
第三步:用歌单网址下载一批歌曲
利用
- 歌单url
实现 把歌单中全部曲目保存到本地
思路 爬取歌单网页的html,正则方法或者xpath方法找到歌曲id,结合第二步的程序实现下载。
这一步我没做,直接参考了下面的文章
