目录
Python实例题
题目
Python自动获取酷狗音乐工具
实现思路
- 搜索音乐:使用酷狗的搜索接口,输入关键词获取音乐列表。
- 解析音乐信息:从搜索结果中提取音乐的 ID、标题、歌手等信息。
- 获取音乐播放地址:根据音乐 ID 获取音乐的真实播放地址。
- 下载音乐:使用
requests
库下载音乐文件。
代码实现
import requests
import json
import os
# 搜索音乐的 API
search_api = 'https://songsearch.kugou.com/song_search_v2'
# 获取音乐播放地址的 API
play_url_api = 'https://wwwapi.kugou.com/yy/index.php'
def search_music(keyword):
"""
根据关键词搜索音乐
:param keyword: 搜索关键词
:return: 音乐列表,每个元素为包含音乐信息的字典
"""
params = {
'keyword': keyword,
'page': 1,
'pagesize': 10,
'userid': -1,
'clientver': '',
'platform': 'WebFilter',
'tag': 'em',
'filter': 2,
'iscorrection': 1,
'privilege_filter': 0
}
response = requests.get(search_api, params=params)
if response.status_code == 200:
data = response.json()
song_list = data.get('data', {}).get('lists', [])
return song_list
return []
def get_music_play_url(hash_val, album_id):
"""
根据音乐的 hash 值和专辑 ID 获取音乐播放地址
:param hash_val: 音乐的 hash 值
:param album_id: 音乐的专辑 ID
:return: 音乐的播放地址
"""
params = {
'r': 'play/getdata',
'hash': hash_val,
'dfid': '-',
'appid': 1014,
'mid': '1621266971179807',
'platid': 4,
'album_id': album_id
}
response = requests.get(play_url_api, params=params)
if response.status_code == 200:
data = response.json()
play_url = data.get('data', {}).get('play_url')
return play_url
return ''
def download_music(play_url, title, singer):
"""
下载音乐文件
:param play_url: 音乐的播放地址
:param title: 音乐标题
:param singer: 歌手
"""
if not play_url:
print(f"无法获取 {title} - {singer} 的播放地址,下载失败。")
return
if not os.path.exists('music'):
os.makedirs('music')
file_name = os.path.join('music', f'{singer} - {title}.mp3')
try:
response = requests.get(play_url, stream=True)
with open(file_name, 'wb') as f:
for chunk in response.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
print(f"{title} - {singer} 下载完成。")
except Exception as e:
print(f"{title} - {singer} 下载失败:{e}")
if __name__ == "__main__":
keyword = input("请输入要搜索的音乐关键词:")
song_list = search_music(keyword)
if song_list:
for song in song_list:
title = song.get('SongName')
singer = song.get('SingerName')
hash_val = song.get('FileHash')
album_id = song.get('AlbumID')
play_url = get_music_play_url(hash_val, album_id)
download_music(play_url, title, singer)
else:
print("未找到相关音乐。")
代码解释
-
search_music
函数:- 向酷狗的搜索 API 发送请求,传递搜索关键词和其他必要参数。
- 解析响应的 JSON 数据,提取音乐列表。
- 返回音乐列表,每个元素为包含音乐信息的字典。
-
get_music_play_url
函数:- 根据音乐的 hash 值和专辑 ID 向获取播放地址的 API 发送请求。
- 解析响应的 JSON 数据,提取音乐的播放地址。
- 返回音乐的播放地址。
-
download_music
函数:- 创建
music
文件夹用于存储下载的音乐文件。 - 根据播放地址下载音乐文件,使用
stream=True
以流式方式下载,避免占用过多内存。 - 打印下载结果信息。
- 创建
-
主程序:
- 获取用户输入的搜索关键词。
- 调用
search_music
函数搜索音乐。 - 遍历搜索结果,调用
get_music_play_url
函数获取音乐播放地址,再调用download_music
函数下载音乐。
运行思路
- 安装依赖库:确保已经安装了
requests
库,可以使用pip install requests
进行安装。 - 运行脚本:在终端中运行
python kugou_music_downloader.py
,按照提示输入要搜索的音乐关键词。 - 下载音乐:脚本会自动搜索音乐、获取播放地址并下载音乐文件到
music
文件夹中。
注意事项
- 反爬机制:酷狗有反爬机制,频繁请求可能会导致 IP 被封禁。可以考虑使用代理 IP 或控制请求频率。
- 版权问题:下载受版权保护的音乐可能会侵犯版权,仅用于学习和测试,不要用于商业用途。