演示6:python音乐下载器
生活随笔
收集整理的這篇文章主要介紹了
演示6:python音乐下载器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
演示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音乐下载器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue之引用DOM的ref属性
- 下一篇: java python 运行 内存_Py