如何基于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 相关文章推荐
在Python中操作时间之strptime()方法的使用
Dec 30 Python
Python数据结构之单链表详解
Sep 12 Python
python实现Decorator模式实例代码
Feb 09 Python
Python3 log10()函数简单用法
Feb 19 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
Nov 29 Python
django数据模型on_delete, db_constraint的使用详解
Dec 24 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
Mar 23 Python
python 生成任意形状的凸包图代码
Apr 16 Python
Python如何把十进制数转换成ip地址
May 25 Python
Python venv虚拟环境配置过程解析
Jul 08 Python
Python面向对象多态实现原理及代码实例
Sep 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
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
PHP如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
解析javascript 实用函数的使用详解
2013/05/10 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
JavaScript实现随机替换图片的方法
2015/04/16 Javascript
javascript实现捕捉键盘上按下的键
2015/05/05 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
[01:34]DAC2018主赛事第四日五佳镜头 Gh巨牙海民助Miracle-死里逃生
2018/04/07 DOTA
python数据清洗系列之字符串处理详解
2017/02/12 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
Python实现GIF图倒放
2020/07/16 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
英国领先的独立时装店:Van Mildert
2019/10/28 全球购物
先进个人评语大全
2015/01/04 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
导游词之南京夫子庙
2019/12/09 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
Nginx配置Https安全认证的实现
2021/05/26 Servers
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL
Oracle中update和select 关联操作
2022/01/18 Oracle
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server