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

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

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

python 查看qq音乐歌单 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 查看qq音乐歌单 python音乐播放_控件_02

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

python 查看qq音乐歌单 python音乐播放_音乐播放_03

简易音乐播放器:
这个控件在界面上仍然使用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 = Truet = 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 查看qq音乐歌单 python音乐播放_文本框_04