用python制作个音乐下载器


Posted in Python onJanuary 30, 2021

前言

某个夜深人静的夜晚,我打开了自己的文件夹,发现了自己写了许多似乎很无聊的代码。于是乎,一个想法油然而生:“生活已经很无聊了,不如再无聊一点叭”。
说干就干,那就开一个专题,我们称之为kimol君的无聊小发明。
妙…啊~~~

直奔主题!本文主题是用python做一个音乐下载器(MusicLover),直接上图:

用python制作个音乐下载器

想必看到这里,各位看官的脑海中已经脑补出各种JS解密,参数分析等等让初学者很头疼的东东了。

然而,我并不打算这么干~(小声嘀咕:“没想到吧”)
本文很友好,也很适合初学者,而且功能依然强大!
欲知后事如何,客官您下面请~

一、技术实现

1.前人栽树后人乘凉

为了避免繁杂的分析和破解过程,我不是直接冲去某云音乐、某Q音乐就是肝。通过在网上搜索我找到了一个网站。
通过测试,我发现它可以支持多个音乐平台的音乐下载。既然如此,我何不在它的基础上来进行开发,正所谓“前人栽树后人乘凉”,岂不妙哉?

2.后来者居上

通过浏览器自带的工具(按F12),网络拦截抓包后可知请求为POST,且只有4个参数:

用python制作个音乐下载器

那么,通过requests库便能很好的实现这个请求。

# 定义相关参数
url = 'https://music.sonimei.cn' # 下载接口
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 = {'input':'林俊杰',
    'filter':'name',
    'type':'qq',
    'page':1} # 请求参数
res = requests.post(url,headers=headers,data=data)

返回的数据为json格式,里面包括了音乐的名称,作者以及音乐下载地址等信息。拿到地址之后,我们只需要将其下载到本地即可:

with open('test.m4a','wb') as f:
  res = requests.get('http://dl.stream.qqmusic.qq.com/C1000045NGM43ZAUXG.m4a?fromtag=38')
  f.write(res.content)

到这里,基本功能已经实现了。我们站在前人的肩膀上,已经实现了“后来者居上”。接下来只需要对它们进行一个包装和集成就行。

3.集大成者

包装的方式可以是各种各样,这里提供我自己的一个思路,仅供参考,完整代码如下:

# =============================================================================
# MusicLover by kimol
# =============================================================================
import os
import requests
from tqdm import tqdm

# 定义相关参数
url = 'https://music.sonimei.cn' # 下载接口
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 = {'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('欢迎再次使用~')
    break
  data['input'] = choice
  res = requests.post(url,headers=headers,data=data)
  d_json = res.json() # 搜索结果
  musics = d_json['data']
  if d_json['code'] != 200:
    print('搜索结果为空,请重新输入')
    continue
  else:
    print('*'*45)
    print('{0:{3}<4}{1:{3}<10}{2:{3}^10}{3}'.format('序号','歌名','作者',chr(12288)))
    print('*'*45)
    N = 1 # 序号
    for m in musics:
      print('{0:{3}<4}{1:{3}<10}{2:{3}^10}{3}'.format(N,m['title'],m['author'],chr(12288)))
      N += 1
    print('*'*45)
    choice = input('>>>请选择需要下载的歌曲:')
    n = int(choice)
    name = musics[n-1]['title'] # 歌名
    url_download = musics[n-1]['url'] # 下载地址
    bar = tqdm(range(1),ncols=60) # 进度条
    for b in bar:
      res = requests.get(url_download)
      with open('%s/%s.m4a'%(savePath,name),'wb') as f:
        f.write(res.content)
      bar.set_description('下载中')

测试了一下,确实下载成功了:

用python制作个音乐下载器

二、后续改进

很显然,我提供的代码还只是一个很基础的demo,还有很多地方可以去完善,比如:

  1. 美化界面,解决混合文字对齐的问题;
  2. 加入多线程,增加下载速度;
  3. 增加GUI,使操作更加便捷;
  4. 增加多选功能,实现一键下载。

可以做的东西实在太多太多了,我只是抛砖引玉,大家可以发挥自己的无穷的想象。

以上就是用python制作个音乐下载器的详细内容,更多关于python 音乐下载器的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python获取脚本所在目录的正确方法
Apr 15 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
python3 实现一行输入,空格隔开的示例
Nov 14 Python
python 监听salt job状态,并任务数据推送到redis中的方法
Jan 14 Python
Python常见数字运算操作实例小结
Mar 22 Python
Python之pymysql的使用小结
Jul 01 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
浅析PyTorch中nn.Linear的使用
Aug 18 Python
Python检查图片是否损坏及图片类型是否正确过程详解
Sep 30 Python
Python实现查找数据库最接近的数据
Jun 08 Python
解决keras backend 越跑越慢问题
Jun 18 Python
python 管理系统实现mysql交互的示例代码
Dec 06 Python
Python 中Operator模块的使用
Jan 30 #Python
python多线程爬取西刺代理的示例代码
Jan 30 #Python
Python如何实现Paramiko的二次封装
Jan 30 #Python
python实现按日期归档文件
Jan 30 #Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
Jan 30 #Python
如何用Django处理gzip数据流
Jan 29 #Python
Spy++的使用方法及下载教程
Jan 29 #Python
You might like
古巴咖啡 Cubita琥爵咖啡 独特的加勒比海风味咖啡
2021/03/06 新手入门
ThinkPHP多表联合查询的常用方法
2020/03/24 PHP
PHP实现采集抓取淘宝网单个商品信息
2015/01/08 PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
2017/01/13 PHP
文字垂直滚动之javascript代码
2015/07/29 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
2016/02/03 Javascript
BootStrap表单验证实例代码
2017/01/13 Javascript
JavaScript结合HTML DOM实现联动菜单
2017/04/05 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
jQuery插件artDialog.js使用与关闭方法示例
2017/10/09 jQuery
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
2018/09/30 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
js实现筛选功能
2020/11/24 Javascript
约瑟夫问题的Python和C++求解方法
2015/08/20 Python
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
Python使用requests提交HTTP表单的方法
2018/12/26 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
2020/03/24 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
python 实现学生信息管理系统的示例
2020/11/28 Python
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
我们的节日清明节活动方案
2014/03/05 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
政协会议宣传标语
2014/10/09 职场文书
2014年党支部工作总结
2014/11/13 职场文书
2014年个人年终总结
2015/03/09 职场文书
纪委立案决定书
2015/06/24 职场文书
会议简讯范文
2015/07/20 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL