手把手教你用python编程写一款自己的音乐下载器

  • 前言
  • 一、技术实现
  • 1.前人栽树后人乘凉2.后来者居上3.集大成者
  • 二、后续改进
  • 写在最后
私信小编01即可获取大量Python学习资料
Tip:本文仅供学习与交流 , 切勿用于非法用途!!!
前言某个夜深人静的夜晚 , 我打开了自己的文件夹 , 发现了自己写了许多似乎很无聊的代码 。 于是乎 , 一个想法油然而生:“生活已经很无聊了 , 不如再无聊一点叭” 。 说干就干 , 那就开一个专题 , 我们称之为kimol君的无聊小发明 。 妙…啊~~~
直奔主题!本文主题是用python做一个音乐下载器(MusicLover) , 直接上图:
手把手教你用python编程写一款自己的音乐下载器文章插图
想必看到这里 , 各位看官的脑海中已经脑补出各种JS解密 , 参数分析等等让初学者很头疼的东东了 。
然而 , 我并不打算这么干~(小声嘀咕:“没想到吧”)本文很友好 , 也很适合初学者 , 而且功能依然强大!欲知后事如何 , 客官您下面请~
一、技术实现1.前人栽树后人乘凉为了避免繁杂的分析和破解过程 , 我不是直接冲去某云音乐、某Q音乐就是肝 。 通过在网上搜索我找到了一个网站 。 通过测试 , 我发现它可以支持多个音乐平台的音乐下载 。 既然如此 , 我何不在它的基础上来进行开发 , 正所谓“前人栽树后人乘凉” , 岂不妙哉?
2.后来者居上通过浏览器自带的工具(按F12) , 网络拦截抓包后可知请求为POST , 且只有4个参数:
手把手教你用python编程写一款自己的音乐下载器文章插图
那么 , 通过requests库便能很好的实现这个请求 。
# 定义相关参数url = '' # 下载接口headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0','Accept':'application/json, text/javascript, */*; q=0.01','Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding':'gzip, deflate, br','Content-Type':'application/x-www-form-urlencoded; charset=UTF-8','X-Requested-With':'XMLHttpRequest','Content-Length':'53','Connection':'keep-alive'} # 请求头data = http://kandian.youth.cn/index/{'input':'林俊杰','filter':'name','type':'qq','page':1} # 请求参数res = requests.post(url,headers=headers,data=http://kandian.youth.cn/index/data)返回的数据为json格式 , 里面包括了音乐的名称 , 作者以及音乐下载地址等信息 。 拿到地址之后 , 我们只需要将其下载到本地即可:
with open('test.m4a','wb') as f:res = requests.get('')f.write(res.content)到这里 , 基本功能已经实现了 。 我们站在前人的肩膀上 , 已经实现了“后来者居上” 。 接下来只需要对它们进行一个包装和集成就行 。
3.集大成者【手把手教你用python编程写一款自己的音乐下载器】包装的方式可以是各种各样 , 这里提供我自己的一个思路 , 仅供参考 , 完整代码如下:
# =============================================================================# MusicLover by kimol# =============================================================================import osimport requestsfrom tqdm import tqdm# 定义相关参数url = '' # 下载接口headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0','Accept':'application/json, text/javascript, */*; q=0.01','Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding':'gzip, deflate, br','Content-Type':'application/x-www-form-urlencoded; charset=UTF-8','X-Requested-With':'XMLHttpRequest','Content-Length':'53','Connection':'keep-alive'} # 请求头data = http://kandian.youth.cn/index/{'input':'','filter':'name','type':'qq','page':1} # 请求参数savePath = './musics' # 音乐保存目录# 检查存储路径是否存在if not os.path.exists(savePath):os.mkdir(savePath)# 欢迎界面welcome = '''________/|//________(_)____/ /____ ___________/ /|_/ / / / / ___/ / ___/ // __ \ | / / _ \/ ___// // / /_/ (__) / /__/ /___/ /_/ / |/ /__/ //_//_/\__,_/____/_/\___/_____/\____/|___/\___/_/'''os.system('cls')os.system('mode con cols=85 lines=25')print(welcome)# 循环开始while True:choice = input('>>>请输入歌名(或歌手):')if choice == 'quit':print('欢迎再次使用~')breakdata['input'] = choiceres = requests.post(url,headers=headers,data=http://kandian.youth.cn/index/data)d_json = res.json() # 搜索结果musics = d_json['data']if d_json['code'] != 200:print('搜索结果为空 , 请重新输入')continueelse:print('*'*45)print('{0:{3}