当前位置: 首页 > news >正文

Python批量下载音乐功能

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 requestsclass 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音乐:tencentself.text_file = text   # 文件地址self.So_Name = ''   # 搜索时候的歌名self.Music_Id = ''    # 音乐idself.Music_Name = ''    # 搜索后,搜到的歌名self.artist = ''  # 歌手self.url_id = ''   # 音频idself.lyric_id = ''  # 歌词iddef main(self):"""入口函数"""# 第一步,读取音乐文件,拿到歌名result = Awking_Music.read_unique_nonempty_lines(self)print(len(result))# 第二步,循环歌名, 搜素音乐for So_Name in result:self.So_Name = So_Nametry:# 调用搜索音乐接口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中提取JSONjson_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 音乐网址

http://www.lryc.cn/news/412932.html

相关文章:

  • 用 Bytebase 实现批量、多环境、多租户数据库的丝滑变更
  • java之方法引用 —— ::
  • 「测试线排查的一些经验-上篇」 后端工程师
  • AOSP12_BatteryStats统计电池数据信息
  • 【Android Studio】UI 布局
  • 虚拟机Windows server忘记密码解决方法
  • 【香橙派系列教程】(六)嵌入式SQLite数据库
  • 深入探讨PHP8的新特性与性能优化
  • 2024年06月 Scratch 图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 书生大模型全链路开源体系
  • 极简聊天室-websocket版(双向通信)
  • 从小白到架构师 | 缓存预热
  • Modbus -- TCP协议
  • python四舍五入取整数
  • 洛谷 P1868 饥饿的奶牛
  • Arco Design 之Table表格
  • Python机器学习 模型
  • 基于 STM32 的 NAS私有云盘搭建:集成LwIP 协议、HTTP/HTTPS、WEB前端技术栈(代码示例)
  • 蓝屏?死机?爆CPU?多开卡顿?你有关心过你的硬盘吗?
  • Flutter开发报错error: unable to unlink old ‘pubspec.yaml‘: Invalid argument
  • 零基础进程最详解:进程状态、僵尸进程、孤儿进程、阻塞态、挂起态、进程切换、进程常用命令、进程创建、队列优先级
  • Redis的分布式锁
  • C++笔记---类和对象
  • 全国区块链职业技能大赛样题第9套后端源码
  • 3个功能强大的PDF转换工具,免费试用
  • 表单修改数字输入框保留小数点
  • [VS Code扩展]写一个代码片段管理插件(一):介绍与界面搭建
  • vxe grid slots 用法
  • 【网络】基于UDP协议的聊天室(第二篇)
  • 【SpringBoot3】场景整合(实战)