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.hqwc.cn/news/487755.html

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

相关文章

SwiftUI 支持拖放功能的集合视图(Grid)如何捕获手指按下并抬起这一操作

功能需求 假设我们开发了一款 SwiftUI 应用,其中用户可以通过拖放 Grid 中的 Cell 来完成一些操作。现在,我们希望用户在某个 Cell 被按下并随后抬起手指时得到通知,这能够实现吗? 如上图所示,我们准确地捕获到了手指在 Grid 的 Cell 上按下再抬起这一操作!那么它是如何…

力扣精选100道——外观数列(模拟专题)

外观数列算法题链接 🚩了解题意 该题的下面充分的给你说明了这个题目的意思。 3 3 2 2 2 5 1 我们根据我们正常读的顺序读 俩个3 三个2 一个5 一个1 连起来就是 2 3 3 2 1 5 1 这就是最终输出的字符串。 题目开头说了,我们最初是 1开始读…

想设计智能手环,我需要设计哪种电路?

随着电子技术的高速发展,可穿戴设备逐渐火爆,其中之一是智能手环,作为现代可穿戴技术的热门产品之一,它集成了多种功能,如健康检测、运动跟踪、通知提醒等,为了实现这些功能,需要用上哪些电路模…

【DDD】学习笔记-薪资管理系统的测试驱动开发2

测试驱动开发的过程 满足简单设计并编写新的测试 当代码满足重用性和可读性之后,就应遵循简单设计的第四条原则“若无必要,勿增实体”,不要盲目地考虑为其增加新的软件元素。这时,需要暂时停止重构,编写新的测试。 …

【深入理解设计模式】原型设计模式

原型设计模式 原型设计模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制已有对象来创建新对象,而无需直接依赖它们的具体类。这种模式通常用于需要频繁创建相似对象的场景,以避免昂贵的创建操作或初始化过…

Spring篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、使用 Spring 有哪些方式?二、什么是 Spring IOC 容器?三、什么是依赖注入?四、可以通过多少种方式完成依赖注入?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这…

Ansible 更换aliyun 镜像 并下载tree

目录 查看系统版本找到对应 的版本对当前镜像进行备份下载aliyuan更换成功安装扩展源更换源之后 的三个命令 这里安装一个aliyun 的镜像 本案例 仅供实验参考 生产环境中请谨慎使用 查看系统版本 先查看linux 的系统 版本 ansible slave -m shell -a uname -a找到对应 的版本…

【办公类-16-10-02】“2023下学期 6个中班 自主游戏观察记录(python 排班表系列)

背景需求: 已经制作了本学期的中4班自主游戏观察记录表 【办公类-16-10-01】“2023下学期 中4班 自主游戏观察记录(python 排班表系列)-CSDN博客文章浏览阅读398次,点赞10次,收藏3次。【办公类-16-10-01】“2023下学…

邮件发送/接收过程分析、常见邮箱sport/dport列举、检测规则开发思路分析

一、邮件发送和接收过程分析 (转载自:邮件的发送和接收过程——STMP、POP、IMAP、MIME_当收件人接收电子邮件时自己的邮件服务器通过什么收文件-CSDN博客) 电子邮件发送协议 是一种基于“ 推 ”的协议,主要包括 SMTP &#xff1…

javaweb day3 day4 day5

js 引入方式 写法 基础语法 写法 变量 写法 数据类型 运算符 与java相同 会判断类型是否相同 循环控制语句 和java相同 函数(方法) 写法 Array数组 写法 string字符串 写法 js自定义对象 写法 JSON 写法 BOM window 写法 location 写法 DOM 案例…

TensorFlow2.x 精选笔记(1)数据基本操作与线性代数

学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning 一、数组与张量 虽然张量看起来是复杂的对象,但它们可以理解为向量和矩阵的集合。理解向量和矩阵对于理解张量至关重要。 向量是元素的一维列表,向量是一…

【这个词(Sequence-to-Sequence)在深度学习中怎么解释,有什么作用?】

🚀 作者 :“码上有前” 🚀 文章简介 :深度学习笔记 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 Sequence-to-Sequence(Seq2Seq) Sequence-to-Sequence(Seq2Seq…