IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python:通过网络爬虫实现一个简易控制台音乐播放器 -> 正文阅读

[Python知识库]Python:通过网络爬虫实现一个简易控制台音乐播放器

hello,大家好,我是wangzirui32,今天我们来学习如何通过网络爬虫实现一个简易控制台音乐播放器,开始学习吧!

1. 项目结构及库准备

项目结构
app.py为项目入口程序,download.py为音乐下载程序,play.py为音乐播放程序,music目录存放音乐文件。
本项目使用的第三方库安装命令:

pip install tinydb pygame requests

2. 入口程序 app.py

app.py代码如下:

from download import download     # 后续会编写
from play import play_all_music   # 后续会编写
from tinydb import TinyDB         # 管理json数据库的包

print("欢迎来到控制台音乐播放程序!")
db = TinyDB("music.json")        # 连接music.json数据库
# music.json 用来保存自己的歌单

def start():
    print(30*"-")
    print("1. 播放歌单")
    print("2. 新增乐曲")
    print("3. 帮助")
    print("4. 退出")

    operation = input("请选择你的操作(输入序号):")

    if operation == "1":
        play_all_music(db)
    elif operation == "2":
        download(db)
    elif operation == "3":
        help_text = """
本系统可以帮助您在控制台中播放音乐
音乐来自酷我音乐官网
启动系统,可以选择自己的操作
播放乐曲时,可以按 Ctrl+C 跳过该乐曲
        """
        print(help_text)
    elif operation == "4":
    	db.close()
        exit()
        
    # 执行完前面的操作后 让用户重新开始选择
    start()

# 开始程序
start()

3. 下载音乐文件

3.1 抓包分析

这里以酷狗音乐作为抓取对象,打开一个歌曲的页面,同时打开网络请求分析器,再点开Fetch/XHR,经过排查,发现了乐曲文件的URL信息:
抓包分析
经过测试可以发现,URL地址确实指向了乐曲文件。

3.2 download.py

download.py文件代码如下:

from requests import get

def download(db):
    music_id = input("请输入乐曲ID:")
    music_name = input("请输入乐曲名称:")
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36 Edg/100.0.1185.29"
    }
    # 请求数据
    url = "http://www.kuwo.cn/api/v1/www/music/playUrl"
    params = {
        "mid": music_id,
        "type": "music",
        "httpsStatus": "1"
    }
    data = get(url, params=params, headers=headers).json()
    music_url = data['data']['url']     # 取出URL
    filename = f"music/{music_id}.mp3"  # 保存文件路径

    with open(filename, "wb") as f:     # 保存乐曲
        f.write(get(music_url).content) # 写入乐曲

    print("下载完成!正在加入歌单......")

    table = db.table("music")           # 连接表music
    # 插入歌曲信息
    table.insert({"music_name": music_name, "music_id": music_id})
    print("加入完成!")

4. 播放音乐 play.py

play.py代码如下:

import pygame
import time

def play(filename):
    track = pygame.mixer.music.load(filename)  # 加载音乐文件
    pygame.mixer.music.play()                  # 播放
    pygame.mixer.music.set_volume(1.0)         # 设置音量
    
    time_list = []
    while True:
    	"""此处循环代码解释看下文"""
        now = pygame.mixer.music.get_pos()
        if not now in time_list:
            time_list.append(now)
        else:
            break
        time.sleep(1)
    
    # 停止播放
    pygame.mixer.music.stop()

def play_all_music(db):
    table = db.table("music")
    all_music = table.all()   # 查询所有乐曲

    print("歌单:")         # 列出歌单
    print("-"*30)
    for i in all_music:
        print(i.get('music_name'))
    print("-"*30)

    pygame.init()            # 初始化
    pygame.mixer.init()
    print("播放器就绪......") # 准备播放
    print("-"*30)

    for i in all_music:
        print("开始播放 {} ".format(i.get('music_name')))
        try:
            play("music/{}.mp3".format(i.get("music_id")))   # 根据id补全音乐文件路径
        except KeyboardInterrupt:  # Ctrl+C 引发的异常捕捉
            continue    # 下一个
    
    pygame.mixer.music.stop()

以上便封装了音乐播放的功能。关于代码中while True那一段的解释如下:
知周所众(众所周知),pygame模块中的音乐播放函数pygame.mixer.music.play()存在一个问题:不用time.sleep停止程序的话,乐曲不会播放。但乐曲总得放完啊,于是每间隔1秒,获取歌曲播放到的位置(pygame.mixer.music.get_pos()),如果乐曲有1秒进度停滞了,那就是播放完毕了,随后调用pygame.mixer.music.stop()停止播放。

5. 效果展示

输入乐曲信息:
添加乐曲
可以播放歌单:
播放乐曲


好了,今天的课程就到这里,我是wangzirui32,喜欢的可以点个收藏和关注,我们下次再见!

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 16:14:01  更:2022-04-06 16:14:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 23:41:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计