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 getdef 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 = "/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']# 取出URLfilename = 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 pygameimport timedef 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:breaktime.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,喜欢的可以点个收藏和关注,我们下次再见!