如何基于Python批量下载音乐


Posted in Python onNovember 11, 2019

这篇文章主要介绍了如何基于Python批量下载音乐,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

音乐是生活的调剂品,目前很多的音乐只能播放不能下载。生为技术员的我们,怎么甘心呢?

知识点:

  • requests
  • 正则表达式

开发环境:

  • 版 本:anaconda5.2.0(python3.6.5)
  • 编辑器:pycharm

第三方库:

  • requests
  • parsel

网页分析

目标站点:http://music.taihe.com/search?key=%E9%99%88%E7%B2%92

分析音乐的真实地址

选择一首歌 以陈粒的走马为例

如何基于Python批量下载音乐

打开开发者工具,选择network -> media -> 刷新网页就能获取到音乐的真实地址

但是得到的地址在查看源码中是读取不到的,肯定是百度音乐对其进行了隐藏。这种时候一般会有两种情况。第一种是使用了 JavaScript 对请求连接进行了拼接或加密,第二种是数据被隐藏了。由于我们不清楚是出现了那种情况。所以我们只能慢慢的去分析请求的数据。

如何基于Python批量下载音乐如何基于Python批量下载音乐

经过分析我们可以看到真实的音乐地址是存在于这个API里面http://musicapi.taihe.com/v1/restserver/ting?method=baidu.ting.song.playAAC&format=jsonp&callback=jQuery17206453751179783578_1544942124991&songid=243093242&from=web&_=1544942128336

并且我们请求这个 API 返回的是一个 json 数据(也就是python的字典数据类型)。只要我们使用字典的规则就能将我们的所有数据给提取到。

url拼接 获取所有数据

前面我们得到了音乐的真实地址,接下来我们就是分析真实地址的 url ,以期待得到下载所有音乐的诀窍。

如何基于Python批量下载音乐如何基于Python批量下载音乐

仔细分析一下 url 就可以发现,?后面的from参数与_即使不存在也不影响数据的请求。

并且后面的参数中的songid其实就是歌曲的唯一id,from参数其实就是表明从哪个平台过来的

所以等一下我们下载音乐时,只要批量获取到歌曲的songid就能将所有的歌曲给全部下载下来了。

批量获取singid

如何基于Python批量下载音乐 

使用开发者工具,查看网页源码就能查看到songid的位置,如果我们分析一个歌手页面的url你会发现同样可以构造。

到此,整个网页分析就结束了。

实现效果

如何基于Python批量下载音乐 如何基于Python批量下载音乐

完整代码

import re
import requests
​
def get_songid():
  """获取音乐的songid"""
  url = 'http://music.taihe.com/artist/2517'
  response = requests.get(url=url)
  html = response.text
  sids = re.findall(r'href="/song/(\d+)" rel="external nofollow" ', html)
  return sids
​
def get_music_url(songid):
  """获取下载链接"""
  api_url = f'http://musicapi.taihe.com/v1/restserver/ting?method=baidu.ting.song.playAAC&format=jsonp&songid={songid}&from=web'
  response = requests.get(api_url.format(songid=songid))
  data = response.json()
  print(data)
  try:
    music_name = data['songinfo']['title']
    music_url = data['bitrate']['file_link']
    return music_name, music_url
  except Exception as e:
    print(e)
​
def download_music(music_name, music_url):
  """下载音乐"""
  response = requests.get(music_url)
  content = response.content
  save_file(music_name+'.mp3', content)
​
def save_file(filename, content):
  """保存音乐"""
  with open(file=filename, mode="wb") as f:
    f.write(content)
if __name__ == "__main__":
  for song_id in get_songid():
    music_name, music_url = get_music_url(song_id)
    download_music(music_name, music_url)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Flask入门教程实例:搭建一个静态博客
Mar 27 Python
python 遍历字符串(含汉字)实例详解
Apr 04 Python
python监控文件并且发送告警邮件
Jun 21 Python
5分钟 Pipenv 上手指南
Dec 20 Python
python 获取毫秒数,计算调用时长的方法
Feb 20 Python
Python多版本开发环境管理工具介绍
Jul 03 Python
简单了解Pandas缺失值处理方法
Nov 16 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
Python如何通过Flask-Mail发送电子邮件
Jan 29 Python
Python文件读写w+和r+区别解析
Mar 26 Python
解析python 中/ 和 % 和 //(地板除)
Jun 28 Python
Python实现抖音热搜定时爬取功能
Mar 16 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
Nov 11 #Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
Nov 11 #Python
Python序列化与反序列化pickle用法实例
Nov 11 #Python
详解Python可视化神器Yellowbrick使用
Nov 11 #Python
安装Pycharm2019以及配置anconda教程的方法步骤
Nov 11 #Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 #Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 #Python
You might like
php中动态调用函数的方法
2015/03/16 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
Mootools 图片展示插件(lightbox,ImageMenu)收集集合
2010/05/21 Javascript
关于js datetime的那点事
2011/11/15 Javascript
在javascript中关于节点内容加强
2013/04/11 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
node中koa中间件机制详解
2017/08/22 Javascript
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
详解JS中的this、apply、call、bind(经典面试题)
2017/09/19 Javascript
使用Angular CLI从蓝本生成代码详解
2018/03/24 Javascript
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
详解Python是如何实现issubclass的
2019/07/24 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
使用Pyhton集合set()实现成果查漏的例子
2019/11/24 Python
Django项目使用ckeditor详解(不使用admin)
2019/12/17 Python
用 python 进行微信好友信息分析
2020/11/28 Python
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
2013/01/31 HTML / CSS
环境工程毕业生自荐信
2013/11/17 职场文书
小学教研工作制度
2014/01/15 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
大学自我评价
2014/02/12 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
领导班子四风对照检查材料范文
2014/09/27 职场文书
小学大队长竞选稿
2015/11/20 职场文书
应届生们该怎么书写求职信?
2019/07/05 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
python中tkinter复选框使用操作
2021/11/11 Python