python爬取付费音乐包_python实现音乐播放和下载小程序功能

(本篇部分代码综合整理自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–音乐播放和下载小程序内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值