用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函数返回多个值的示例方法
Dec 04 Python
python操作xml文件详细介绍
Jun 09 Python
django模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
Python实现删除列表中满足一定条件的元素示例
Jun 12 Python
Python 闭包的使用方法
Sep 07 Python
解决pycharm 误删掉项目文件的处理方法
Oct 22 Python
对python内置map和six.moves.map的区别详解
Dec 19 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
Python+opencv+pyaudio实现带声音屏幕录制
Dec 23 Python
TensorBoard 计算图的查看方式
Feb 15 Python
Python 调用 ES、Solr、Phoenix的示例代码
Nov 23 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 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
在php中使用sockets:从新闻组中获取文章
2006/10/09 PHP
php中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
php自动载入类用法实例分析
2016/06/24 PHP
PHP实现的XML操作类【XML Library】
2016/12/29 PHP
用于table内容排序
2006/07/21 Javascript
Javascript调试工具(下载)
2007/01/09 Javascript
js 键盘记录实现(兼容FireFox和IE)
2010/02/07 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
vue项目中跳转到外部链接的实例讲解
2018/09/20 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
javascript如何实现create方法
2019/11/04 Javascript
JavaScript setTimeout()基本用法有哪些
2020/11/04 Javascript
python实现的简单抽奖系统实例
2015/05/22 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
用python3 urllib破解有道翻译反爬虫机制详解
2019/08/14 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
师范生自荐信范文
2013/10/06 职场文书
反对四风问题自我剖析材料
2014/09/29 职场文书
离婚协议书格式
2014/11/21 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
2015年世界水日活动总结
2015/02/09 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
重阳节活动主持词
2015/07/04 职场文书
详解redis分布式锁的这些坑
2021/05/19 Redis
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python