Python实现歌曲下载程序, 打包exe应用程序

嗨喽~大家好呀,这里是魔王呐 ❤ ~!

python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取

环境使用:

  • Python 3.10

  • Pycharm

模块使用:

  • import requests >>> pip install requests

  • import parsel >>> pip install parsel

  • import prettytable >>> pip install prettytable

  • import os

打包exe程序: pyinstaller -> pip install pyinstaller

爬虫基本实现流程

一. 数据来源分析

  1. 明确需求

    明确采集的网站以及数据内容 (实现什么样程序)

    程序功能: 通过关键字(歌手/歌名) 进行歌曲搜索, 然后进行对应歌曲内容下载

    • 网址: https://www.gequbao.com/

    • 数据: 歌曲内容 / 歌曲标题

  2. 抓包分析 (浏览器中进行的操作)

    抓包分析: 分析我们需要的数据, 可以请求那个网址能够得到

    分析操作: 通过浏览器自带开发者工具

    先分析歌曲链接地址 -> 歌曲链接地址从哪里的生成 -> 如何才能实现搜索对应下载功能

    • 打开开发者工具: F12

      https://www.gequbao.com/music/402856 在网页页面打开开发者工具

    • 刷新网页: 让数据内容重新加载一遍

    • 快速找到对应歌曲播放地址

      https://sy-sycdn.kuwo.cn/af5833d0735b1bba1f86d4ef6c3888d7/65d72918/resource/n
      2/70/55/756351052.mp3?from=vip

    • 通过关键字搜索找到对应数据包位置

      爬虫: 批量数据采集

      继续分析, 音频链接在那个数据包当中是存在的

      关键字: 使用音频链接当中一段参数即可

      https://sy-sycdn.kuwo.cn/af5833d0735b1bba1f86d4ef6c3888d7/65d72918/resource/n
      2/70/55/756351052.mp3?from=vip

      比如: 756351052 作为关键字进行搜索

    晴天数据包地址: https://www.gequbao.com/api/play_url?id=402856&json=1

    阴天数据包地址: https://www.gequbao.com/api/play_url?id=61045&json=1

    对比分析: id=xxxx (歌曲ID)

    • 晴天ID 402856

    • 阴天ID 61045

    只要获取到歌曲ID就可以下载对应歌曲内容

    • 分析歌曲ID可以请求那个链接获得

      搜索链接地址: https://www.gequbao.com/s/%E9%98%B4%E5%A4%A9

      • 歌手 / 歌名 / 音乐ID

    目的: 根据搜索关键字下载对应歌曲

    1. 歌曲 -> 专门数据包链接 阴天数据包地址: https://www.gequbao.com/api/play_url?id=xxx&j
      son=1

    2. 获取对应歌曲ID -> https://www.gequbao.com/s/搜索关键字

二. 代码实现步骤 (基本四个步骤)

导入的模块

'''
Python学习交流,免费公开课,免费资料,
免费答疑,系统学习加QQ群:926207505
'''
# 导入数据请求模块 (需要安装 pip install requests)
import requests
# 导入数据解析模块 (需要安装 pip install parsel)
import parsel
# 导入制表模块 (需要安装 pip install prettytable)
from prettytable import PrettyTable
# 导入文件操作模块 (无需安装 内置模块)
import os

1. 发送请求

模拟浏览器对于url地址发送请求

while True:"""发送请求- 模拟浏览器对于url地址发送请求"""# 模拟浏览器headers = {# User-Agent 用户代理, 表示浏览器基本身份信息'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'}# 输入搜索key = input('请输入你要下载歌曲(00退出): ')if key == '00':break# 请求网址: 搜索链接地址search = f'https://www.gequbao.com/s/{key}'# 发送请求response = requests.get(url=search, headers=headers)

2. 获取数据

获取服务器返回响应数据

    # 获取数据: 获取服务器返回响应数据html = response.text

3. 解析数据

提取我们需要的数据内容

解析方法: 本案例前三个都能用

  • re正则: 对于字符串数据进行提取 字符串数据即可

  • css选择器: 根据标签属性提取数据内容 需要是有标签格式 (√)

  • xpath: 根据标签节点提取数据 需要是有标签格式

  • json数据解析: 一般情况字典取值 (必须json数据格式)

'''
Python学习交流,免费公开课,免费资料,
免费答疑,系统学习加QQ群:926207505
'''"""解析数据: 提取我们需要的数据内容"""# 1. 把获取到html字符串数据, 转成可解析对象selector = parsel.Selector(html)# 2. 根据标签数据, 提取相关内容 41条数据(第一条和最后一天不是我们需要)rows = selector.css('.row')[1:-1]# 实例化对象tb = PrettyTable()# 设置字段名tb.field_names = ['序号', '歌手', '歌名']# 自定义变量序号num = 0# 创建空列表info = []# for循环遍历, 提取列表里面元素for row in rows:# 3. 进行具体数据解析title = row.css('.text-primary::text').get().strip() # 歌名music_id = row.css('.text-primary::attr(href)').get().split('/')[-1] # IDname = row.css('.text-success::text').get().strip() # 歌手dit = {'歌手': name,'歌名': title,'ID': music_id,}# 添加字典到列表中info.append(dit)# 添加字段内容tb.add_row([num, name, title])num += 1print(tb)key_num = input('请输入你要下载歌曲序号: ')# 获取歌曲ID -> 传入到歌曲数据包中即可# 请求网址: 歌曲对应数据包链接link = f'https://www.gequbao.com/api/play_url?id={info[int(key_num)]["ID"]}&json=1'# 发送请求 + 获取响应数据json_data = requests.get(url=link, headers=headers).json()# 解析数据, 提取歌曲链接music_url = json_data['data']['url']

4. 保存数据

把数据内容保存本地文件夹 / 数据库 …

    """保存数据"""music_content = requests.get(url=music_url, headers=headers).content# 自动创建文件夹if not os.path.exists('music'): # 判断如果没有文件夹# 自动创建文件夹os.mkdir('music')song_name = info[int(key_num)]["歌名"]with open(file=f'music\\{song_name}.mp3', mode='wb') as f:# 保存歌曲内容f.write(music_content)print(song_name, '保存成功!')

如果文章看不懂,我还准备了视频教程,同样文末名片获取噢~

尾语

最后感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

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

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

相关文章

Vue30 自定义指令 函数式 对象式

实例 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>自定义指令</title><script type"text/javascript" src"../js/vue.js"></script></head><body><!-- 需求1&…

使用向量数据库pinecone构建应用06:日志系统异常检测 Anomaly Detection

Building Applications with Vector Databases 下面是这门课的学习笔记&#xff1a;https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement them using Pinecon…

spring.factories 和@ComponentScan的使用小结

spring.factories和ComponentScan是Spring框架中两个不同的概念&#xff0c;它们在功能和作用上有一些区别。 spring.factories&#xff1a;通过SPI机制扫描META-INF/spring.factories文件中配置加载组件 spring.factories是Spring Boot项目中的一个特殊文件&#xff0c;用于自…

excel文件数据上传到MySQL数据库

方法1&#xff1a;使用MySQL的LOAD DATA语句 如果Excel文件已经保存为CSV格式&#xff0c;可以使用MySQL的LOAD DATA INFILE语句将数据导入表中。例如&#xff1a; LOAD DATA LOCAL INFILE path/to/your/file.csv INTO TABLE your_table_name FIELDS TERMINATED BY , …

1004: 【C1】【一维数组】【入门】输出奇数和偶数

题目描述 输入n个整数&#xff0c;将其中的奇数和偶数分别显示出来&#xff08;1 < n < 30&#xff09; 输入 第一行&#xff1a;一个整数n。第二行&#xff1a;n个空格隔开的整数。 输出 第一行&#xff1a;若干个奇数。第二行&#xff1a;若干个偶数。&#xff08…

Javaweb之SpringBootWeb案例之配置优先级的详细解析

1. 配置优先级 在我们前面的课程当中&#xff0c;我们已经讲解了SpringBoot项目当中支持的三类配置文件&#xff1a; application.properties application.yml application.yaml 在SpringBoot项目当中&#xff0c;我们要想配置一个属性&#xff0c;可以通过这三种方式当中…

强化学习入门到不想放弃-3

第三节我们主要讲一下SARSA模型 上节课的链接:强化学习入门到不想放弃-2 (qq.com) 有模型的概念:简单理解,上节课我讲的就是有模型,就是可以开上帝视角,知道全局地图 无模型的概念: 打CS,但是看不到地图的情况,全凭自己探索 今天的讲解环境还是和上节课一样,如下…

vue 项目打包图片没有打包进去问题解决

问题 vue 项目打包&#xff0c;项目中引用了的图片没有被打进包里&#xff0c;导致打包后的项目图片缺失。 解决方法 1、在导入图片的文件中通过 import 引入图片 这种方法只适合图片少的情况 <template><img :srctestImg/> </template><script>i…

yml配置文件中常见的配置及含义

1.数据库连接的相关配置 项目名称:datasource:driver-class-name: com.mysql.cj.jdbc.Driverhost: localhostport: 3306database: 数据库名username: 用户名password: 密码 springboot配置文件,用于配置数据库源连接信息 数据库驱动类型为com.mysql.cj.jdbc.Driver,这是数据…

redis的搭建 RabbitMq搭建 Elasticsearch 搭建

官网 Download | Redis wget https://github.com/redis/redis/archive/7.2.4.tar.gz 编译安装 yum install gcc g tar -zxvf redis-7.2.4.tar.gz -C /usr/localcd /usr/local/redis make && make install 常见报错 zmalloc.h:50:10: fatal error: jemalloc/jemal…

前端学习——JS学习

文章目录 1. 定义变量&#xff0c;关键字 var、let、const2. 定义变量&#xff0c;数据类型3. 数组变量的操作4. 对象的操作5. JSON 字符串 1. 定义变量&#xff0c;关键字 var、let、const 这里主要是对var、let做比较 /** 1. var存在变量提升、let不存在变量提升 **/ cons…

校招面试Java、springboot、mysql基本问题

这里有一些常见的Java、Spring Boot和MySQL面试问题&#xff1a; Java面试问题&#xff1a; Java中的基本数据类型有哪些&#xff1f;什么是Java中的自动装箱和拆箱&#xff1f;什么是面向对象编程&#xff1f;Java中的面向对象编程有哪些特性&#xff1f;Java中的异常处理机…

Minimize Inversions

先来看看官方题解的做法&#xff0c;他一反常态的没有在逆序对题目里面考虑每个位置的贡献&#xff0c;而是直接回到定义考虑每对数是否是逆序对 我们考虑原数列中任意的一组数\((a_i,a_j)\)和\((b_i,b_j)\)。如果最开始两个都不是逆序对&#xff0c;那么交换之后两个都是逆序对…

前端面试常考之——Vue前端路由权限控制(vuex版本)

文章目录 前端权限控制思路1. 菜单的权限控制 Vue的权限控制实现1. 菜单的控制2. 界面的控制3. 按钮的控制4. 请求和响应的控制请求控制响应控制 小结 前端权限控制思路 1. 菜单的权限控制 菜单的控制 在登录请求中&#xff0c;会得到权限数据&#xff0c;当然&#xff0c;这…

python中停止线程的方法

文章目录 1 threading.Event()方法2 子线程抛出异常&#xff0c;立刻停止 1 threading.Event()方法 一种常见的方法是使用标志位来通知线程应该停止。线程可以定期检查这个标志位&#xff0c;如果它被设置为停止&#xff0c;那么线程就结束其执行。下面是一个简单的例子&#…

NXP实战笔记(八):S32K3xx基于RTD-SDK在S32DS上配置LCU实现ABZ解码

目录 1、概述 2、SDK配置 2.1、IO配置 2.2、TRGMUX配置 2.3、LCU配置 2.4、Trgmux配置 2.5、Emios配置 2.6、代码实现 1、概述 碰到光电编码器、磁编码器等,有时候传出来的位置信息为ABZ的方式,在S32K3里面通过TRGMUX、LCU、Emios结合的方式可以实现ABZ解码。 官方…

HCIA(11)OSPF 数据包构成(Hello、DBD、LSR、LSU、LSAck包)、状态机、工作流程(建立邻居关系、主从关系协商、LSDB同步)

OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&#xff08;Interior Gateway Protocol&#xff09;。 目前针对IPv4协议使用OSPF Version 2&#xff0c;针对IPv6协议使用OSPF Version 3。 在OSPF出现前&#xff0c;网络…

C++的list容器->基本概念、构造函数、赋值和交换、大小操作、插入和删除、数据存取、反转和排序、排序案例

#include<iostream> using namespace std; #include <list> //list容器构造函数 void printList(const list<int>& L) { for (list<int>::const_iterator it L.begin(); it ! L.end(); it) { cout << *it << "…

Unix与Linux区别

目录 历史和所有权 内核 发行版 开源性质 用户群体 命令行界面 历史和所有权 Unix&#xff1a; Unix是一个操作系统家族的名称&#xff0c;最早由贝尔实验室&#xff08;Bell Labs&#xff09;的肖像电机公司&#xff08;AT&T&#xff09;开发。最早的Unix版本是在19…

如何在MATLAB中创建一个矩阵?如何在MATLAB中执行矩阵运算?如何在MATLAB中绘制图形?

如何在MATLAB中创建一个矩阵&#xff1f; 在MATLAB中创建一个矩阵有多种方法。以下是一些常见的方法&#xff1a; 直接输入矩阵元素&#xff1a; 你可以直接在MATLAB命令窗口中输入矩阵的元素&#xff0c;每个元素之间用空格或逗号分隔&#xff0c;不同行之间用分号分隔。 A …