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 相关文章推荐
python正则匹配查询港澳通行证办理进度示例分享
Dec 27 Python
浅析Python中的join()方法的使用
May 19 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
Oct 22 Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 Python
python内存管理机制原理详解
Aug 12 Python
python数据类型之间怎么转换技巧分享
Aug 20 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
python进程间通信Queue工作过程详解
Nov 01 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
详解Scrapy Redis入门实战
Nov 18 Python
Python实现文字pdf转换图片pdf效果
Apr 03 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
使用session判断用户登录用户权限(超简单)
2013/06/08 PHP
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
javascript 学习之旅 (1)
2009/02/05 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
JavaScript Math.round() 方法
2015/12/18 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
JS实现倒计时(天数、时、分、秒)
2016/11/16 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
Vue的百度地图插件尝试使用
2017/09/06 Javascript
vue双花括号的使用方法 附练习题
2017/11/07 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
2019/01/08 Javascript
Javascript原生ajax请求代码实例
2020/02/20 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
python 获取当天每个准点时间戳的实例
2018/05/22 Python
Python装饰器语法糖
2019/01/02 Python
75条笑死人的知乎神回复,用60行代码就爬完了
2019/05/06 Python
华为2019校招笔试题之处理字符串(python版)
2019/06/25 Python
Python高阶函数、常用内置函数用法实例分析
2019/12/26 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
建筑公司文秘岗位职责
2013/11/29 职场文书
英语教育专业自荐信
2014/05/29 职场文书
项目投资合作意向书
2014/07/29 职场文书
基层党建工作简报
2015/07/21 职场文书
对PyTorch中inplace字段的全面理解
2021/05/22 Python
无线电通信名词解释
2022/02/18 无线电
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python
SqlServer常用函数及时间处理小结
2023/05/08 SQL Server