用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正则表达式 re模块使用说明
May 19 Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 Python
举例讲解Python中的list列表数据结构用法
Mar 12 Python
Python 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
利用Python进行异常值分析实例代码
Dec 07 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
Jan 15 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
Jun 11 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
Django框架首页和登录页分离操作示例
May 28 Python
Python代码太长换行的实现
Jul 05 Python
python中bs4.BeautifulSoup的基本用法
Jul 27 Python
深入分析python 排序
Aug 24 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二维数组去重实例分析
2016/11/18 PHP
PDO::quote讲解
2019/01/29 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
2013/07/31 Javascript
使用js如何实现全选与全不选
2013/12/30 Javascript
删除节点的jquery代码
2014/01/13 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
2020/05/29 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
解决node-sass偶尔安装失败的方法小结
2018/12/05 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python re正则表达式模块(Regular Expression)
2014/07/16 Python
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
Django数据库操作之save与update的使用
2020/04/01 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
2021/01/07 Python
请描述一下”is a”关系和”has a”关系
2015/02/03 面试题
介绍一下游标
2012/01/10 面试题
决定成败的关键——创业计划书
2014/01/24 职场文书
安全生产实施方案
2014/02/23 职场文书
高中生班主任评语
2014/04/25 职场文书
求职自我推荐信
2014/06/25 职场文书
模具专业求职信
2014/06/26 职场文书
消费者理赔投诉书
2015/07/02 职场文书
2019安全宣传标语大全
2019/08/14 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript