效果展示
1,打包exe文件,window直接可以运行
2,输入歌曲名字可以直接下载
3,下载后的歌曲保存在netease.exe文件所在的同一个文件夹中,music_netease文件夹是程序自动创建
直接上代码
from tkinter import *
from urllib.request import urlretrieve
from selenium import webdriver
import os
headers = {
'Host': 'music.163.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'
}
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)
# 创建一个文件夹
# exist_ok=True 如果文件存在不会报错 不会继续创建
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()
# 搜索歌曲名字
def get_music_name():
# 获取输入框输入的歌曲名字
name = entry.get()
# 拼接url
url = 'https://music.163.com/#/search/m/?s={}&type=1'.format(name)
print(url)
# 搜索歌曲网页
diver = webdriver.Chrome()
diver.get(url=url)
diver.switch_to.frame('g_iframe')
# response = diver.find_element_by_xpath('./following-sibling::div//a/@href')
# 获取歌曲id
req = diver.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")
print(a_id)
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)
# 构建字典 id name
item = {}
item['song_id'] = song_id
item['song_name'] = song_name
print(item)
diver.quit() # 退出浏览器
# diver.close() # 退出当前页面
# 下载歌曲
song_load(item)
# 搭建界面
# 创建界面
root = Tk()
# 添加标题
root.title('网易云音乐')
# 设置窗口大小 x 小写x连,不能用乘号 后面两位是x,y坐标,固定初始位置
root.geometry('560x450+400+200')
# 标签控件
label = Label(root, text='请输入下载的歌曲:', font=('华文行楷', 20))
# 标签定位 grid 网格式定位
label.grid() # 默认 row=0,column=0
# 输入框
entry = Entry(root, font=('隶书', 20))
# 定位 第0行 第1列
entry.grid(row=0, column=1)
# 列表框
text = Listbox(root, font=('楷书', 16), width=50, heigh=15)
# 定位 columnspan 组件横跨的列数
text.grid(row=1, columnspan=2)
# 点击按钮
button = Button(root, text='开始下载', font=('隶书', 15), command=get_music_name)
# 定位 sticky 对齐方式 W E N S 东南西北
button.grid(row=2, column=0, sticky=W)
# command 点击触发方法
button1 = Button(root, text='退出程序', font=('隶书', 15), command=root.quit)
# 定位 sticky 对齐方式 W E N S 东南西北
button1.grid(row=2, column=1, sticky=E)
# 显示界面
root.mainloop()
程序运行环境
1,需要python3.0以上的python环境
2,需要python包模块
from tkinter import *
from urllib.request import urlretrieve
from selenium import webdriver
# selenium需要手动安装,前两个模块python3.0版本以上自动
3,安装chromedriver.exe浏览器驱动插件或者phantomjs(推荐使用chromdriver)
(1)chromedriver.exe需要和浏览器对应的版本才能有效
(2)推荐使用Chrome浏览器
(3)将Chromedriver.exe复制到python解释器的scripts文件夹中,重启代码编辑器
(4)运行下列代码检验chromdriver.exe是否安装成功
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
代码运行能够自动打开百度页面,表示插件chromedriver.exe安装成功
4,以上三步完成,可以运行代码下载歌曲,付费或者不付费的都可以下载,
但是试听都需要版权的歌曲无法下载!
程序打包
1,安装pyinstaller
pip install pyinstaller (如果安装失败,用管理员权限安装)
2,打包程序
(1)下载ico图片,保存到和代码同一文件夹
(2)cd 到代码所在文件夹
(3)打包 pyinstaller -F -w -i F:\code\image.ico demo.py
-F 表示打包(F 大写)
-w 取消控制台显示(w 小写)
-i 有错误也继续执行(i 小写)
ico图片路径(绝对路径)
最后是代码名称
-
打包其他详细教程请查看我的博客 “python_GUI教你撩妹,打包exe文件详解”
-
打包程序命令
-
打包完成效果
-
Windows可执行的exe文件在dist文件夹中
不足之处:1,目前只能下载一般品质的歌曲,2,代码中使用了chroemdriver.exe驱动检测插件,这种打包方式还没有完全脱离python环境,等后续改进代码,再发完全改进版
改进版(打包后exe文件,通过js解密获取歌曲ID替换掉插件,增加下载地址路径选择,以及歌曲选择):python网易云音乐下载,可选择歌曲,下载路径