用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列表与元组详解实例
Nov 01 Python
浅谈MySQL中的触发器
May 05 Python
Python类属性的延迟计算
Oct 22 Python
详解Python3中字符串中的数字提取方法
Jan 14 Python
python构建自定义回调函数详解
Jun 20 Python
老生常谈python中的重载
Nov 11 Python
Flask框架单例模式实现方法详解
Jul 31 Python
使用tqdm显示Python代码执行进度功能
Dec 08 Python
详解python中GPU版本的opencv常用方法介绍
Jul 24 Python
Python自动化xpath实现自动抢票抢货
Sep 19 Python
JupyterNotebook 输出窗口的显示效果调整实现
Sep 22 Python
用python计算文件的MD5值
Dec 23 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生成SessionID和图片校验码的思路和实现代码
2009/03/10 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
2015/12/17 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
Laravel5.1 框架路由基础详解
2020/01/04 PHP
JavaScript返回网页中锚点数目的方法
2015/04/03 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
webpack中引用jquery的简单实现
2016/06/08 Javascript
纯JS代码实现隔行变色鼠标移入高亮
2016/11/23 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
Vue编程式跳转的实例代码详解
2019/07/10 Javascript
js实现点击上传图片并设为模糊背景
2020/08/02 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
Python 可爱的大小写
2008/09/06 Python
python解析html开发库pyquery使用方法
2014/02/07 Python
Python实现的RSS阅读器实例
2015/07/25 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
2017/09/26 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
2018/06/13 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
美国著名的团购网站:Woot
2016/08/02 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
数控专业应届生求职信
2013/11/27 职场文书
网络信息管理员岗位职责
2014/01/05 职场文书
幼儿园教师教育感言
2014/02/28 职场文书
2014年公司工作总结
2014/11/22 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers