hello,大家好,我是wangzirui32,今天我们来学习如何通过网络爬虫实现一个简易控制台音乐播放器,开始学习吧!
app.py
为项目入口程序,download.py
为音乐下载程序,play.py
为音乐播放程序,music
目录存放音乐文件。
本项目使用的第三方库安装命令:
pip install tinydb pygame requests
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()
这里以酷狗音乐作为抓取对象,打开一个歌曲的页面,同时打开网络请求分析器,再点开Fetch/XHR
,经过排查,发现了乐曲文件的URL信息:
经过测试可以发现,URL地址确实指向了乐曲文件。
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("加入完成!")
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()
停止播放。
好了,今天的课程就到这里,我是wangzirui32,喜欢的可以点个收藏和关注,我们下次再见!