小项目实现:下载网易云某个歌单的全部音乐

第一步:用歌曲地址先实现一首歌的下载

利用:

  1. song_url (例如:
  2. 头文件 实现 把歌曲保存到本地指定的文件夹 思路 用两个函数:一个实现返回音乐文件,一个实现保存
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()问题得到解决!

第二步:用网址实现一首歌的下载

利用:

  1. url (例如:
  2. 头文件

实现 把歌曲保存到本地指定的文件夹

思路 用两个函数:一个实现返回音乐文件,一个实现保存

利用网页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————————————————————————————————

第三步:用歌单网址下载一批歌曲

利用

  1. 歌单url

实现 把歌单中全部曲目保存到本地

思路 爬取歌单网页的html,正则方法或者xpath方法找到歌曲id,结合第二步的程序实现下载。

这一步我没做,直接参考了下面的文章

经验分享 程序员 微信小程序 职场和发展