用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 相关文章推荐
github配置使用指南
Nov 18 Python
python实现爬虫下载美女图片
Jul 14 Python
Python做文本按行去重的实现方法
Oct 19 Python
python Opencv将图片转为字符画
Feb 19 Python
python: 判断tuple、list、dict是否为空的方法
Oct 22 Python
python 搭建简单的http server,可直接post文件的实例
Jan 03 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 Python
python 字符串追加实例
Jul 20 Python
python利用7z批量解压rar的实现
Aug 07 Python
详解python中的生成器、迭代器、闭包、装饰器
Aug 22 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
Aug 26 Python
python中time tzset()函数实例用法
Feb 18 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 连接mssql数据库 初学php笔记
2010/03/01 PHP
php include和require的区别深入解析
2013/06/17 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
以文件形式缓存php变量的方法
2015/06/26 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
js获取提交的字符串的字节数
2009/02/09 Javascript
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
2009/04/24 Javascript
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
2014/01/26 Javascript
构造函数+原型模式构造js自定义对象(最通用)
2014/05/12 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
2015/10/31 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
python实现socket端口重定向示例
2014/02/10 Python
Python实现曲线点抽稀算法的示例
2017/10/12 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
Python 绘图库 Matplotlib 入门教程
2018/04/19 Python
图文详解python安装Scrapy框架步骤
2019/05/20 Python
基于Python的Post请求数据爬取的方法详解
2019/06/14 Python
Pytorch实现各种2d卷积示例
2019/12/30 Python
python从ftp获取文件并下载到本地
2020/12/05 Python
html如何对span设置宽度
2019/10/30 HTML / CSS
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
办理居住证介绍信
2014/01/15 职场文书
护士实习求职信
2014/06/22 职场文书
党支部综合考察意见
2015/06/01 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL