python爬虫--下载酷我音乐
本次练习的主要内容:
通过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爬虫--下载酷我音乐相关推荐
- Python爬虫——下载音乐
Python爬虫--下载音乐 1.调用需要库 安装库: Windows + R 输入cmd 后 执行下面这两行 pip install requests -i https://pypi.tuna.ts ...
- 【课程设计】基于Taro+React+Springboot+TaroUI+Python爬虫的网络音乐播放小程序详细设计实现
[课程设计]基于Taro+React+Springboot+TaroUI+Python爬虫的网络音乐播放小程序详细设计实现 解决触摸穿透 自定义导航栏 文章目录 项目简介 功能截图 1.用户登录注册 ...
- python 爬虫下载网易歌单歌曲
python 爬虫下载网易歌单歌曲 可以根据歌单 id 来下载歌单中的所有音乐,付费音乐除外 可以自己输入歌单 id 来进行单个歌单下载,也可以结合上一篇文章 爬取网易云音乐所有歌单信息 先取到所有的 ...
- 利用Python爬虫下载王者荣耀教学视频
前言: 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. 那么针对这三类人,我给 ...
- python爬虫 下载视频网站视频
python爬虫 下载视频网站视频 xpath解析页面源码 requests.Session() 解决 status_code 302 网页重定向 selenium 获取网页遇到 iframe 标签解 ...
- python爬虫下载王者荣耀图片
python爬虫下载王者荣耀图片 腾讯课堂白嫖的一堂课,大佬勿喷. import requests import jsondata = requests.get('http://pvp.qq.com/ ...
- Python爬虫下载王者荣耀全皮肤
python爬虫下载王者荣耀全皮肤 import requests import os from time import timestart = time() headers = {'User-Age ...
- Python爬虫——下载PPT模板
Python爬虫--下载PPT模板 1.调用需要库 安装库: Windows + R 输入cmd 后 执行下面这两行 pip install requests pip install lxml imp ...
- python爬虫下载影视网站的电影
python爬虫下载影视网站的电影 我这边选取了vip网站 F12打开调试抓包模式 搜索影片的名称, 观察看看给那个url地址发送了请求, 我看到了 这个请求需要携带发送数据 而这个数据就是我们要的影 ...
- Python爬虫-网易云音乐自动化爬取下载
文章目录 前言 爬取分析 完整代码 爬取效果 拓展代码 前言 上一篇简述了如何使用 Python 爬虫自动爬取CSDN博客排行榜数据并自动整理成Excel文件,这篇文章来看看如何自动化爬取网易云音乐的 ...
最新文章
- js 获取浏览器url参数
- SSL/TLS协议运行机制
- kohana3 数据库模块配置
- 【Pytorch】model.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别
- 推理集 —— 物品与动物
- java 反射覆盖方法,java – 确定一个方法是否覆盖使用反射的另一个?
- 1087 1 10 100 1000
- flume与log4j的整合
- c语言和远光灯标志,常见的灯光语言有哪些 新手必须知道的车灯语言
- SSH免密码登录,搭建Flink standalone集群
- Java| 编译和反编译
- 从Spring为什么要用IoC的支点,我撬动了整个Spring的源码脉络!
- maven 打jar包:mvn clean package
- 18个Windows应该有却没有具有的苦守(2)
- Android自定义锁屏实现----仿正点闹钟滑屏解锁
- 转 为什么数码相机可以拍出彩色照片?
- 【React Native】使用react-native-wechat 进行微信好友、微信朋友圈进行分享
- 常用的行列式和矩阵的性质
- R语言中类别为‘closure‘的对象不可以取子集(Error:object of type ‘closure‘ is not subsettable)
- Java练习题:字节缓冲流性能分析、 文档顺序恢复
热门文章
- pdffactory 打印字体_pdfFactory Pro
- vpa函数python_Biopython序列比对
- xmind 拖拽_GitHub - xdsnet/jsxMind: 基于jsmind 改写的jsxmind插件
- linux下hex文件到bin文件的格式转化,bin文件转换为hex文件操作步骤解析
- php 自定义 bin2hex,php bin2
- TCP粘包现象分析及处理方式
- python中取绝对值简单方法总结
- mysql sql多个like性能_一个sql很多个not like的简化语句
- 《未来世界的幸存者》读书摘录及笔记
- 【ESP32 Arduino平衡小车制作】(一)霍尔编码器解码