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

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

1. 项目结构及库准备

Python:通过网络爬虫实现一个简易控制台音乐播放器_第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信息:
Python:通过网络爬虫实现一个简易控制台音乐播放器_第2张图片
经过测试可以发现,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. 效果展示

输入乐曲信息:
Python:通过网络爬虫实现一个简易控制台音乐播放器_第3张图片
可以播放歌单:
Python:通过网络爬虫实现一个简易控制台音乐播放器_第4张图片


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

你可能感兴趣的:(Python,Python番外篇,python,pygame)