Python爬虫 | 爬取json数据 实现酷我音乐下载
文章目录
- 网页分析
- 明确思路
- 手动操作
- 代码实现
- 1. 导入需要的包
- 2. 建立主函数
- 3. 获取用户输入的歌曲网址
- 4. 获取歌名、歌手
- 5. 获取音频url
- 6. 下载音频
- 7. 主函数润色
- 8. 最终代码
网页分析
明确思路
首先我们明确写爬虫的思路,我们想要用程序实现下载酷我音乐的功能,就必须先手动操作一遍,看看我们自己能不能在网站的后台数据包中找到音频文件的链接,然后回溯整个寻找的过程,想办法用代码来实现它
同时,如果我们想爬取很多歌曲,思路也应该是以一首歌曲为例,如果能够根据这首歌曲的url爬取到音频,那么爬取很多歌曲也只是找每个歌曲的url而已。
手动操作
明确了思路,我们废话不多说,就以最近比较火的“热爱105度的你”这首歌为例
首先要通过后台数据包找到其音频的url
右键检查,刷新页面开始抓包,通常这些音频url都藏在json格式的数据包中,因此我们需要重点关注json格式的数据包
在network菜单下找到XHR分类,该分类下大部分都是json格式的数据,我们要找的音频url很可能就藏在这里面
一个一个的寻找,重点关注url,特别要关注url的后缀是不是.mp3等音频文件的后缀
我们在其中一个json数据包中找到包含mp3后缀的url,打开看一下是不是该歌曲的音频文件
在网址栏输入url,打开后发现它确实是该歌曲的音频
我们可以通过代码发出get请求将该页面字节流写入音频文件,从而实现音乐的下载。
OK,那么现在问题的关键就在于——如何根据歌曲的网址所包含的信息来找到这个数据包的url,从而发送请求得到json数据,并在其中找到音频的url
我们先回到这个json数据包的headers,可以看到这个数据包的url
很明显这个url包含很多parameters,这很有可能是一个线索
我们直接划到最底下看所有的parameters
这些parameters中,一些是共性化的,另一些是个性化的(即与该歌曲的id有关的)
一般来说,这些网站都会给每个歌曲一个id用于区分,这个id通常都包含在歌曲的网址中
观察歌曲的网址可以发现,每一首歌曲都有一个特定的id号,比如这首歌是71988945
我们再回到这些parameters中观察,可以看出rid就是这首歌曲的id
因此我们就可以通过歌曲的网址找到其id号,再传入id号参数发出请求得到json数据包,从json数据包中可以得到音频的url,最后访问音频url爬取音频文件
分析完毕,我们直接上代码!!
代码实现
1. 导入需要的包
import requests
from bs4 import BeautifulSoup
import json
2. 建立主函数
def main():song_url, rid = inputUrl()file_name = getFileName(song_url)mp3_url = getMp3Url(rid)downloadMusic(file_name, mp3_url)
3. 获取用户输入的歌曲网址
def inputUrl():song_url = input('请输入歌曲地址:') # 比如http://www.kuwo.cn/play_detail/71988945start = song_url.find('play_detail/') + len('play_detail/')rid = song_url[start:]return song_url, rid
4. 获取歌名、歌手
def getFileName(song_url):headers = {'Cookie':'_ga=GA1.2.2108030690.1627639450; _gid=GA1.2.1568217760.1627639450; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1627639450; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1627640133; kw_token=800OY0MAXO5','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}html = requests.get(url=song_url, headers=headers)soup = BeautifulSoup(html.text, 'html.parser')song_name = soup.select('.song_name.flex_c .name')[0].text.strip()singer_name = soup.select('.artist_name.flex_c .name')[0].text.strip()file_name = f'{song_name} - {singer_name}.mp3'return file_name
5. 获取音频url
def getMp3Url(rid):url = 'http://www.kuwo.cn/url'params = {'format':'mp3','rid':f'{rid}','response':'url','type':'convert_url3','br':'128kmp3','from':'web','t':'1627639481401','httpsStatus':'1','reqId':'8e9e59a1-f11d-11eb-be6e-cf60d243bdd8'}headers = {'Cookie':'_ga=GA1.2.2108030690.1627639450; _gid=GA1.2.1568217760.1627639450; _gat=1; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1627639450; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1627639460; kw_token=XXWW3V5QGC','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}html = requests.get(url=url, params=params, headers=headers)dic = json.loads(html.text)mp3_url = dic['url']return mp3_url
6. 下载音频
def downloadMusic(file_name, mp3_url):mp3_data = requests.get(url=mp3_url).contentwith open(file_name, 'wb') as f:f.write(mp3_data)
7. 主函数润色
def main():try:song_url, rid = inputUrl()except:print('rid获取失败(可能原因:歌曲地址错误)')returntry:file_name = getFileName(song_url)except:print('页面解析失败')returntry:mp3_url = getMp3Url(rid)except:print('json数据获取失败')returntry:downloadMusic(file_name, mp3_url)except:print('音乐下载失败')return
8. 最终代码
import requests
from bs4 import BeautifulSoup
import jsondef inputUrl():song_url = input('请输入歌曲地址:') # 比如http://www.kuwo.cn/play_detail/71988945start = song_url.find('play_detail/') + len('play_detail/')rid = song_url[start:]return song_url, riddef getMp3Url(rid):url = 'http://www.kuwo.cn/url'params = {'format':'mp3','rid':f'{rid}','response':'url','type':'convert_url3','br':'128kmp3','from':'web','t':'1627639481401','httpsStatus':'1','reqId':'8e9e59a1-f11d-11eb-be6e-cf60d243bdd8'}headers = {'Cookie':'_ga=GA1.2.2108030690.1627639450; _gid=GA1.2.1568217760.1627639450; _gat=1; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1627639450; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1627639460; kw_token=XXWW3V5QGC','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}html = requests.get(url=url, params=params, headers=headers)dic = json.loads(html.text)mp3_url = dic['url']return mp3_urldef getFileName(song_url):headers = {'Cookie':'_ga=GA1.2.2108030690.1627639450; _gid=GA1.2.1568217760.1627639450; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1627639450; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1627640133; kw_token=800OY0MAXO5','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}html = requests.get(url=song_url, headers=headers)soup = BeautifulSoup(html.text, 'html.parser')song_name = soup.select('.song_name.flex_c .name')[0].text.strip()singer_name = soup.select('.artist_name.flex_c .name')[0].text.strip()file_name = f'{song_name} - {singer_name}.mp3'return file_namedef downloadMusic(file_name, mp3_url):mp3_data = requests.get(url=mp3_url).contentwith open(file_name, 'wb') as f:f.write(mp3_data)def main():try:song_url, rid = inputUrl()except:print('rid获取失败(可能原因:歌曲地址错误)')returntry:file_name = getFileName(song_url)except:print('页面解析失败')returntry:mp3_url = getMp3Url(rid)except:print('json数据获取失败')returntry:downloadMusic(file_name, mp3_url)except:print('音乐下载失败')returnif __name__ == '__main__':main()
Python爬虫 | 爬取json数据 实现酷我音乐下载相关推荐
- Python爬虫爬取疫情数据并可视化展示
这篇文章主要介绍了Python利用爬虫爬取疫情数据并进行可视化的展示,文中的示例代码讲解清晰,对工作或学习有一定的价值,需要的朋友可以参考一下.编程资料点击领取 目录 知识点 开发环境 爬虫完整代码 ...
- python 爬虫爬取疫情数据,爬虫思路和技术你全都有哈(一)
python 爬虫爬取疫情数据,爬虫思路和技术你全都有哈(二.数据清洗及存储) 爬起疫情数据,有两个网址: 1.百度:链接 2.丁香园疫情:链接 在这两个中,丁香园的爬虫相对简单一点,所以今天就展示一 ...
- Python爬虫爬取网页数据并存储(一)
Python爬虫爬取网页数据并存储(一) 环境搭建 爬虫基本原理 urllib库使用 requests库使用 正则表达式 一个示例 环境搭建 1.需要事先安装anaconda(或Python3.7)和 ...
- python 爬虫爬取疫情数据,爬虫思路和技术你全都有哈(二)
上一章: python 爬虫爬取疫情数据,爬虫思路和技术你全都有哈(一.爬虫思路及代码) 第三步:数据清洗 清洗数据很简单,就是数据太乱的话,就得花些时间,所以一定要有一个好的方法,才能避免在清洗数据 ...
- python爬虫数据分析可以做什么-python爬虫爬取的数据可以做什么
在Python中连接到多播服务器问题,怎么解决你把redirect关闭就可以了.在send时,加上参数allow_redirects=False 通常每个浏览器都会设置redirect的次数.如果re ...
- java爬虫抓取nba_利用Python爬虫爬取NBA数据功能实例分享
Python实现爬虫爬取NBA数据功能示例 本文实例讲述了Python实现爬虫爬取NBA数据功能.分享给大家供大家参考,具体如下: 爬取的网站为:stat-nba.com,这里爬取的是NBA2016- ...
- python爬网站数据实例-利用Python爬虫爬取NBA数据功能实例分享
Python实现爬虫爬取NBA数据功能示例 本文实例讲述了Python实现爬虫爬取NBA数据功能.分享给大家供大家参考,具体如下: 爬取的网站为:stat-nba.com,这里爬取的是NBA2016- ...
- python爬虫爬取的数据与浏览器获取的数据不一样 爬虫爬取到的数据一直不变
具体问题 在爬取某个网站时遇到了一个奇怪的问题,就是只要是python爬取的数据得到的基本就是那么几种数据,无论我输入的是什么,返回的数据与浏览器得到返回的数据都不一样,这让我很郁闷,百度也找不到想要 ...
- python如何爬虫网页数据-python爬虫——爬取网页数据和解析数据
1.网络爬虫的基本概念 网络爬虫(又称网络蜘蛛,机器人),就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序. 只要浏览器能够做的事情,原则上,爬虫都能够做到. ...
最新文章
- 深入理解计算机系统(3.2)---数据格式、访问信息以及操作数指示符
- 推荐一款文件搜索神器Everything!
- VTK:迭代最近点变换用法实战
- MFC自动注册ODBC数据源
- YARN体系学习笔记
- 做虚拟化服务器的配资一致嘛,服务器虚拟化技术在校园网管理中的应用探讨.pdf...
- java编码规范文档 下载_软件项目实训及课程设计指导——制定待开发项目中各种文档的规范...
- Canvas 数学、物理、动画学习笔记一
- 配置机器学习训练环境太麻烦?开源工具Parris说一键就搞定
- 【Quartz】解密properties配置文件中的账号密码
- NYOJ 61:传纸条(一)(三维DP)
- 阶段3 2.Spring_10.Spring中事务控制_2 作业-基于注解的AOP实现事务控制及问题分析_上...
- 文件上传到部署服务器(添加附件)
- SHELL中使用sed替换文本
- 视频教程-MATLAB图像处理-Matlab
- 利用VMware安装PhoenixOS(win10下)
- MySQL面试题常见知识点总结
- 用excel打开txt文件
- 山东金税盘如何跨月作废增值税普通发票
- 蓝桥杯练习系统特殊回文数(python)
热门文章
- LTF散热框架软件实现_结合MTK6797平台
- matlab怎么仿真有程序代码,一个较完全的Matlab通信系统仿真程序 - 源码下载|源代码 - 源码中国...
- 计算机应用基础学是高级的书,清华大学出版社-图书详情-《计算机应用基础初级教程》...
- Apowersoft LightPDF v1.5.3.2 轻闪PDF编辑器
- 提权学习:第三方软件提权(巴西烤肉提权和启动项提权)
- Python批量下载上交所、深交所年报或半年报并生成年报下载器exe文件
- NHK Easy News 翻译 12月23日-3
- 打造自己的Javascript工具类库
- linux 使用scp命令从一台机器复制文件到另一台linux机器上去
- FIT输入法创始人 @杰克华君 离开我们