34. 实战:基于某api实现歌曲检索与下载(附完整源代码)

news2025/2/25 6:28:29

目录

前言        (相关链接在评论区)

目的        (相关链接在评论区)

思路        (相关链接在评论区)

代码实现

1. 访问某音乐平台(链接放在评论区了),抓包搜索接口

2. 抓取音乐id信息

3. 解析音乐id,获取下载直链

4. 保存到本地

5. 实现用户交互逻辑

完整代码

运行效果

总结


前言

本节将介绍基于Python和某api实现的歌曲检索与批量下载功能的实现。

(相关链接在评论区)


目的

实现搜索任意关键词,选择任意序号歌曲下载或下载当页全部歌曲。


思路

1. 访问某音乐平台(链接放在评论区了),抓包搜索接口

2. 抓取音乐id信息

3. 解析音乐id,获取下载直链

4. 保存到本地

5. 实现用户交互逻辑


代码实现

1. 访问某音乐平台(链接放在评论区了),抓包搜索接口

查看源代码,发现没有数据,所以抓包。

F12 --> Network --> Fetch/XHR --> 刷新网页

拿到请求搜索列表的URL,以及两个关键参数:

headers = {
    'Cookie': '_ga=GA1.2.1574857442.1641026894; _gid=GA1.2.607461508.1641026894; kw_token=WRFKXNRRLBB',
    'csrf': 'WRFKXNRRLBB',
    'Host': '见评论区',
    'Referer': '见评论区',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}
# 输入关键参数
key = input('请输入搜索关键词:')
pn = input('请输入查看页序号:')

# 搜索接口,key为关键词,pn为页码
url = '见评论区'.format(key, pn)
resp = requests.get(url, headers=headers)
# pprint(resp.json())

 因为返回结果是json形式的数据,用json库解析,拿出必要的信息,给歌曲编号(没有编号键)

# 输出搜索结果
cnt = 1
data_list = resp.json()['data']['list']
for i in data_list:
    name = i['name'].replace(' ', ' ')
    i['name'] = name
    artist = i['artist'].replace(' ', ' ')
    i['artist'] = artist
    i['seq'] = cnt
    cnt += 1

    print('序号:', i['seq'], '歌曲:', i['name'], '歌手:', i['artist'], '\n')

2. 抓取音乐id信息

    # 拿到歌曲id便于解析
    rid = request_dic['rid']

rid是我们必要的信息。

我们在某直链网站可以用rid来提取它所对应的直链下载地址(相关链接在评论区)

3. 解析音乐id,获取下载直链

for data in download_list:
    # 把字符串转换为十进制整数用于选择列表数据
    if flag:
        data = int(data, 10)
    # 逐个拿选中歌曲的字典
    request_dic = data_list[data-1]
    # 拿到歌曲id便于解析
    rid = request_dic['rid']
    # print(rid)
    # 稍微处理一下曲名
    name = request_dic['name'].split('-')[0]
    # print(name)
    new_url = '见评论区'.format(rid)
    response = requests.get(new_url)

如果没有全部下载的话,我们就需要把输入的字符串转为数字便于选择歌曲序号,拿到rid并且处理一下曲名,因为有些曲名会在“-”后面加上一些来源,比如xxx片头曲之类,我们是不需要的,所以直接split分割取第一个。

new_url就是直接把rid塞进去,就是对应的直链地址了。 

4. 保存到本地

    if not os.path.exists('./3_Music_Crawler'):
        os.mkdir('./3_Music_Crawler')
    with open('3_Music_Crawler/%s.mp3' % name, 'wb') as f:
        f.write(response.content)
        print(name, '下载成功')

如果没有某路径,便创建它,这是基于os库实现的,导包即可。

将直链中的数据二进制写入本地文件,用歌曲名命名,后缀为MP3格式。 

5. 实现用户交互逻辑

首先就是要先输入关键参数:输入关键词与查询页码,每页中的数据量不必改变,默认是20条。

# 输入关键参数
key = input('请输入搜索关键词:')
pn = input('请输入查看页序号:')

向用户输出搜索结果,并打印歌曲序号和详细信息,供用户选择是否进行下载。

# 输出搜索结果
cnt = 1
data_list = resp.json()['data']['list']
for i in data_list:
    name = i['name'].replace(' ', ' ')
    i['name'] = name
    artist = i['artist'].replace(' ', ' ')
    i['artist'] = artist
    i['seq'] = cnt
    cnt += 1

    print('序号:', i['seq'], '歌曲:', i['name'], '歌手:', i['artist'], '\n')

用户输入0时,下载当前页所有歌曲,也可以输入以空格分隔的序号来下载对应序号的歌曲。

# 选择歌曲下载
download_list = input('请输入你想下载歌曲的序号(用空格分隔序号,输入0下载本页全部):').split(' ')
flag = True
if download_list == ['0']:
    flag = False
    download_list = []
    for it in range(1, len(resp.json()['data']['list']) + 1):
        download_list.append(it)
print('开始下载...')

这样我们就完整顺下来整个过程了,最后我们梳理一下逻辑,奉上完整代码:

(相关链接在评论区)


完整代码

import requests
from pprint import pprint
import os

# 伪装请求头
headers = {
    'Cookie': '_ga=GA1.2.1574857442.1641026894; _gid=GA1.2.607461508.1641026894; kw_token=WRFKXNRRLBB',
    'csrf': 'WRFKXNRRLBB',
    'Host': '见评论区',
    'Referer': '见评论区',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}

# 输入关键参数
key = input('请输入搜索关键词:')
pn = input('请输入查看页序号:')

# 搜索接口,key为关键词,pn为页码
url = '见评论区'.format(key, pn)
resp = requests.get(url, headers=headers)
# pprint(resp.json())

# 输出搜索结果
cnt = 1
data_list = resp.json()['data']['list']
for i in data_list:
    name = i['name'].replace(' ', ' ')
    i['name'] = name
    artist = i['artist'].replace(' ', ' ')
    i['artist'] = artist
    i['seq'] = cnt
    cnt += 1

    print('序号:', i['seq'], '歌曲:', i['name'], '歌手:', i['artist'], '\n')

# 选择歌曲下载
download_list = input('请输入你想下载歌曲的序号(用空格分隔序号,输入0下载本页全部):').split(' ')
flag = True
if download_list == ['0']:
    flag = False
    download_list = []
    for it in range(1, len(resp.json()['data']['list']) + 1):
        download_list.append(it)
print('开始下载...')

# 下载歌曲
for data in download_list:
    # 把字符串转换为十进制整数用于选择列表数据
    if flag:
        data = int(data, 10)
    # 逐个拿选中歌曲的字典
    request_dic = data_list[data-1]
    # 拿到歌曲id便于解析
    rid = request_dic['rid']
    # print(rid)
    # 稍微处理一下曲名
    name = request_dic['name'].split('-')[0]
    # print(name)
    new_url = '见评论区'.format(rid)
    response = requests.get(new_url)

    if not os.path.exists('./3_Music_Crawler'):
        os.mkdir('./3_Music_Crawler')
    with open('3_Music_Crawler/%s.mp3' % name, 'wb') as f:
        f.write(response.content)
        print(name, '下载成功')

运行效果

 

 


总结

本节基于某api获取直链,在某音乐平台获取搜索列表,从而拿到音乐唯一的rid,替换直链从而访问到歌曲的直接下载链接。整个过程比较经典,适合小白练手。

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

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

相关文章

BUUCTF reverse题解汇总

本文是BUUCTF平台reverse题解的汇总 Page1 easyrereverse1reverse2内涵的软件新年快乐xorhelloworldreverse3不一样的flagSimpleRevJava逆向解密[GXYCTF2019]luck_guy[BJDCTF2020]JustRE刮开有奖简单注册器pyre[ACTF新生赛2020]easyrefinditrsa[ACTF新生赛2020]rome[FlareOn4]…

穿越寒冬春暖花开,当下便是在社科院杜兰金融管理硕士项目读研的好时光

时间无声的从指尖划过,严寒的冬天已经过去,春天即将到来。23考研期间,恰逢特殊时期,好多同学错失了考试的机会,忧心2023是否还可以读研。不要担心,免联考的社科院与杜兰大学金融管理硕士项目来了&#xff0…

【html】如何处理显示ttf字体图标

当看到某些文件的后缀名是ttf,表示是字体文件,除了显示字体,还能显示图标,如果需要显示的图标太多,就把它们放在一个文件中,方便统一管理图标,在此讲一下怎么显示字体图标。 打开文件 电脑上用…

超低损耗电路新研究:光芯片电路+量子计算

(图片来源:网络)在光通信以及使用光而不是电荷来存储和传输信息的量子计算机的设计中,要做到以最小的损耗传输,并能操纵最小单位光,光子起着至关重要的作用。现在,美国国家标准与技术研究院的研…

DynaSLAM-4 DynaSLAM中Mask R-CNN部分源码解析(Ⅲ)

目录 1.RPN 1.1 RPN层的作用与实现解读 1.2 候选框过滤ProposalLayer层 2. DetectionTargetType层 2.1 DetectionTargetType层作用 2.2 正负样本选择与标签定义 1.RPN 1.1 RPN层的作用与实现解读 上篇博客中我们解释了如何通过generate_pyramid_anchors在每一个特征层上…

Nacos学习:一、Nacos注册中心

Nacos 1. Nacos注册中心 ​ 国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 ​ Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您实现动态服务发…

JVM笔记(4)—— 运行时数据区——堆空间

一、堆空间内存结构 堆空间内存分为年轻代和老年代。年轻代又细分为Eden区,Survivor1区和Survivor2区(又称为from区和to区) 为什么要对堆空间进行分代? 因为不同对象的生命周期不同,绝大部分对象都是临时对象&#x…

DIY 3D打印机——【有啥用啥版】

3D打印已经非常普及,手搓3D打印机的也很普遍了,不幸的是多年前买的三角洲(delta型)打印机年前罢工了,幸好它完成了一项重要使命:让手搓的铣床动起来,从而能够让铣床把受力部分的PLA零件自己加工…

高频卡顿问题分析

从监控图中可以看到,3.76k的用户,两分钟内报卡顿次数达到100万次 ,很恐怖,这个是非正常的卡顿 由于没有日志,只能先看代码分析,出现高频卡顿的原因 问题描述 在播放过程,会频繁上报卡顿&…

Redis详解(二)

文章目录Redis的单线程模型Redis数据过期删除策略内存淘汰机制手写LRU持久化快照持久化(RDB)RDB优缺点AOF持久化AOF优缺点RDB和AOF的选择注意事项Redis修改配置后未生效(windows)Redis的单线程模型 Redis基于Reactor模式来设计开发了自己的一套高效的时间处理模型。 Redis内部…

leetcode-每日一题-1669-合并两个链表(中等,链表操作)

这道题就是考察对链表的理解,但是题目给的链表和我们数据结构学的还是有点不一样的,这里面的头节点是带节点信息的,我们按照课本来说的话头节点,或者叫首元节点如果我记得不错的话就是叫这个,是不提供节点信息的&#…

[数字媒体] PR视频剪辑之自定义音频、视频加速转场和特显停顿

这篇博客是作者数字媒体系列的笔记,仅作为在线笔记供大家学习。在剪辑视频中,我们会遇到自定义音频、视频加速转场、特显停顿、画面调整等技巧,这篇文章将详细介绍。希望对您有所帮助,后续有时间会深入分享视频制作、动画制作等内…

结合淘宝与Twitter详解分布式系统与其架构设计,分布式其实并不难,阿里架构师用实战给讲明白了!

什么是分布式架构 分布式系统(distributed system) 是建立在网络之上的软件系统。 内聚性:是指每一个数据库分布节点高度自治,有本地的数据库管理系统。 透明性:是指每一个数据库分布节点对用户的应用来说都是透明的…

手把手教你如何从0到1开发自动化测试框架,你确定不看?

目录 一、序言 二、自动化测试框架技术选型 三、自动化测试框架的设计思路 四、自动化框架介绍 五、框架技术要点解析 六、后续TODO 一、序言 随着项目版本的快速迭代、APP测试有以下几个特点: 首先,功能点多且细,测试工作量大&#x…

Redis基本通用命令

通用命令 查看使用文档,例如要查看select怎么使用 help select切换数据库 select 1查看符合模板的所有key keys * keys *a keys a*判断key是否存在 exists k1给key设置有效期,给k1设置20秒有效期 expire k1 20查看key剩余有效期,查看k1…

2014年408算法题

文章目录0 结果1 题目2 思路0 结果 1 题目 2 思路 二叉树的带权路径长度(WPL)的计算方法有两种: 1,定义:WPL所有叶结点的权值Wi∗该结点深度Di求和WPL所有叶结点的权值W_i*该结点深度D_i求和WPL所有叶结点的权值Wi​…

linux环境minio安装启动,管理员登录,nginx代理

一.下载minio 官网下载: MinIO | Code and downloads to create high performance object storage 直接点击下载或者用wget https://dl.min.io/server/minio/release/linux-amd64/minio 最后都是得到一个文件minio(大概100M) 二.启动minio 1.创建文件夹,比如 mkdir /data…

mysql的redolog、undolog、binlog介绍,及mysql两阶段提交

https://blog.csdn.net/weixin_45676738/article/details/124770085 https://blog.csdn.net/TABE_/article/details/124935324 三种log REDO LOG 称为 重做日志 ,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。 UNDO LOG 称…

电源管理系统的功能和发展前景分析

电源对于电子设备的重要性不言而喻,电源管理系统是将电源有效分配给系统中的不同组成,在电子设备中起到了电能变换、控制、检测等作用,保证系统的稳定运行,对设备的性能有着直接影响,广泛用在工业、新能源、机器设备、…

一、初识 Spring 框架

文章目录一、Spring 简介二、Spring 框架的优点三、Spring 框架的组成四、Spring 框架 学习路线一、Spring 简介 Spring 框架简介 2004年3月24日发布了Spring 1.0正式版,Spring 框架的诞生给整个软件行业带来了春天。这个框架极大程度上简化了开发,其本…