python实现音乐播放和下载小程序功能


Posted in Python onApril 26, 2020

(本篇部分代码综合整理自B站,B站有手把手说明的教程)

1.网易云非付费内容爬取器(声明:由于技术十分简单,未到触犯软件使用规则的程度)驱动Edge浏览器(自己写驱动会更高端)进入界面,爬取列表中第一个音频地址并存入相应文件夹中。这里有一个最简单的爬虫程序和一个最简单的tkinter GUI编程。

注意,要先在网易云音乐网页中将第一个对应音频链接的位置定位:

python实现音乐播放和下载小程序功能

对于以上定位可通过如下方式获得(定位器):

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()

运行效果

python实现音乐播放和下载小程序功能

发现music_netease文件夹中相关文件赫然在列。

python实现音乐播放和下载小程序功能

简易音乐播放器:
这个控件在界面上仍然使用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实现音乐播放和下载小程序功能的文章就介绍到这了,更多相关python--音乐播放和下载小程序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Windows中安装使用Virtualenv来创建独立Python环境
May 31 Python
python开发环境PyScripter中文乱码问题解决方案
Sep 11 Python
python subprocess 杀掉全部派生的子进程方法
Jan 16 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
Apr 20 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
Numpy中的mask的使用
Jul 21 Python
pyqt5 实现在别的窗口弹出进度条
Jun 18 Python
python银行系统实现源码
Oct 25 Python
Python 中判断列表是否为空的方法
Nov 24 Python
Python3 webservice接口测试代码详解
Jun 23 Python
Python 解析简单的XML数据
Jul 24 Python
python实现在列表中查找某个元素的下标示例
Nov 16 Python
使用Python内置模块与函数进行不同进制的数的转换
Apr 26 #Python
Python接口开发实现步骤详解
Apr 26 #Python
使用tensorflow框架在Colab上跑通猫狗识别代码
Apr 26 #Python
Python request使用方法及问题总结
Apr 26 #Python
Python基于paramunittest模块实现excl参数化
Apr 26 #Python
在python里创建一个任务(Task)实例
Apr 25 #Python
python 实现任务管理清单案例
Apr 25 #Python
You might like
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
PHP多进程简单实例小结
2019/11/09 PHP
JS去掉第一个字符和最后一个字符的实现代码
2014/02/20 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
使用window.prompt()实现弹出用户输入的对话框
2015/04/13 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
2016/05/12 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
Pyhton中防止SQL注入的方法
2015/02/05 Python
Python生成器(Generator)详解
2015/04/13 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
html5 canvas 画图教程案例分析
2012/11/23 HTML / CSS
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
Linux的主要特性
2014/10/06 面试题
介绍下java.util.Arrays类
2012/10/16 面试题
火车来了教学反思
2014/02/11 职场文书
酒店值班经理的工作职责范本
2014/02/18 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
奖学金感谢信
2015/01/21 职场文书
廉洁自律个人总结
2015/02/14 职场文书
防溺水主题班会教案
2015/08/12 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
电脑开机弹出documents文件夹怎么回事?弹出documents文件夹解决方法
2022/04/08 数码科技
python中filter,map,reduce的作用
2022/06/10 Python