文章目录

  • 网页分析
    • 明确思路
    • 手动操作
  • 代码实现
    • 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数据 实现酷我音乐下载相关推荐

  1. Python爬虫爬取疫情数据并可视化展示

    这篇文章主要介绍了Python利用爬虫爬取疫情数据并进行可视化的展示,文中的示例代码讲解清晰,对工作或学习有一定的价值,需要的朋友可以参考一下.编程资料点击领取 目录 知识点 开发环境 爬虫完整代码 ...

  2. python 爬虫爬取疫情数据,爬虫思路和技术你全都有哈(一)

    python 爬虫爬取疫情数据,爬虫思路和技术你全都有哈(二.数据清洗及存储) 爬起疫情数据,有两个网址: 1.百度:链接 2.丁香园疫情:链接 在这两个中,丁香园的爬虫相对简单一点,所以今天就展示一 ...

  3. Python爬虫爬取网页数据并存储(一)

    Python爬虫爬取网页数据并存储(一) 环境搭建 爬虫基本原理 urllib库使用 requests库使用 正则表达式 一个示例 环境搭建 1.需要事先安装anaconda(或Python3.7)和 ...

  4. python 爬虫爬取疫情数据,爬虫思路和技术你全都有哈(二)

    上一章: python 爬虫爬取疫情数据,爬虫思路和技术你全都有哈(一.爬虫思路及代码) 第三步:数据清洗 清洗数据很简单,就是数据太乱的话,就得花些时间,所以一定要有一个好的方法,才能避免在清洗数据 ...

  5. python爬虫数据分析可以做什么-python爬虫爬取的数据可以做什么

    在Python中连接到多播服务器问题,怎么解决你把redirect关闭就可以了.在send时,加上参数allow_redirects=False 通常每个浏览器都会设置redirect的次数.如果re ...

  6. java爬虫抓取nba_利用Python爬虫爬取NBA数据功能实例分享

    Python实现爬虫爬取NBA数据功能示例 本文实例讲述了Python实现爬虫爬取NBA数据功能.分享给大家供大家参考,具体如下: 爬取的网站为:stat-nba.com,这里爬取的是NBA2016- ...

  7. python爬网站数据实例-利用Python爬虫爬取NBA数据功能实例分享

    Python实现爬虫爬取NBA数据功能示例 本文实例讲述了Python实现爬虫爬取NBA数据功能.分享给大家供大家参考,具体如下: 爬取的网站为:stat-nba.com,这里爬取的是NBA2016- ...

  8. python爬虫爬取的数据与浏览器获取的数据不一样 爬虫爬取到的数据一直不变

    具体问题 在爬取某个网站时遇到了一个奇怪的问题,就是只要是python爬取的数据得到的基本就是那么几种数据,无论我输入的是什么,返回的数据与浏览器得到返回的数据都不一样,这让我很郁闷,百度也找不到想要 ...

  9. python如何爬虫网页数据-python爬虫——爬取网页数据和解析数据

    1.网络爬虫的基本概念 网络爬虫(又称网络蜘蛛,机器人),就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序. 只要浏览器能够做的事情,原则上,爬虫都能够做到. ...

最新文章

  1. 深入理解计算机系统(3.2)---数据格式、访问信息以及操作数指示符
  2. 推荐一款文件搜索神器Everything!
  3. VTK:迭代最近点变换用法实战
  4. MFC自动注册ODBC数据源
  5. YARN体系学习笔记
  6. 做虚拟化服务器的配资一致嘛,服务器虚拟化技术在校园网管理中的应用探讨.pdf...
  7. java编码规范文档 下载_软件项目实训及课程设计指导——制定待开发项目中各种文档的规范...
  8. Canvas 数学、物理、动画学习笔记一
  9. 配置机器学习训练环境太麻烦?开源工具Parris说一键就搞定
  10. 【Quartz】解密properties配置文件中的账号密码
  11. NYOJ 61:传纸条(一)(三维DP)
  12. 阶段3 2.Spring_10.Spring中事务控制_2 作业-基于注解的AOP实现事务控制及问题分析_上...
  13. 文件上传到部署服务器(添加附件)
  14. SHELL中使用sed替换文本
  15. 视频教程-MATLAB图像处理-Matlab
  16. 利用VMware安装PhoenixOS(win10下)
  17. MySQL面试题常见知识点总结
  18. 用excel打开txt文件
  19. 山东金税盘如何跨月作废增值税普通发票
  20. 蓝桥杯练习系统特殊回文数(python)

热门文章

  1. LTF散热框架软件实现_结合MTK6797平台
  2. matlab怎么仿真有程序代码,一个较完全的Matlab通信系统仿真程序 - 源码下载|源代码 - 源码中国...
  3. 计算机应用基础学是高级的书,清华大学出版社-图书详情-《计算机应用基础初级教程》...
  4. Apowersoft LightPDF v1.5.3.2 轻闪PDF编辑器
  5. 提权学习:第三方软件提权(巴西烤肉提权和启动项提权)
  6. Python批量下载上交所、深交所年报或半年报并生成年报下载器exe文件
  7. NHK Easy News 翻译 12月23日-3
  8. 打造自己的Javascript工具类库
  9. linux 使用scp命令从一台机器复制文件到另一台linux机器上去
  10. FIT输入法创始人 @杰克华君 离开我们