python实现音乐播放和下载小程序功能
作者:粽子哥哥123
(本篇部分代码综合整理自B站,B站有手把手说明的教程)
1.网易云非付费内容爬取器(声明:由于技术十分简单,未到触犯软件使用规则的程度)驱动Edge浏览器(自己写驱动会更高端)进入界面,爬取列表中第一个音频地址并存入相应文件夹中。这里有一个最简单的爬虫程序和一个最简单的tkinter GUI编程。
注意,要先在网易云音乐网页中将第一个对应音频链接的位置定位:
对于以上定位可通过如下方式获得(定位器):
req = driver.find_element_by_id('m-search') a_id = req.find_element_by_xpath('.//div[@class = "item f-cb h-flag "]/div[2]//a').get_attribute("href")
在XML语言中寻找链接路径的方法可参见find_element_by_xpath
创建目录参见makedirs
这里的GUI需要tkinter添加文本。用text控件insert(插入文本)、see(滚动)、update(更新)等方法显示正在下载和已下载图样;在get_music_name函数中,首先从输入窗口获取名称,然后调用Edge驱动访问网易云音乐主页,通过'http://music.163.com/song/media/outer/url?id={}.mp3'.format(song_id)
搜到歌曲,通过上述定位器找到歌曲地址和歌名。注意到第一个函数传入的应该是字典类型(有了这种语句:song_id = item['song_id']
),那就创建一个字典后在函数体内调用song_load实现下载。在这之前,驱动就完成了任务,所以可以关闭驱动。
至于Tkinter的控件内容,应该根据实际情况试错和设计,界面编程相对还是比较简单的。(分别创建标签控件、输入框、列表框、按钮,并依次确定它们在主界面中的位置)
from tkinter import * from selenium import webdriver global entry import os from urllib.request import urlretrieve #2.下载歌曲 def song_load(item): song_id = item['song_id'] song_name = item['song_name'] song_url = 'http://music.163.com/song/media/outer/url?id={}.mp3'.format(song_id) #创建文件夹 os.makedirs('music_netease',exist_ok=True) path = 'music_netease\{}.mp3'.format(song_name) #显示数据到文本框 text.insert(END,'歌曲:{},正在下载...'.format(song_name)) #文本框滚动 text.see(END) #更新 text.update() #下载 urlretrieve(song_url,path) #显示数据到文本框 text.insert(END,'歌曲:{},下载完毕'.format(song_name)) #文本框滚动 text.see(END) #更新 text.update() #1.搜索 def get_music_name(): #获取输入的内容 name = entry.get() url = 'https://music.163.com/#/search/m/?s={}&type=1'.format(name) #搜索页面 option = webdriver.EdgeOptions() option.add_argument('--headless') #driver = webdriver.Edge(edge_options=option) driver = webdriver.Edge('D:\\python\\msedgedriver') driver.get(url) driver.switch_to.frame('g_iframe') #获取歌曲的id req = driver.find_element_by_id('m-search') a_id = req.find_element_by_xpath('.//div[@class = "item f-cb h-flag "]/div[2]//a').get_attribute("href") song_id = a_id.split('=')[-1] print(song_id) song_name = req.find_element_by_xpath('.//div[@class="item f-cb h-flag "]/div[2]//b').get_attribute("title") print(song_name) #构造字典 item = {} item['song_id'] = song_id item['song_name'] = song_name driver.quit() #下载歌曲 song_load(item) #get_music_name() #形象工程 # 搭建界面 #创建画板 root = Tk() #标题 root.title('网易云下载器') #设置窗口大小 root.geometry('560x450+400+200') #标签控件 label = Label(root,text = '输入要下载的歌曲:',font = ('华文行楷',20)) #标签定位 label.grid() #输入框 entry = Entry(root,font = ('楷书',20)) #定位 entry.grid(row = 0,column = 1) #列表框 text = Listbox(root,font = ('隶书',16),width = 50, heigh = 15) text.grid(row = 1,columnspan = 2) #点击按钮 button = Button(root,text = '开始下载',font = ('楷书',15),command=get_music_name) button.grid(row=2, column=0,sticky=W) button1 = Button(root,text = '退出程序',font = ('楷书',15),command=root.quit) button1.grid(row=2, column=1,sticky=E) #显示当前的界面内容 root.mainloop()
运行效果
发现music_netease文件夹中相关文件赫然在列。
简易音乐播放器:
这个控件在界面上仍然使用Tkinter,只不过没有通过编程,而是利用pygame库中的音频模块,在逻辑上增加了上一曲、下一曲(读取上一个文件、下一个文件)、音量控制、简单的线程控制等。
import os import tkinter import tkinter.filedialog import time import threading import pygame #第一步 搭建界面 root = tkinter.Tk() root.title('音乐播放器') #窗口大小和位置 root.geometry('460x600+500+100') #不能拉伸 root.resizable(False,False) folder = ''#文件路径 res = [] num = 0 now_music = '' #第二步 功能实现 def buttonChooseClik(): '''添加文件函数''' global folder global res if not folder: folder = tkinter.filedialog.askdirectory()#选择目录 musics = [folder + '\\' + music for music in os.listdir(folder) if music.endswith(('.mp3','ogg'))] ret = [] for i in musics: ret.append(i.split('\\')[1:]) res.append(i.replace('\\','/')) var2 = tkinter.StringVar() var2.set(ret) #放入列表框 lb = tkinter.Listbox(root,listvariable =var2) lb.place(x=50,y=100,width=260,height=300) if not folder: return global playing playing = True # 根据情况禁用和启用相应的按钮 buttonPlay['state'] = 'normal' buttonStop['state'] = 'normal' pause_resume.set('播放') def play(): '''播放音乐的函数''' #初始化混音器设备 if len(res): pygame.mixer.init() global num while playing: if not pygame.mixer.music.get_busy(): #随机播放一首歌曲 nextMusic =res[num] print(nextMusic) print(num) pygame.mixer.music.load(nextMusic.encode()) #播放一次 pygame.mixer.music.play(1) #print(len(res)-1) if len(res) -1==num: num=0 else: num = num+1 nextMusic = nextMusic.split('\\')[1:] musicName.set('playing....'+''.join(nextMusic)) else: time.sleep(0.1) def bottonPlayClik(): '''点击播放''' buttonNext['state'] = 'normal' buttonPrev['state'] = 'normal' if pause_resume.get() == '播放': pause_resume.set('暂停') global folder if not folder: #选择目录,返回目录名 folder = tkinter.filedialog.askdirectory() if not folder: return global playing playing = True #创建线程,主线程接受用户操作 t = threading.Thread(target=play) t.start() elif pause_resume.get() == '暂停': pygame.mixer.music.pause() pause_resume.set('继续') elif pause_resume.get() == '继续': pygame.mixer.music.unpause() pause_resume.set('暂停') def bottonStopClik(): '''停止播放''' global playing playing = False pygame.mixer.music.stop() def bottonNextClik(): '''播放下一首''' global playing playing = False pygame.mixer.music.stop() global num if len(res)== num: num = 0 playing = True t = threading.Thread(target=play) t.start() def bottonPrevClik(): '''播放上一首''' global playing playing = True pygame.mixer.music.stop() global num if num == 0: num = len(res)-2 elif num == len(res) - 1: num -= 2 else: num -=2 print(num) playing = True t = threading.Thread(target = play) t.start() def closeWindow(): '''关闭窗口''' global playing playing = False time.sleep(0.3) try: pygame.mixer.music.stop() pygame.mixer.quit() except: pass root.destroy() def control_voice(value = 0.5): pygame.mixer.music.set_volume(float(value)) #关闭窗口 root.protocol('WM_DELETE_WINDOW',closeWindow) #添加按钮 buttonChoose = tkinter.Button(root,text='添加',command=buttonChooseClik) #布局 buttonChoose.place(x=50,y=10,width=50,height=20) #播放按钮 跟踪变量值的变化 pause_resume = tkinter.StringVar(root,value='播放') buttonPlay= tkinter.Button(root,textvariable=pause_resume,command=bottonPlayClik) buttonPlay.place(x=190,y=10,width=50,height=20) buttonPlay['state'] = 'disabled' #停止播放 buttonStop = tkinter.Button(root,text = '停止',command=bottonStopClik) #布局 buttonStop.place(x=120,y=10,width=50,height=20) #状态 buttonStop['state'] = 'disabled' # 下一首 buttonNext = tkinter.Button(root,text='下一首',command =bottonNextClik) buttonNext.place(x=260,y=10,width=50,height=20) buttonNext['state'] = 'disabled' #上一首 buttonPrev = tkinter.Button(root,text='上一首',command =bottonPrevClik) buttonPrev.place(x = 330,y=10,width=50,height=20) buttonPrev['state'] = 'disabled' musicName = tkinter.StringVar(root,value='暂时没有播放音乐') labelName = tkinter.Label(root,textvariable=musicName) labelName.place(x=10,y=30,width=260,height=20) #添加控件 s = tkinter.Scale(root,label='音量',from_=0,to=1,orient=tkinter.HORIZONTAL, length=240,showvalue=0,tickinterval=2,resolution=0.1,command=control_voice) s.place(x=50,y=50,width=200) #启动消息循环 root.mainloop()
运行效果:
到此这篇关于python实现音乐播放和下载小程序功能的文章就介绍到这了,更多相关python--音乐播放和下载小程序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!