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
print("欢迎来到控制台音乐播放程序!")
db = TinyDB("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']
filename = f"music/{music_id}.mp3"
with open(filename, "wb") as f:
f.write(get(music_url).content)
print("下载完成!正在加入歌单......")
table = db.table("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")))
except KeyboardInterrupt:
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,喜欢的可以点个收藏和关注,我们下次再见!
|