IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【爬虫实战】Python requests 爬取酷我音乐信息并下载 -> 正文阅读

[Python知识库]【爬虫实战】Python requests 爬取酷我音乐信息并下载

GET 请求

get 便是使用HTTP协议中的GET请求方式对目标网站发起请求。通常用于获取网页源代码、获取网络资源等。

准备

安装 requests
打开命令行窗口,输入以下语句:

pip install requests

然后,进入 python 编辑器,导入requests 库。

import requests

网页分析

打开酷我音乐主页,右键单击,选择“审查元素”,点击选项卡中的“网络”,然后再输入框中输入“梦寐之地”。

在这里插入图片描述

然后,网页中会出现我们想要的歌曲。

选择网络活动中的 searchMusicBykeyWord…… 项,点击“预览”,发现我们要的歌曲信息都在这里。

在这里插入图片描述
然后,我们点击“标头”,查看获取这些信息的方式。
在这里插入图片描述
我们可以看到,获取这些信息用到的是 get 请求。

干货

GET请求格式:

requests.get(<网址url>, params=<传递信息>, headers=<请求头>)

请求 url 我们已经找到了,只取问号之前的,因为问号之后的是请求参数。

url = 'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord'

我们继续往下寻找,找到请求头 headers。
在这里插入图片描述
我们将请求头复制下来。其中以下几项是必须的,缺少则会报错。

headers =  {
    'Referer': 'http://www.kuwo.cn/search/list?key=',
    'Cookie': '_ga=GA1.2.12335...',
    'csrf': 'YO4OH2VYH1A'
}

然后是查询参数 params。
在这里插入图片描述
我们将请求 params 复制下来就可以了。

params = {
	'key': '梦寐之地',	# 查找关键字
	'pn': '1',  # 页数
	'rn': '20', # 项数
	'httpsStatus': '1',
	'reqId': '6e028fc0-db8f-11eb-b6f5-ff7d54a57f2b'
}

我们发现,key 键值就是我们要搜索的字符串关键词。我们可以用 input() 函数获取搜索关键词。

keyword = input('请输入查找的歌曲:')

更新字典。

params['key'] = keyword

然后,我们就可以发出 get 请求了。

获取搜索结果列表

response = requests.get(url, params=params, headers=headers)

查看请求结果。

print(response.status_code)	# 查看请求状态码,如果为 200 即为请求成功
print(response.json())		# 解析为 json 格式

返回:
在这里插入图片描述
然后,我们从中获取我们需要的信息。

datas = response.json().get('data', {}).get('list', {})

result = [[r['name'],	# 歌曲名字
           r['artist'],	# 歌手
           r['album'],	# 歌单
           r['songTimeMinutes'],	# 时长
           r['rid']]	# 歌曲 id,后面会用到
          for r in datas]

打出我们需要的信息看看。

print(result)

在这里插入图片描述
是我们所需要的信息。

接着我们把这些信息整理出来。

for i, [name, artist, album, length, rid] in enumerate(result):
	print(f'{i} {name}   {artist}{album}】')

在这里插入图片描述

下载歌曲

我们用 input() 函数让用户选择下载的歌曲序号。然后根据歌曲序号获取选择的歌曲信息。

indexes = input('请选择下载的序号,用逗号分隔\n').split(',')	# 分隔逗号
indexes = list(map(int, indexes))	# 把每项转换为整数

selections = [result[s] for s in indexes]

print('\n你选择了:', indexes)
print('歌曲信息:')

for data in selections:
    print(data)

在这里插入图片描述
返回的每一项歌曲信息的第 4 项是歌曲的 rid

获取到歌曲的 rid 后,我们回到网页,随便点击一首歌的“播放”键。

然后,点击网络活动中的 url?format=...json 文件,我们发现里面存储着播放的音乐的地址。

因此,我们只需要获得这个文件内容,就可以获取歌曲的地址了。
在这里插入图片描述
点击标头,查看 url 的获取方式。
在这里插入图片描述
这里,我们获得了请求的 url 和请求方式为 GET

url2 = 'http://www.kuwo.cn/url'

然后,我们往下查找请求参数。这个文件的获取并不需要请求标头。
在这里插入图片描述
其中,只有以下几项是必须的。

from_params = {
    'rid': '148526468', # 歌曲 rid
    'type': 'convert_url3',
    'br': '128kmp3',
}

我们发现,其中的 rid 项便是歌曲的 rid。这样,我们之前获取的歌曲 rid 就派上用场了。

遍历歌曲 rid,发出请求。

for name, artist, album, length, rid in selections:
    # 更新字典 rid
    params2['rid'] = rid
    
    # 发出请求
	music_response = requests.get(url2, params=params2)

查看响应状态码和响应内容。

	print(music_response.status_code)
	print(music_response.json())

返回:
在这里插入图片描述
获取成功。

从中提取我们需要的歌曲 url。

	music_url = music_response.json().get('url')

回到网页,点击网络活动中的 mp3 文件,点击标头,查看获取歌曲的方式。
在这里插入图片描述
请求方法:GET。

	music = requests.get(music_url)
	content = music.content	# 返回歌曲原文件,也就是二进制的mp3文件

然后,我们将它们保存起来。

    with open(f'{name} - {artist}.mp3', 'wb') as f:
    	f.write(content)	# 写入二进制文件

最后,我们打印一条完成信息:

print('下载成功!')

我们的酷我音乐下载器就完成了!

成果展示

在这里插入图片描述
下载的 mp3在这里插入图片描述

完整源码

import requests

# 获取搜索结果列表的请求 url
url = 'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord'

# 获取搜索结果列表的请求头
headers =  {
    'Referer': 'http://www.kuwo.cn/search/list?key=',
    'Cookie': '_ga=GA1.2.1165960666.1627019800; _gid=GA1.2.1256970099.1628133876; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1628133876,1628159290,1628161538,1628230455; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1628230455; _gat=1; kw_token=7UGGSOGBUX3',
    'csrf': '7UGGSOGBUX3'
}

# 获取搜索结果列表的请求参数
params = {
	'key': '梦寐之地',   # 搜索关键字
	'pn': '1',  # 页数
	'rn': '20', # 项数
	'httpsStatus': '1',
	'reqId': '6e028fc0-db8f-11eb-b6f5-ff7d54a57f2b'
}

# 获取储存了歌曲地址的 json 文件地址
url2 = 'http://www.kuwo.cn/url'

# 获取储存了歌曲地址的 json 文件的请求参数
params2 = {
    'format': 'mp3',
    'rid': '148526468', # 歌曲 rid
    'response': 'url',
    'type': 'convert_url3',
    'br': '128kmp3',
    'from': 'web',
    't': '1628233495875',
    'httpsStatus': '1',
    'reqId': '9ad9c0d0-f684-11eb-b8a6-f5e6223c897d'
}

# 输入搜索关键词
keyword = input('请输入查找的歌曲:')
params['key'] = keyword

# 获取搜索结果列表 json 文件
response = requests.get(url, params=params, headers=headers)

# 整理分析
datas = response.json().get('data', {}).get('list', {})

result = [[r.get('name', ''),	# 歌曲名字
           r.get('artist', ''),	# 歌手
           r.get('album', ''),	# 歌单
           r.get('songTimeMinutes', ''),	# 时长
           r.get('rid', '')]	# 歌曲 id,后面会用到
          for r in datas]

for i, [name, artist, album, length, rid] in enumerate(result):
	print(f'{i} {name}   {artist}{album}】')

# 选择要下载的歌曲序号
indexes = input('\n请选择下载的序号,用逗号分隔\n').split(',')
indexes = list(map(int, indexes))

selections = [result[s] for s in indexes]

print('\n你选择了:', indexes)
print('歌曲信息:')

for data in selections:
    print(data)

# 下载歌曲
for name, artist, album, length, rid in selections:
    # 更新字典 rid
    params2['rid'] = rid
    
    # 发出请求
    music_response = requests.get(url2, params=params2)

    music_url = music_response.json().get('url')

    music = requests.get(music_url)
    content = music.content # 返回歌曲原文件,也就是二进制的mp3文件

    with open(f'{name} - {artist}.mp3', 'wb') as f:
        f.write(content)    # 写入二进制文件

print('\n下载成功!')

代码在 3.8.10 下调试通过。

— End —

感谢阅读!
原创不易,点个赞,支持一下作者吧!

本文收录于专栏 Python 爬虫
关注作者,互助交流,学习更多 Python 知识!
https://blog.csdn.net/weixin_48448842

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-08 11:17:17  更:2021-08-08 11:17:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 11:50:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码