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] # ID
        name = row.css('.text-success::text').get().strip() # 歌手
        dit = {
            '歌手': name,
            '歌名': title,
            'ID': music_id,
        }
        # 添加字典到列表中
        info.append(dit)
        # 添加字段内容
        tb.add_row([num, name, title])
        num += 1


    print(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, '保存成功!')

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

尾语

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

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

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

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

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值