演示6:python音乐下载器

  • python音乐下载器-申明
    • 原理
    • 运行效果
      • 搜索列表界面效果
      • 下载列表界面效果
    • 源码

python音乐下载器-申明

请支持正版音乐!本代码只是教学使用,不可用作商业用途,否则后果自负。

原理

使用的是爬虫原理。实际上就是对url进行请求,然后对返回的数据进行分析和提取。
本示例并只使用字符串的剪切功能对数据进行提取,并未使用正则表达。

运行效果

搜索列表界面效果

下载列表界面效果

源码

'''
窗口的创建
tkinter 窗口库
urllib.request 访问请求库
urllib.parse 链接编码库
_thread 线程库
此处需理解
'''
import tkinter,urllib.request,urllib.parse,_thread,os
tk=tkinter.Tk()#创建窗口
tk.minsize(800,500)#设置窗口的最小尺寸
tk.maxsize(800,500)#设置窗口的最大尺寸
tk.title('音乐下载器')#设置窗口上面显示的名字
'''
数据存储
此处需理解
'''
datasearchgequ=[]#用来存放查询结果中的歌曲名
datasearchgeshou=[]#用来存放查询结果中的歌手名
datasearchurl=[]#用来存放查询结果中的下载链接,实际上存的是音乐播放页面的链接
datasearchclick=[]#记录当前搜索的结果中已经点击下载的那一列,保证已经被点击下载的不能再次点击
datalist1=[]#用来记录下载列表的歌曲名
datalist2=[]#用来记录下载列表的歌手名
dataupdown1=[]#用来记录正在下载的歌曲名
dataupdown2=[]#用来记录正在下载的歌手名
urlsearch='https://baidu.9ku.com/suggestions/?kw='#搜索请求的链接-URL
tabletwofirst=0#用来记录下载列表的第一个显示的歌曲编号
'''
窗口控件-部分
此处需理解
'''
tkinter.Label(tk,text='歌曲、歌手名').place(x=10,y=8)#标签的显示与设置,用来提示搜索的内容范围该是歌曲或歌手
musicname=tkinter.Entry(tk,width=30,textvariable=tkinter.StringVar())#输入框的设置,并关联上变量-musicname,textvariable=tkinter.StringVar() 为设置输入框允许获取
musicname.place(x=110,y=10)#设置输入框的位置
'''
点击搜索按钮时触发的函数
实现搜索歌曲或歌手,并将数据存入列表中
此处需理解
'''
def clicksearch():str=urlsearch+urllib.parse.quote(musicname.get())#将请求连接-URL进行编码,防止包含中文导致访问失败str1=urllib.request.urlopen(str)#对编码后的链接进行访问data=str1.read().decode('UTF-8')#对获取的数据进行解码,以便方便对中文或其他语言进行阅读data=data[data.find('<dt>歌曲</dt>'):data.find('<dt>歌手</dt>')]#截取搜索结果中歌曲部分datasearchgequ.clear()#清空搜索结果的歌曲列表datasearchurl.clear()#清空搜索结果的下载列表datasearchgeshou.clear()#清空搜索结果的歌手列表datasearchclick.clear()#清空点击下载的记录,防止新搜索的结果无法点击下载while True:#循环,实现获取搜索结果中的所有歌曲信息datasearchgequ.append(data[data.find('songName')+10:data.find('</span>')])#截取歌曲名,并存入列表datasearchgeshou.append(data[data.find('singerName')+20:data.find('</span></a>')])#截取歌手名,并存入列表datasearchurl.append(data[data.find('href=')+6:data.find('\'><span')])#截取下载链接,并存入列表if data.find('href=')<0:#判断是否将所有歌曲获取完updatatableone()#刷新搜索结果的表格-画布break#结束循环data = data[data.find('</a></dd>') + 4:]#获取完一首歌后,将被获取的歌那部分信息删除
'''
窗口控件-部分
此处需理解
'''
musicsearch=tkinter.Button(tk,width=8,text="搜索",font=("黑体",9),command=clicksearch)#设置搜索按钮,并关联变量
musicsearch.place(x=390,y=9)#设置搜索按钮的位置
tableone=tkinter.Canvas(tk,width=780,height=450,bg='#ffffff')#设置搜索结果的表格画布,并关联变量
tableone.create_rectangle((2,2,780,450))#设置搜索结果的表格画布边框
tableone.place(x=10,y=40)#设置搜索结果的表格画布位置
tabletwo=tkinter.Canvas(tk,width=780,height=450,bg='#ffffff')#设置下载列表的表格画布,并关联变量
tabletwo.create_rectangle((2,2,780,450))#设置下载列表的表格画布边框
tabletwo.pack_forget()#设置下载列表的表格不显示
'''
搜索列表的表格绘制与刷新
此处需理解
'''
def updatatableone():tableone.create_rectangle((2,2,780,30),fill='#888888')#绘制表头的背景颜色tableone.create_rectangle((2,31,780,450),fill='#ffffff')#绘制表身的背景颜色,为了防止之前搜索的结果不会消失tableone.create_text((250,15),text='歌曲')#绘制 歌曲 文字到表头tableone.create_text((600, 15), text='歌手')#绘制 歌手 文字到表头tableone.create_text((740, 15), text='操作')#绘制 操作 文字到表头tableone.create_line((0,30,780,30))#绘制表头与表身之间的分割线tableone.create_line((500,0,500,30))#绘制 歌曲 与 歌手 之间的分割线tableone.create_line((700,0,700,30))#绘制 歌手 与 操作 之间的分割线for i in range(0,len(datasearchgequ)-1):#循环,实现绘制搜索结果的歌曲名、歌手名和操作按钮tableone.create_text((250,40+i*20),text=datasearchgequ[i])#绘制歌曲名tableone.create_text((600,40+i*20),text=datasearchgeshou[i])#绘制歌手名if i in datasearchclick:#判断是否该歌曲已经点击了下载tableone.create_rectangle((720, 33 + i * 20, 760, 48 + i * 20), fill='#ffffff')#绘制白色背景的按钮-不可再次点击下载else:tableone.create_rectangle((720,33+i*20,760,48+i*20),fill='#aaaaaa')#绘制灰色背景的按钮-可点击下载tableone.create_text((740,42+i*20),text="下载",font=('黑体',7))#绘制操作按钮中的文字tableone.create_line((0,50+i*20,780,50+i*20))#绘制每一条信息之间的分割线
updatatableone()#调用上面的函数
'''
下载列表的表格绘制与刷新
此处需理解
'''
def updatatabletwo():tabletwo.create_rectangle((2,2,780,30),fill='#888888')#绘制表头的背景颜色tabletwo.create_rectangle((2,31,780,450),fill='#ffffff')#绘制表身的背景颜色,为了防止之前下载列表的结果不会消失tabletwo.create_text((250,15),text='歌曲')#绘制 歌曲 文字到表头tabletwo.create_text((600, 15), text='歌手')#绘制 歌手 文字到表头tabletwo.create_text((740, 15), text='状态')#绘制 状态 文字到表头tabletwo.create_line((0,30,780,30))#绘制表头与表身之间的分割线tabletwo.create_line((500,0,500,30))#绘制 歌曲 与 歌手 之间的分割线tabletwo.create_line((700,0,700,30))#绘制 歌手 与 状态 之间的分割线for i in range(tabletwofirst,len(datalist1)):#循环,实现绘制下载列表的歌曲名、歌手名和操作按钮tabletwo.create_text((250,40+(i-tabletwofirst)*20),text=datalist1[i])#绘制歌曲名tabletwo.create_text((600,40+(i-tabletwofirst)*20),text=datalist2[i])#绘制歌手名if datalist1[i] in dataupdown1 and datalist2[i] in dataupdown2:#判断下载列表中的歌曲状态tabletwo.create_text((740,42+(i-tabletwofirst)*20),text="正在下载",font=('黑体',7))#绘制正在下载文字else:tabletwo.create_text((740, 42 +(i-tabletwofirst)* 20), text="下载完成", font=('黑体', 7))#绘制下载完成文字tabletwo.create_line((0,50+(i-tabletwofirst)*20,780,50+(i-tabletwofirst)*20))#绘制每一条信息之间的分割线
updatatabletwo()#调用上面的函数
'''
在搜索结果按钮中点击下载时调用的函数,必要携带的一个参数 e (当然这个可以自定义名称)
此处可做了解
'''
def onclicktableone(e):x=e.x#获取鼠标点击的位置的x坐标y=int((e.y-30)/20)#获取鼠标点击的位置的y坐标,并将该坐标装换成编号,以便得知点击的是哪首歌的下载if x>720 and x<760:#判断是否点击的下载按钮范围内,防止点击其他位置也可以下载if y not in datasearchclick:#判断该歌曲是否已经点击datasearchclick.append(y)#将该歌曲的搜索结果中的编号保存updownmusic(y)#调用下载歌曲的函数updatatableone()#刷新搜索结果的表格-画布
'''
下载列表滑动滚轮时调用得到函数,必要携带的一个参数 e (当然这个可以自定义名称)
此处可做了解
'''
def tabletwohuadong(e):global  tabletwofirst#设置该函数调用的这个变量是全局变量if e.delta>0:#判断滚轮的滚动方向tabletwofirst=tabletwofirst-1#滚轮向上滚动,将这个下载列表的第一条显示的编号减1if tabletwofirst<0:#判断这个变量数值是否小于0tabletwofirst=0#小于0,将它设置成0,防止出现错误else:tabletwofirst=tabletwofirst+1#滚轮向下滚动,将这个下载列表的第一条显示的编号加1if tabletwofirst>len(datalist1)-21:#判断这个变量数值是否超过下载的歌曲数量tabletwofirst=tabletwofirst-1#超过了,则设置成没有超过,防止出现bugupdatatabletwo()#刷新下载列表的表格-画布
'''
设置表格-画布 的鼠标监听
此处可做了解
'''
tableone.bind('<Button-1>',onclicktableone)#如果搜索结果的表格被点击了,就调用对应的函数
tabletwo.bind('<MouseWheel>',tabletwohuadong)#如果下载列表的表格中鼠标滚轮滚动了,就调用对应的函数
'''
将播放音乐的页面链接转换成音乐文件链接的函数,num为点击下载的歌曲编号
此处可做了解
'''
def updownmusic(num):datalist1.append(datasearchgequ[num])#获取点中的歌曲名,并存入列表datalist2.append(datasearchgeshou[num])#获取点中的歌手名,并存入列表a=datasearchurl[num]#获取点中的各州播放页面链接str2 = "https:"+a[:a.find('/play')]+'/down'+a[a.find('play')+4:]#将链接中的 play 单词改成 down str3 = urllib.request.urlopen(str2)#请求连接data=str3.read().decode('UTF-8')#将求情结果解码data=data[data.find('点击下载歌曲</a>')+10:]#找到音乐的真实下载链接data=data[data.find('href')+6:data.find('\" style')]#提取真实的下载链接_thread.start_new_thread(writefile,(num,data))#使用线程调用文件保存函数,使用线程的原因是防止在保存时软件无法使用
'''
文件的保存函数,num 为点击下载的歌曲编号,url 为歌曲的真实下载链接
此处可做了解
'''
def writefile(num,url):mname=datasearchgequ[num]#获取歌曲名mgeshou=datasearchgeshou[num]#获取歌手名dataupdown1.append(mname)#将该歌曲存入列表dataupdown2.append(mgeshou)#将该歌手存入列表updatatabletwo()#刷新下载列表name=datasearchgequ[num]+"-"+datasearchgeshou[num]#设置保存的歌曲文件名str5 = urllib.request.urlopen(url)#请求真实的下载链接data=str5.read()#将服务器返回的结果读取出来,无需解码a=url[url.find('com'):]#获取该歌曲的后缀,因为歌曲的后缀有mp3、wma、midi等de=os.path.join(os.path.expanduser("~"),'Desktop').replace('\\', '/', 5)#获取桌面路径fi=open(de+'/'+name+a[a.find('.'):],'wb')#设置文件保存的路径与文件名fi.write(data)#写文件fi.close()#关闭写dataupdown1.remove(mname)#将该歌曲名从正在下载的列表中删除dataupdown2.remove(mgeshou)#将该歌手名从正在下载的列表中删除updatatabletwo()#刷新下载列表的表格-画布
'''
点击所搜列表按钮和下载列表按钮时触发的函数
此处需理解
'''
def clicktablefun1():#点击搜索列表按钮时触发的函数tableone.place(x=10,y=40)#将搜索结果表格-画布 移到窗口可见位置tabletwo.place(x=10,y=800)#将下载列表表格-画布 移到窗口不可见位置
def clicktablefun2():#点击下载列表按钮时触发的函数tabletwo.place(x=10,y=40)#将下载列表表格-画布 移到窗口可见位置tableone.place(x=10,y=800)#将搜索结果表格-画布 移到窗口不可见位置
'''
窗口控件-部分
此处需理解
'''
tablesearch=tkinter.Button(tk,text='搜索列表',width=16,font=("黑体",9),command=clicktablefun1)#设置搜索列表按钮
tablesearch.place(x=500,y=9)#设置搜索列表按钮位置
tableupdown=tkinter.Button(tk,text='下载列表',width=16,font=("黑体",9),command=clicktablefun2)#设置下载列表按钮
tableupdown.place(x=653,y=9)#设置下载列表按钮位置
tk.mainloop()#使窗口显示
'''
作业:实现一个简易的计算器,能实现数字不大的运算,可参照win系统带的计算器
'''

演示6:python音乐下载器相关推荐

  1. python音乐下载器安装_python实现音乐下载器

    本文实例为大家分享了python音乐下载器的具体代码,供大家参考,具体内容如下 import requests import urllib import json from tkinter impor ...

  2. python音乐下载器交互界面设计_Python爬虫实战:制作各大音乐平台的聚合的音乐下载器...

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于Python技术,作者 派森酱 转载地址 https://blog ...

  3. python音乐下载器-支持所有主流平台-python脚本源码下载

    音乐下载器目前支持所有主流平台 下载地址

  4. python音乐下载器交互界面设计_用python实现的百度音乐下载器-python-pyqt-改进版...

    之前写过一个用python实现的百度新歌榜.热歌榜下载器的博文,实现了百度新歌.热门歌曲的爬取与下载.但那个采用的是单线程,网络状况一般的情况下,扫描前100首歌的时间大概得到40来秒.而且用Pyqt ...

  5. python音乐下载器交互界面_基于Python实现下载网易音乐代码实例

    代码如下 # 爬取网易音乐 import requests from bs4 import BeautifulSoup import urllib.request headers = {"o ...

  6. python音乐下载_python 音乐下载演示源代码

    import requests import re api = 'http://music.taihe.com/search?' header = { 'User-Agent': 'Mozilla/5 ...

  7. python如何自制音乐软件_Python开发制作酷狗和QQ音乐下载器

    开发工具 **Python版本:**3.6.4 相关模块: requests模块 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 相关文件 ...

  8. python 音乐下载演示源代码

    python 音乐下载演示源代码 import requests import reapi = 'http://music.taihe.com/search?' header = {'User-Age ...

  9. 网页mp3提取器_用Python写一个酷狗音乐下载器!

    [这就是标题] 距离上一次发推送差不多有一个月了ヽ(ー_ー)ノ 做了一个小的酷狗音乐下载器,公众号内回复704就可以收到下载链接. 长下面这样. 双击打开,会提示让输入你要搜索的歌曲. 这里输入去流浪 ...

  10. 【趣味编程】第1期。用python做简易版音乐下载器

    目录 前言 爬虫部分 完整代码 前言 那废话不多说,先了解准备工作. 1.先下载python,可以搜索python官网,到官网里面下载 2.下载外置模块 第一种方法,按win+R,输入cmd,然后输入 ...

最新文章

  1. 【Qt】ubuntu QtCreator的pro文件中使用pkg-config
  2. LA3602DNA序列
  3. 山东工商学院计算机科学与技术分数线,山东工商学院计算机科学与技术专业2016年在山东理科高考录取最低分数线...
  4. 聊聊这些天收到的简历
  5. 设计模式笔记零:设计模式简介
  6. main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出。
  7. bzoj 1625: [Usaco2007 Dec]宝石手镯(01背包)
  8. 人去楼空 暴风影音倒闭 今后将成为历史?
  9. 微信小程序支付宝小程序合并二维码
  10. Java中常见异常及异常处理方式
  11. 数据仓库之事实表和维度表
  12. mui 框架跨域_MUI框架运用中遇见问题总结
  13. Android 修改屏幕亮度
  14. mysql 三星索引_三星索引系统
  15. 幽暗镰刀:隐私安全下的收割者们
  16. nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
  17. Spring 事务管理高级应用难点剖析: 第 3 部分
  18. 经营三类医疗器械不使用计算机,第三十条经营第三类医疗器械的企业,应当具有符合医疗器械经营质量管理要求的计算机信息管理系统,保证经营的产品可追溯。计算机信息管理系统应当具有以下功能:...
  19. 【CGAL_多面体】3D多面体表面
  20. Eclipse创建java web工程

热门文章

  1. StringUtil里面的常用的方法
  2. 目前3个最受欢迎的免费、开源文件加密软件评测
  3. github开源项目大集合
  4. 图像处理OpenCV(2)——OpenCV基本操作之图像的基础操作
  5. kmz文件转为arcgis的图层(制作底图)
  6. 最新Java开发毕业论文参考文献干货满满
  7. 人脸数据集——亚洲人脸数据集
  8. 怎没使用新浪微博html5,如何使用新浪微博
  9. linux 无线投屏windows,无线投屏器投屏与大屏幕系统无关
  10. STM32程序的烧录方式 与 ISP一键下载