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 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 音乐网址

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值