Python批量下载音乐功能

news2024/11/15 20:11:03

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1967293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[极客大挑战 2019]Secret File-web

打开题目 查看源码 直接访问Archive_room.php 第二个页面是个点击框,这里bp抓包确认;若是直接SECRET,会跳到end.php 直接访问secr3t.php 代码审计一下 playload:secr3t.php?fileflag.php 改为php协议读取权限 secr3t.php?f…

CAPL使用结构体的方式组装一条DoIP车辆声明消息(方法1)

如果你参加过我的《CAPL编程系统性课程》,你就结构体类型天然就能表示报文结构,用结构体表示报文虽然麻烦,但灵活度更高。 我们今天试着用结构体类型表示DoIP车辆声明消息的DoIP报头,然后组装一条DoIP消息发送出去。 DoIP消息结构如下: DoIP车辆声明消息结构如下: /**…

SPSSAU | Power功效分析之线性回归

Power功效分析常用于实验研究时样本量的计算(或功效值计算),如果是涉及线性回归相关的回归系数差异计算时,SPSSAU共提供三种情况时的Power功效分析,具体如下表格所述: 名词说明R 方值线性回归时R 方值或者…

大数据信用查询什么样的平台比较靠谱?

随着互联网的发展和普及,大数据技术逐渐应用到各行各业中,其中之一就是信用查询领域,大数据信用查询平台能够为用户提供全面、准确的大数据信用评估,然而,由于市场上出现了许多不同的大数据信用查询平台,我…

NICE Seminar(2022-1-23)基于进化优化的鲁棒区间搜索(华东理工大学堵威博士)

论文题目:Searching for Robustness Intervals in Evolutionary Robust Optimization 关于非支配解附近较高质量解搜集的工作。

DC-7靶机通关

今天咱们来学习第七个靶机!!! 1实验环境 攻击机:kali2023.2 靶机:DC-7 2.1主机发现 2.2端口扫描 依旧是开了两个端口,一个 22 一个 80 !!! 3.1查看对方网页 在这里我…

数据结构_study(六)

图 顶点的有穷非空集合和顶点之间边的集合 G(V,E),G:图,V:顶点集合,E:边的集合 顶点:图中的数据元素,有穷,非空 边:顶点之间的逻辑关系,边集合…

如何编写一个多线程、非阻塞的python代码

一、【写在前面】 最近csdn每天写两篇文章有推广券,趁这个机会写一个python相关的文章吧。 一般我们的任务都可以分为计算密集型任务和IO密集型任务。 python因为全局GIL锁的存在,任何时候只有一个python线程在运行,所以说不能利用多核CPU…

基于人工智能技术开发的一种医疗诊断工具:智慧3D导诊系统源码

概述 智能导诊基于医疗 AI 、自然语言处理技术,覆盖导诊、智能问答、科普宣教等就医服务;智能导诊通过人体图、症状列表等形式进行疾病自测,快速推荐就诊科室、医生推荐。产品可应用于微信线上挂号、互联网医院、区域平台等场景中&#xff0…

【搜索核心技术】经典搜索核心算法:BM25及其变种

随着基于检索增强的生成(Retrieval-Augmented Generation—RAG)逐渐成为当前大模型落地方案的主流选择,搜索技术在这一过程中扮演着至关重要的角色。然而,仅依赖向量相似性检索往往无法达到理想的效果。因此,为了进一步…

计算机网络之http状态码和https

目录 HTTP协议 TCP/IP协议 TCP/IP的分层管理 各个协议和HTTP之间的关系 了解并区分URI和URL 返回结果的HTTP状态码 2XX 成功 2.1 200 ok 2.2 204 No Content 2.3 206 Partial Content 3xx表示重定向 3.1 301 Moved Permanently 3.2 302 Found 3.3 303 See …

探索全光网技术 | 全光网络技术方案选型建议二 (宿舍场景)

目录 一、场景设计需求二、宿舍场景拓扑三、部署方式四、产品相关规格说明五、方案优势 注:本文章参考资料为:华三官方资料 - “新华三全光网络3.0解决方案(教育)”与 锐捷官方资料 - “【锐捷】高校极简以太全光3.X方案设计(V1.3…

pinecone向量库的介绍和基本使用(增删改查)

本文来自于【向量库】pinecone向量库的介绍和基本使用(增删改查) Pinecone是一个实时、高性能的向量数据库,专为大规模向量集的高效索引和检索而设计。它提供亚秒级的查询响应时间,确保用户可以迅速获取所需信息。Pinecone采用高…

SAP与九恒星资金系统集成案例(医药行业)

一、项目环境 江西某药业有限公司是一家以医药产业为主营、资本经营为平台的大型民营企业集团。公司成立迄今,企业经营一直呈现稳健、快速发展的态势集团总销售额超40亿元。 为了帮助企业更好的进行资金流、结算、资金调度和运作管理、风险控制,济民…

计算机毕业设计选题推荐-篮球馆会员信息管理系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

前端初期知识点回顾

1.跳转:其中target“_blank”意思是跳转会新标签页打开 2.锚点定位:点击文字跳转到对应页面 3:表单 单元格合并 4.input属性变化 前期vue样式 5.画原神: 6.画学生管理系统: 购物车升序降序 累加函数 保留两位小数点 删…

2023年亚太杯A题:果园采摘机器人的图像识别,一二题(题目代码及结果)

问题一:基于附件1中提供的可收获苹果的图像数据集,提取图像特征,建立数学模型,计算每幅图像中的苹果的数量,并绘制附件1中所有苹果的分布直方图。 对于自动采摘机器人,首要的能力就是识别出苹果对象&#…

K3 BOS单据获取制单人工号

新建BOS单据,打印时有时不想在单据上体现制单人姓名,只要打印出工号就行了 新建时,在单据头增加一个“制单人工号”的字段,字段名一定要设置成"FBillerno", 然后在插件中增加资源中的DLL 效果 套打单据中的…

爬虫:jsonpath模块及腾讯招聘数据获取

目录 jsonpath模块 腾讯招聘数据获取 jsonpath模块 # pip install jsonpath -i https://pypi.tuna.tsinghua.edu.cn/simple import jsonpathdata {"store": {"book":[{"category": "reference","author": "Nigel Ree…

电影票竞价系统:揭开神秘代码的面纱

电影票的购买方式也在不断革新。全民邀约电影票竞价系统就是这样一个创新的购票模式。今天,就让我们一起探索这个系统背后的代码秘密,看看竞价购票的代码是如何编写的。 电影票竞价系统的魅力 电影票竞价系统为广大影迷提供了一种全新的购票体验。通过该…