Python批量下载音乐功能
Python批量下载音乐,调用API接口,同时下载歌曲和歌词
先安排一下要用的模块,导入进来。
import re
import json
import requests
目录结构
- 下载音乐
- Awking_Class.py
- music.txt
- 文件文件写的是音乐名字,使用换行分割
- new_music
- 注意这个 new_music是文件夹
- 注意new_music文件夹 没有创建是会报错的
下面是代码:
Awking_Class.py
import re
import json
import requests
class Awking_Music():
def __init__(self, text):
self.url = 'https://music.jinchuang.org/api.php?callback=jQuery1113018942027461259858_1722409511333'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
}
self.source = 'netease' # 接口方式: 网易云:netease QQ音乐:tencent
self.text_file = text # 文件地址
self.So_Name = '' # 搜索时候的歌名
self.Music_Id = '' # 音乐id
self.Music_Name = '' # 搜索后,搜到的歌名
self.artist = '' # 歌手
self.url_id = '' # 音频id
self.lyric_id = '' # 歌词id
def main(self):
"""入口函数"""
# 第一步,读取音乐文件,拿到歌名
result = Awking_Music.read_unique_nonempty_lines(self)
print(len(result))
# 第二步,循环歌名, 搜素音乐
for So_Name in result:
self.So_Name = So_Name
try:
# 调用搜索音乐接口
Awking_Music.Search_Music(self)
except:
print(So_Name, '下载失败')
# 开始下载音乐,下载歌词
try: # 尝试下载音乐
Awking_Music.Url_Music(self)
print(So_Name,'-------------下载成功------------')
except:
Awking_Music.fail_write(self)
print(So_Name, '下载失败')
try: # 尝试下载歌词
Awking_Music.Lyric_Music(self)
except:
print(So_Name, '歌词下载失败,下载失败')
def read_unique_nonempty_lines(self):
'''读取text文件,并去除重复的内容'''
with open(self.text_file, encoding='utf-8') as f:
return list(dict.fromkeys(line.strip() for line in f if line.strip()))
def Requests_POST(self, datas):
response = requests.post(url=self.url, data=datas, headers=self.headers)
try:
# 尝试直接从JSONP中提取JSON
json_str = re.search(r'\((.*)\)', response.text).group(1)
if json_str:
return json.loads(json_str)
else:
raise ValueError("无法从响应中提取 JSON")
except json.JSONDecodeError:
raise ValueError("收到的 JSON 无效")
def Search_Music(self):
'''搜索音乐,返回音乐id'''
Search_data = {
'types': 'search',
'count': 1,
'source': self.source,
'pages': '1',
'name': self.So_Name,
}
data = Awking_Music.Requests_POST(self,datas=Search_data)[0]
# print(data)
self.Music_Id = data['id']
self.Music_Name = data['name']
self.artist = " ".join(data['artist']) # 列表转字符串
self.url_id = data['url_id']
self.lyric_id = data['lyric_id']
print(self.Music_Name, '搜索成功!!!')
# print(f'音乐名称:{self.Music_Name}, {self.Music_Id}, {self.artist} {self.url_id} {self.lyric_id}')
def Lyric_Music(self):
'''下载歌词'''
data = {
'types': 'lyric',
'id': self.lyric_id,
'source': self.source,
}
res = Awking_Music.Requests_POST(self,datas=data)
# 保存歌词文件
with open(f'./new_music/{self.Music_Name + "--" + self.artist}.lrc', 'w', encoding='utf-8') as f:
f.write(res['lyric'])
def Url_Music(self):
'''下载音乐'''
data = {
'types': 'url',
'id': self.url_id,
'source': self.source,
}
Music_Url = Awking_Music.Requests_POST(self,datas=data)['url']
res = requests.get(Music_Url) # 请求音乐源地址
with open(f'./new_music/{self.Music_Name + "--" + self.artist}.mp3', 'ab') as file: # 保存到本地的文件名
file.write(res.content)
file.flush()
def fail_write(self): # 记录下载失败的音乐
# 追加写入内容到文件
with open('./fail_music.txt', "a") as file:
file.write(self.So_Name)
file.write("\n")
A = Awking_Music('music.txt')
A.main()
music.txt
青花瓷
太聪明
我们俩
运行结果:
如果下载失败的话,会出现一个 fail_music.txt文件来记录下载失败的音乐
Awking 音乐网址