python 爬取mp3音乐

news/2025/1/8 18:45:11/文章来源:https://www.cnblogs.com/dgp-zjz/p/18658073

一、酷狗音乐

1、代码

import requests
import time
# 导入解密模块
import hashlib
import re
import os
import json
# 导入制表模块
import prettytable as pt# 模拟浏览器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 ''Safari/537.36 Edg/119.0.0.0','Cookie': 'kg_mid=3a8e2eda6b55afd434ed43d762bae621; kg_dfid=4XSJ8z0tMH343y3JOZ2ZluzO; ''kg_dfid_collect=d41d8cd98f00b204e9800998ecf8427e; Hm_lvt_aedee6983d4cfc62f509129360d6bb3d=1701158152,''1701163020,1701180349,1701337969; kg_mid_temp=3a8e2eda6b55afd434ed43d762bae621; ''Hm_lpvt_aedee6983d4cfc62f509129360d6bb3d=1701337996'
}def Hash_md5(audio_id, date_time):# audio_id = '9gaecb60's = ["NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt","appid=1014",# 时间戳f"clienttime={date_time}","clientver=20000","dfid=4XSJ8z0tMH343y3JOZ2ZluzO",# 歌曲idf"encode_album_audio_id={audio_id}","mid=3a8e2eda6b55afd434ed43d762bae621","platid=4","srcappid=2919","token=","userid=0","uuid=3a8e2eda6b55afd434ed43d762bae621","NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt"]# 把列表拼接成字符串string = ''.join(s)MD5 = hashlib.md5()MD5.update(string.encode('utf-8'))signature = MD5.hexdigest()# print(signature)return signaturedef search_MD5(world, date_time):search_s = ["NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt","appid=1014","bitrate=0","callback=callback123",f"clienttime={date_time}","clientver=1000","dfid=4XSJ8z0tMH343y3JOZ2ZluzO","filter=10","inputtype=0","iscorrection=1","isfuzzy=0",f"keyword={world}","mid=3a8e2eda6b55afd434ed43d762bae621","page=1","pagesize=30","platform=WebFilter","privilege_filter=0","srcappid=2919","token=","userid=0","uuid=3a8e2eda6b55afd434ed43d762bae621","NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt"]search_string = ''.join(search_s)MD5 = hashlib.md5()MD5.update(search_string.encode('utf-8'))search_signature = MD5.hexdigest()# print(signature)return search_signature# audio_id = '9gaecb60'
# 获取当前时间的毫秒数
# 时间戳13位,所以是到毫秒的,所以我们要*1000,因为我们获取当前时间只精确到秒
date_time = int(time.time() * 1000)
# signature = Hash_md5(audio_id, date_time)# key = '周杰伦'
key = input('请输入歌名或歌手:')
# 获取加密参数
search_signature = search_MD5(key, date_time)# 搜索链接
search_url = 'https://complexsearch.kugou.com/v2/search/song?'
# search_url = 'https://www.kugou.com/yy/html/search.html#searchType=song?'
# 搜索请求参数
search_data = {'callback': 'callback123','srcappid': '2919','clientver': '1000','clienttime': date_time,'mid': '3a8e2eda6b55afd434ed43d762bae621','uuid': '3a8e2eda6b55afd434ed43d762bae621','dfid': '4XSJ8z0tMH343y3JOZ2ZluzO','keyword': key,'page': '1','pagesize': '30','bitrate': '0','isfuzzy': '0','inputtype': '0','platform': 'WebFilter','userid': '0','iscorrection': '1','privilege_filter': '0','filter': '10','token': '','appid': '1014','signature': search_signature
}# 发送请求
response = requests.get(url=search_url, params=search_data, headers=headers)
"""" 获取数据 """
search_data = response.text
html_data = re.findall('callback123\((.*)', search_data)[0].replace(')', '')
# 把json字符串,转成字典数据
json_data = json.loads(html_data)
# print(json_data)
tb = pt.PrettyTable()
tb.field_names = ['序号', '歌名', '歌手', '专辑', 'id']
lis = []
num = 1
# for循坏遍历
for index in json_data['data']['lists']:dit = {'歌名': index['SongName'],'歌手': index['SingerName'],'专辑': index['AlbumName'],'id': index['EMixSongID']}lis.append(dit)tb.add_row([num, index['SongName'], index['SingerName'], index['AlbumName'], index['EMixSongID']])num += 1# print(dit)# print(audio_id)
print(tb)# audio_id = input('请输入歌曲id:')
# signature = Hash_md5(audio_id, date_time)def save(audio_id):signature = Hash_md5(audio_id, date_time)url = 'https://wwwapi.kugou.com/play/songinfo?'data = {'srcappid': '2919','clientver': '20000','clienttime': date_time,'mid': '3a8e2eda6b55afd434ed43d762bae621','uuid': '3a8e2eda6b55afd434ed43d762bae621','dfid': '4XSJ8z0tMH343y3JOZ2ZluzO','appid': '1014','platid': '4','encode_album_audio_id': audio_id,'token': '','userid': '0','signature': signature}response = requests.get(url=url, params=data, headers=headers)json_data = response.json()# 打印 JSON 响应以检查字段# print(json.dumps(json_data, indent=4, ensure_ascii=False))try:# 歌名audio_name = json_data['data']['audio_name']# 音频链接play_url = json_data['data']['play_url']# 歌手名author_info = json_data['data'].get('authors', [{}])  # 获取作者信息,若不存在则用空字典singer_name = author_info[0].get('author_name', '未知歌手')  # 获取作者名,若无则用默认值# 创建保存路径save_directory = os.path.join('kugou', singer_name)os.makedirs(save_directory, exist_ok=True)  # 检查并创建目录# 保存音频music_content = requests.get(url=play_url, headers=headers).contentaudio_file_path = os.path.join(save_directory, f'{audio_name}.mp3')with open(audio_file_path, mode='wb+') as f:f.write(music_content)print(f'{audio_name}.mp3下载完成')# 保存歌词lyrics = json_data['data']['lyrics']song_info_cleaned = re.sub("\[(.*?)\]", "", lyrics)lyrics_file_path = os.path.join(save_directory, f'{audio_name}.txt')with open(lyrics_file_path, 'w+', encoding="utf-8") as f:f.write(song_info_cleaned)print(f'{audio_name}.txt下载完成')# 保存图片img = json_data['data']['authors'][0]['sizable_avatar']  # 使用头像 URL 作为图片music_img = requests.get(url=img, headers=headers).contentimg_file_path = os.path.join(save_directory, f'{audio_name}.jpg')with open(img_file_path, mode='wb+') as f:f.write(music_img)print(f'{audio_name}.jpg下载完成')except KeyError as e:print(f'获取数据时出错: {e}')if __name__ == '__main__':page = input('请输入你要下载的歌曲序号 / 全部下载<0>:')try:if page == '0':for li in lis:save(audio_id=li['id'])else:save(audio_id=lis[int(page) - 1]['id'])except Exception as e:print('你可能输入有误', e)

二、网易云热榜音乐

1、代码

import requests
import re
import osfilename = 'music'
if not os.path.exists(filename):os.makedirs(filename)url = "https://music.163.com/discover/toplist?id=3778678"  # 网易云音乐热歌榜单页面
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0'}response = requests.get(url, headers=headers)
html_data = re.findall('<li><a href="/song\?id=(\d+)">(.*?)</a>', response.text)for song_id, song_name in html_data:song_name_clean = ''.join(c for c in song_name if c not in '<>:"/\\|?*')  # 清理文件名music_url = f'http://music.163.com/song/media/outer/url?id={song_id}.mp3'# 对于音乐播放地址发送请求 获取二进制数据内容music_content = requests.get(url=music_url, headers=headers).content# 使用完整的路径保存文件with open(os.path.join(filename, f'{song_name_clean}.mp3'), mode='wb') as f:f.write(music_content)print(f'Song ID: {song_id}, Song Name: {song_name_clean}')

  

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

特种作业操作(低压电工)实操考试资料整理

为啥去考 在B站关注城阳电工电路等赛博电工师傅们已经有一段时间了,我很喜欢看这些师傅们解决生活中的、生产上的各种电气问题,2023年春天就想去报名学,但是那时候学业很繁忙,而初证又需要去线下学习一段时间。到2024年11月发现自己这段时间突然有空,就尽快找了一家机构报…

AutoGen入门-让两个AI自行聊天完成任务

AutoGen介绍 AutoGen 是一个开源编程框架,用于构建 AI 代理并促进多个代理之间的合作以解决问题。AutoGen 旨在提供一个易于使用和灵活的框架,以加速代理型 AI 的开发和研究,就像 PyTorch 之于深度学习。它提供了诸如代理之间可以对话、LLM 和工具使用支持、自主和人机协作工…

Centos7 安装redis教程

步骤一:安装gcc依赖检查gcc是否已经安装,命令:gcc -v,出现下图说明已经安装由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装yum install -y gcc步骤二:下载redis安装包 https://download.redis.io/relea…

【编码】如何实现一套自定义网络协议?

前言 下文介绍的自定义协议仅作为学习示例,纯粹是玩具项目,没有实际可用性。无需过度关注和讨论其合理性 进行通信的双方是谁? 常见的模型 客户端-服务器,例如HTTP协议,浏览器<=>Web服务器。 中转站模型,如MQTT协议,应用服务<=>中转站<=>硬件客户端 对…

记录一个使用VsCode来ssh的问题(已经打开了ssh的一个文件夹路径,怎么新开一个文件夹路径)

一、操作 使用快捷键 Ctrl+Shift+P(Windows) 或 Cmd+Shift+P (Mac)打开 命令面板 然后输入: File:Open Folder之后就可以选项新的路径打开了。。。没想到我被这个卡了好久,有点无语。

Postman配置接口挡板

0、首先需要在postman上注册并登录账号(登录前最好先备份已有的报文) 如果你在登录后发现历史存储的报文不见了,不要担心,在退出登录后将会重新显示出来。你可以将之前备份的报文导入到登录后的workspace中使用1、进入Workspace,新建Collection 2、找到新建的collection…

vue3新建项目的DevTools Settings

找到vite.config.js 注释掉这两行就消失了

Linux文件系统的安全保障---Overlayroot!

`overlayroot` 是一种使用 OverlayFS 实现的功能,可将根文件系统挂载为只读,并通过一个临时的写层实现对文件系统的修改。这种方法非常适合嵌入式设备或需要保持系统文件完整性和安全性的场景。下文以 RK3568 平台为例,介绍制作 overlayroot 的详细步骤。 ​ 1. 制作精简文件…

DirectX 修复工具 V4.3 绿色增强版:完美解决 DirectX 和 C++ 问题,修复 0xc000007b 错误

介绍 DirectX 修复工具 V4.3 是一款高效的系统修复工具,专为解决 系统异常 和 C++ 运行库 问题而设计,尤其对解决 0xc000007b 错误有着极高的修复率。本工具支持对所有版本的 DirectX 进行修复,并在增强版中新增了对 C++ 运行库问题的修复,提供了一个全面且可靠的解决方案。…

用DevEco Studio模拟器这些能力 没真机也能高效调测鸿蒙原生应用

随着鸿蒙生态的快速发展,越来越多的开发者投身于鸿蒙原生应用的开发中。然而,在实际开发中,真机设备短缺、调测场景复杂等问题常困扰着开发者。为解决这些问题,华为在DevEco Studio上为开发者提供了模拟器(Emulator)功能,帮助开发者在真机匮乏或无真机时,高效且低成本地…

renben-openstack-使用操作

管理员操作 (1)上传一个qcow2格式的centos7镜像 (2)管理员------>云主机类型------>创建云主机类型名称:Centos7VCPU数量:1内存: 1024根磁盘: 10G其他的默认点击创建云主机类型即可界面会显示如下创建公网络 (1)创建公网管理员------>网络------>创建网络…

防护用具穿戴智能监测摄像机

防护用具穿戴智能监测摄像机在现代安全管理中扮演着越来越重要的角色。这些先进设备不仅仅是简单的监视工具,更是通过整合高级技术来提升工作效率和安全性,特别是在复杂环境和危险作业场所的应用日益广泛。防护用具穿戴智能监测摄像机不仅仅是一种安全设备,更是提升工作场所…