(本篇部分代码综合整理自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驱动访问网易云音乐主页,通过 运行效果 发现music_netease文件夹中相关文件赫然在列。 简易音乐播放器: 运行效果:'http://music.163.com/song/media/outer/url"htmlcode">
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"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()
这个控件在界面上仍然使用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()
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]