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

环境使用:

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

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

▍学习资源推荐

零基础Python学习资源介绍

👉Python学习路线汇总👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(学习教程文末领取哈)
在这里插入图片描述

👉Python必备开发工具👈
在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python学习视频600合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

👉实战案例👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

👉100道Python练习题👈
检查学习结果。
在这里插入图片描述
👉面试刷题👈
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

资料领取

上述这份完整版的Python全套学习资料已经上传CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码输入“领取资料” 即可领取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值