本次练习的主要内容:

通过python爬虫,破解酷我音乐的api,下载音乐文件到本地。

(一)项目概况

1. 这里酷我音乐的首页:

2. 点击左上角的榜单,进去之后再点击具体歌名,跳转到音乐播放页面,可以在线听音乐:

3. 本次项目的主要目标,就是通过音乐具体的播放页面url,

即这样的链接:http://www.kuwo.cn/yinyue/42484721?catalog=yueku2016

下载该音乐到本地。

(二)网页分析

1. 在音乐播放页面打开开发者工具,查看网络请求:

在众多网络请求中,可以找到一个以.aac结尾的请求,猜测该请求就是目标音乐的请求。

2. 分析可知,该请求具体情况如下:

请求类型:get

请求url:

http://ip.h5.nf03.sycdn.kuwo.cn/ee3a8426c1def769b22e5c23639d6220/5b2b12a1/resource/a1/65/1/2669068103.aac

所以,只要模拟该get请求,就能拿到aac文件。

但是该url里面有许多陌生的字段,具体是从哪里来的呢?

3. 经查找,可以在下面的请求中的response的headers里面,找到上面的url:

4. 经分析该请求的情况如下:

请求类型:get

请求url:

http://antiserver.kuwo.cn/anti.s?format=aac|mp3&rid=MUSIC_42484721&type=convert_url&response=res

注意该请求返回的状态码是302。

仔细观察该请求的参数,发现只有“MUSIC_42484721”这个字段是动态变更的,其他都是固定的。

那么该MUSIC字段是从哪里来的呢?

仔细想想,原来就是音乐播放页面的url中包含的一个字段:http://www.kuwo.cn/yinyue/42484721?catalog=yueku2016

5. 这样就很明确了,下面梳理下思路:

- 通过音乐播放页面url,拿到类似这样的字段 “42484721”

- 通过该字段,构造第4步的get请求,拿到response的headers的location字段

- 通过location字段,发送get请求,拿到aac文件

(三)核心代码实现

1. 获取音乐播放url中特定字段

import requests
import res = requests.session()
filename = input("请输入音乐文件保存的本地路径:").strip()
base_url = input("请输入音乐播放页面url:").strip()
base_number = re.findall(r"(?:http://www.kuwo.cn/yinyue/)(\d+)(?:\?catalog=yueku2016)", base_url)[0]

2. 通过上面的字段,构造第一个get请求,获取返回头中的location字段

def get_url():headers = {'Accept': '*/*','Accept-Encoding': 'identity;q=1, *;q=0','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','Connection': 'keep-alive','Host':'antiserver.kuwo.cn','Range': 'bytes=0-','User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Referer':base_url}url = "http://antiserver.kuwo.cn/anti.s?format=aac|mp3&rid=MUSIC_"+ base_number +"&type=convert_url&response=res"r = s.get(url, headers=headers, allow_redirects=False)return r.headers['Location']

3. 通过location字段中的url,获取到aac文件数据

注意在网络分析时的截图,可以看到该请求的返回的状态码是206,这是由于该请求的请求头中添加了Range字段,代表仅请求部分内容,我这里设置为了'Range': 'bytes=0-',意思是请求从0字节之后的所有内容。

def get_aac(url):base_host = re.findall(r"(?:http://)(.*)", url)[0]base_host = base_host.split('/')[0]headers ={'Accept': '*/*','Accept-Encoding': 'identity;q=1, *;q=0','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','Connection': 'keep-alive','Host': base_host,'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36','Referer':base_url,'Range': 'bytes=0-'}r = s.get(url, headers=headers, stream=True)return r

4. 将aac文件数据写入到本地

def save_aac(filename, res):with open(filename, 'wb') as fd:for chunk in res.iter_content(chunk_size=128):fd.write(chunk)

5. 代码中的注意事项

实际写代码的过程中,发现酷我对请求头的检查非常严格,因此请求头务必根据实际情况编写准确,否则无法正确获取数据。

(四)项目结果

通过给定的音乐播放url,就可以将该音乐下载到指定的本地文件存储路径中。

(五)下一步

1. 代码中增加相应的错误检查

2. 可将本次代码作为批量爬取酷我音乐项目的一部分。

本文仅供学习交流使用,请勿将其用于违法目的。

python爬虫--下载酷我音乐相关推荐

  1. Python爬虫——下载音乐

    Python爬虫--下载音乐 1.调用需要库 安装库: Windows + R 输入cmd 后 执行下面这两行 pip install requests -i https://pypi.tuna.ts ...

  2. 【课程设计】基于Taro+React+Springboot+TaroUI+Python爬虫的网络音乐播放小程序详细设计实现

    [课程设计]基于Taro+React+Springboot+TaroUI+Python爬虫的网络音乐播放小程序详细设计实现 解决触摸穿透 自定义导航栏 文章目录 项目简介 功能截图 1.用户登录注册 ...

  3. python 爬虫下载网易歌单歌曲

    python 爬虫下载网易歌单歌曲 可以根据歌单 id 来下载歌单中的所有音乐,付费音乐除外 可以自己输入歌单 id 来进行单个歌单下载,也可以结合上一篇文章 爬取网易云音乐所有歌单信息 先取到所有的 ...

  4. 利用Python爬虫下载王者荣耀教学视频

    前言: 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. 那么针对这三类人,我给 ...

  5. python爬虫 下载视频网站视频

    python爬虫 下载视频网站视频 xpath解析页面源码 requests.Session() 解决 status_code 302 网页重定向 selenium 获取网页遇到 iframe 标签解 ...

  6. python爬虫下载王者荣耀图片

    python爬虫下载王者荣耀图片 腾讯课堂白嫖的一堂课,大佬勿喷. import requests import jsondata = requests.get('http://pvp.qq.com/ ...

  7. Python爬虫下载王者荣耀全皮肤

    python爬虫下载王者荣耀全皮肤 import requests import os from time import timestart = time() headers = {'User-Age ...

  8. Python爬虫——下载PPT模板

    Python爬虫--下载PPT模板 1.调用需要库 安装库: Windows + R 输入cmd 后 执行下面这两行 pip install requests pip install lxml imp ...

  9. python爬虫下载影视网站的电影

    python爬虫下载影视网站的电影 我这边选取了vip网站 F12打开调试抓包模式 搜索影片的名称, 观察看看给那个url地址发送了请求, 我看到了 这个请求需要携带发送数据 而这个数据就是我们要的影 ...

  10. Python爬虫-网易云音乐自动化爬取下载

    文章目录 前言 爬取分析 完整代码 爬取效果 拓展代码 前言 上一篇简述了如何使用 Python 爬虫自动爬取CSDN博客排行榜数据并自动整理成Excel文件,这篇文章来看看如何自动化爬取网易云音乐的 ...

最新文章

  1. js 获取浏览器url参数
  2. SSL/TLS协议运行机制
  3. kohana3 数据库模块配置
  4. 【Pytorch】model.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别
  5. 推理集 —— 物品与动物
  6. java 反射覆盖方法,java – 确定一个方法是否覆盖使用反射的另一个?
  7. 1087 1 10 100 1000
  8. flume与log4j的整合
  9. c语言和远光灯标志,常见的灯光语言有哪些 新手必须知道的车灯语言
  10. SSH免密码登录,搭建Flink standalone集群
  11. Java| 编译和反编译
  12. 从Spring为什么要用IoC的支点,我撬动了整个Spring的源码脉络!
  13. maven 打jar包:mvn clean package
  14. 18个Windows应该有却没有具有的苦守(2)
  15. Android自定义锁屏实现----仿正点闹钟滑屏解锁
  16. 转 为什么数码相机可以拍出彩色照片?
  17. 【React Native】使用react-native-wechat 进行微信好友、微信朋友圈进行分享
  18. 常用的行列式和矩阵的性质
  19. R语言中类别为‘closure‘的对象不可以取子集(Error:object of type ‘closure‘ is not subsettable)
  20. Java练习题:字节缓冲流性能分析、 文档顺序恢复

热门文章

  1. pdffactory 打印字体_pdfFactory Pro
  2. vpa函数python_Biopython序列比对
  3. xmind 拖拽_GitHub - xdsnet/jsxMind: 基于jsmind 改写的jsxmind插件
  4. linux下hex文件到bin文件的格式转化,bin文件转换为hex文件操作步骤解析
  5. php 自定义 bin2hex,php bin2
  6. TCP粘包现象分析及处理方式
  7. python中取绝对值简单方法总结
  8. mysql sql多个like性能_一个sql很多个not like的简化语句
  9. 《未来世界的幸存者》读书摘录及笔记
  10. 【ESP32 Arduino平衡小车制作】(一)霍尔编码器解码