目錄
搭建視窗
爬蟲實作下載下傳音樂
歌曲搜尋
下載下傳歌曲
綁定指令
生成可執行檔案
感想
在前一篇文章,正好總結過了Tkinter以及canvas畫布的使用,學以緻用,用Tkinter來建立一個視窗,在此基礎上實作音樂的下載下傳邏輯,并在最後打包成exe檔案。
最近剛好學了Tkinter和Canvas畫布,順便總結了一下,想着那它來做點什麼練練手,我平常挺喜歡聽音樂,特别是在大型評論APP平台——網易雲音樂(滑稽),歌不僅推薦的好,而且評論“個個說話又好聽”。是以想着自己做一個音樂下載下傳器,試一試。結果感覺還可以,起碼做出來了,就是界面糙了點,功能簡陋點,除了能跑,也就沒啥優點了。
廢話不多說,上一波效果圖。

先把源碼分享出來吧,放在了我的gitee和CSDN我的下載下傳中,需要的可自取。下面我分享一下我的代碼思路。
搭建視窗
搭建視窗就像畫畫一樣,你需要哪些,可以使用tkinter元件像畫畫一樣把它布局到canvas上。把需要的布局想好,設定好,再布局到想要的位置上。
from tkinter import *
# 搭建界面
#建立界面 畫闆視窗
window = Tk()
#建立标題
window.title('網易雲音樂')
# 設定視窗大小和位置
window.geometry('560x450+400+200')
# 标簽控件,實作文本和字型及大小
label = Label(window,text='請輸入下載下傳的歌曲:',font=('華文行楷',20))
# 标簽定位
label.grid()
# 輸入框
entry = Entry(window,font=('隸書',20))
# 定位
entry.grid(row=0,column=1)
# 清單框
text = Listbox(window,font=('楷書',16),width=50,height=15)
# 定位 columnspan元件橫跨的列數
text.grid(row=1,columnspan=2)
# 點選開始下載下傳按鈕
button_start = Button(window,text='開始下載下傳',font=('楷書',15),command='')
# 定位,按鈕‘粘着’在西側(左側)
button_start.grid(row=2,column=0,sticky=W)
# 點選退出按鈕
button_quit = Button(window,text='退出程式',font=('楷書',15),command='')
# 定位
button_quit.grid(row=2,column=1,sticky=E)
# 顯示界面
window.mainloop()
說明:
mainloop實作視窗的顯示,否則視窗無法顯示;
geometry函數參數的含義:('長X寬'),視窗預設出現在螢幕的左上角,修改位置,('長X寬+距左邊框距離+距上邊框距離');
在label設定标簽和entry設定文本框中,定義部分就像畫畫時我們想好了要畫多大的、畫在哪,但還沒有落筆去畫,grid()函數就像是是我們下筆的動作一樣,把我們想的在視窗上顯示出來;
grid()的參數就像把一張畫紙以自适應表格的形式去劃分,我要把布局放在哪裡就用行和列的形式去擺放;
視窗中核心的部分在于按鈕邏輯的設計,即conmand指令所要執行的函數。
運作效果:
爬蟲實作下載下傳音樂
-
歌曲搜尋
利用爬蟲實作下載下傳音樂的功能。打開網易雲音樂網頁,任意搜尋歌曲,F12打開網頁源代碼,可以找到每首歌獨特的歌曲id,就像每個人的身份證一樣,是獨一無二的,可以定位到每一首歌。
網易雲音樂提供了歌曲的外連結口(https://music.163.com/song/media/outer/url?id={}.mp3),于是可以從網頁中爬取到歌曲的id,寫入外連結口中,進行歌曲的下載下傳。問題就變成了一個爬蟲問題,根據歌曲名爬取每個歌曲的id。
但在實際開發過程中,根據搜尋想要的歌,但在網易雲網頁的源代碼中卻找不到歌名,此時發現這個網頁是一個動态網頁(靜态頁面和動态頁面的差別),資訊都是動态加載出來的,那麼爬蟲就不能用request爬取靜态頁面那套了,python中對于動态頁面爬蟲也有對應的庫‘selenium’,其好比一個網頁浏覽的機器人,僞造一個類似的界面。
from selenium import webdriver
def get_music_name():
url='https://music.163.com/#/search/m/?s={}&type=1'.format('雅俗共賞')
driver=webdriver.Firefox()
driver.get(url)
get_music_name()
selenium會自動打開火狐浏覽器,打開網頁找到歌曲“雅俗共賞”。
# 爬取音樂(動态頁面)
# 搜尋函數
def get_music_name():
# 擷取歌曲名稱
name=entry.get()
url='https://music.163.com/#/search/m/?s={}&type=1'.format(name)
# 隐藏浏覽器
option=webdriver.FirefoxOptions()
option.add_argument('--headless')
driver=webdriver.Firefox(firefox_options=option)
# 搜尋歌曲頁面
# driver = webdriver.Firefox()
driver.get(url)
# 根據id查詢到标簽
driver.switch_to.frame('g_iframe')
# 擷取歌曲id
res = driver.find_element_by_id('m-search')
music_url = res.find_element_by_xpath('.//div[@class="item f-cb h-flag "]/div[2]//a').get_attribute("href")
print(music_url)
# 提取id
music_id = music_url.split('=')[-1]
# print(music_id)
# 提取歌名
music_name=res.find_element_by_xpath('.//div[@class="item f-cb h-flag "]/div[2]//b').get_attribute("title")
# print(music_name)
# 構造字典儲存歌曲資訊用于下載下傳
item={}
item['music_id']=music_id
item['music_name']=music_name
# 退出浏覽器
driver.quit()
說明:
webdriver.Chrome()為啟動谷歌浏覽器;webdriver.Firefox()為啟動火狐浏覽器
在driver中自動內建了一些爬蟲的工具,不需要再使用正規表達式或者BeautifulSoup等;driver.switch_to.frame()查詢指定id=‘g_iframe’下的标簽,如上圖黃色标記,通過id=‘m-search’找到下方的節點,免于一層層查找的麻煩,通過xpath文法查找,從‘item f-cb h-flag ’再向下找兩層div中找到‘a’标簽,進而提取出id;提取歌名也是同樣的道理;
-
下載下傳歌曲
def music_load(item):
music_id=item['music_id']
music_name=item['music_name']
# id填充到下載下傳url中
music_download_url='https://music.163.com/song/media/outer/url?id={}.mp3'.format(music_id)
# 建立儲存檔案夾
os.makedirs('music_netease',exist_ok=True)
path='music_netease\{}.mp3'.format(music_name)
# 顯示資料到文本框
text.insert(END,'歌曲:{},正在下載下傳...'.format(music_name))
# 文本滾動
text.see(END)
# 更新
text.update()
# 下載下傳
urlretrieve(music_download_url,path)
# 下載下傳完成,顯示完成
text.insert(END,'下載下傳完畢:{},請試聽!'.format(music_name))
text.see(END)
text.update()
說明:
将搜尋函數查找到的歌曲id接入下載下傳連結;
makedirs中exist_ok參數:如果已存在同名檔案夾,不會再建立,也不會報錯
使用urlretrieve方法可以根據連結直接将下載下傳檔案儲存到路徑中,不需要再次請求打開檔案寫入;
-
綁定指令
button_start = Button(window,text='開始下載下傳',font=('楷書',15),command='get_music_name')
button_quit = Button(window,text='退出程式',font=('楷書',15),command='window.quit')
将爬蟲下載下傳的函數綁定到按鈕上,大功告成!
生成可執行檔案
打開Pycharm下方的Terminal終端,輸入pyinstaller -F 檔案名.py(需要提前安裝pyinstaller庫,并且在py檔案所在目錄下執行),即可打包成exe檔案。
PS:隻支援下載下傳用戶端免費下載下傳的音樂,無法下載下傳付費音樂和VIP音樂
感想
學無止境,你有爬蟲技術,别人就有防止你爬蟲的技術,停滞不前就是退步!
爬蟲也是學習不久,可能存在一些問題或者改進優化的地方,還請各位大佬不吝賜教,一起進步,嘻嘻。