目录

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

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

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

代码实现

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'] = nameartist = i['artist'].replace(' ', ' ')i['artist'] = artisti['seq'] = cntcnt += 1print('序号:', 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'] = nameartist = i['artist'].replace(' ', ' ')i['artist'] = artisti['seq'] = cntcnt += 1print('序号:', i['seq'], '歌曲:', i['name'], '歌手:', i['artist'], '\n')

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

# 选择歌曲下载
download_list = input('请输入你想下载歌曲的序号(用空格分隔序号,输入0下载本页全部):').split(' ')
flag = True
if download_list == ['0']:flag = Falsedownload_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'] = nameartist = i['artist'].replace(' ', ' ')i['artist'] = artisti['seq'] = cntcnt += 1print('序号:', i['seq'], '歌曲:', i['name'], '歌手:', i['artist'], '\n')# 选择歌曲下载
download_list = input('请输入你想下载歌曲的序号(用空格分隔序号,输入0下载本页全部):').split(' ')
flag = True
if download_list == ['0']:flag = Falsedownload_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,替换直链从而访问到歌曲的直接下载链接。整个过程比较经典,适合小白练手。

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

  1. thinkcmf5调用指定分类的二级_Tengine快速上手系列教程amp;视频:基于Python API的图片分类应用入门丨附彩蛋...

    前言:近期,Tengine团队加班加点,好消息接踵而来,OpenCV 4.3.0发布,OPEN AI LAB AIoT智能开发平台Tengine与OpenCV合作共同加速边缘智能,Tengine再获业 ...

  2. C语言实现二分法检索binary search(附完整源码)

    实现二分法检索binary search 方法一 方法二 实现二分法检索binary search的完整源码(定义,实现,main函数测试) 方法一 int binarysearch1(const i ...

  3. 基于深度学习模型的花卉图像分类代码_实战 | 基于深度学习模型VGG的图像识别(附代码)...

    本文演示了如何使用百度公司的PaddlePaddle实现基于深度学习模型VGG的图像识别. 准备工作 VGG简介 牛津大学VGG(Visual Geometry Group)组在2014年ILSVRC ...

  4. 实战31:基于opencv的图像碎片拼接复原系统 附完整代码可作为毕设

    C++ 开发环境:Microsoft VisualStudio 2017 Python 开发环境: PyCharm C++ 开源计算机视觉库: Opencv4.1.0 Python 开发语言版本: P ...

  5. 实战:掌握PyTorch图片分类的简明教程 | 附完整代码

    作者 | 小宋是呢 转载自CSDN博客 1.引文 深度学习的比赛中,图片分类是很常见的比赛,同时也是很难取得特别高名次的比赛,因为图片分类已经被大家研究的很透彻,一些开源的网络很容易取得高分.如果大家 ...

  6. 基于python nlp PyTorch智能对联生成系统 附完整代码 毕业设计

    软件标题:智能对联生成系统 b 系统概述 使用项目:智能对联生成系统 软件用途:通过网页端可以获取到根据已有上联只能生成的下联. 开发历史:本项目未曾有前置版本.但在服务器搭建,Tensorflow ...

  7. 基于 Python+flask 构建态势感知系统(附完整源码)

    一.开发 一个基于linux的态势感知系统,基于python和flask框架开发,项目文件目录如下: admin -核心算法 charts -图表生成 model -类 app.py -主文件 con ...

  8. 一款基于 Python+flask 的态势感知系统(附完整源码)

    一.开发 一个基于linux的态势感知系统,基于python和flask框架开发,项目文件目录如下: admin -核心算法 charts -图表生成 model -类 app.py -主文件 con ...

  9. Spark Core项目实战(1) | 准备数据与计算Top10 热门品类(附完整项目代码及注释)

      大家好,我是不温卜火,是一名计算机学院大数据专业大二的学生,昵称来源于成语-不温不火,本意是希望自己性情温和.作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己 ...

最新文章

  1. UVA 536 TreeRocvery 树重建 (递归)
  2. 三角剖分(delaunay)拓扑结构 高维近邻
  3. c++ DirectShow播放任意格式的视频
  4. SIFT原理与源码分析:DoG尺度空间构造
  5. 怎么样给单选按钮前面插入小图标
  6. 并发集合和普通集合以及安全集合的区别
  7. 程序员面试100题之一:对称字符串的最大长度
  8. 在虚拟机中的Ubuntu搭建java开发环境
  9. 前端学习(3262):js高级教程(6)变量
  10. HttpModule的认识与深入理解
  11. 1.maven下仅shiro框架对shiro的测试使用
  12. Bootstrap图片中加播放按钮
  13. 22年PMP考试【全真敏捷试题】
  14. 汽车厂自制的流水线边 物料亮灯防错系统
  15. 02_Unity小窍门100条(中)
  16. org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 文件提前结
  17. DNS中的A记录和CNAME记录的区别
  18. 必修三计算机选修三知识点总结,高二必修三物理知识点总结
  19. error lnk2005解决办法
  20. 【CANopen】CANopen总线讲解

热门文章

  1. JWT 生成Token、解析Token的简单工具类
  2. H5移动端网页自定义扫码
  3. Java大作业-商品管理系统
  4. 操作系统-存储器管理实验
  5. 中国彩妆行业营销现状分析与投资机会研究报告2022版
  6. 12 行列式01--- 定义、计算 与性质: n级行列式的性质、行列式计算
  7. 常用函数+星期+月份+缩写+四季
  8. CIKM 2021 | 推荐系统相关论文分类整理
  9. [FJOI2016]建筑师
  10. 基于ONNX人脸识别实例(SCRFD/ArcFace)-C#版