天天看點

【Python爬蟲】爬取網易雲音樂,打造音樂下載下傳器搭建視窗 爬蟲實作下載下傳音樂 生成可執行檔案 感想

目錄

搭建視窗

 爬蟲實作下載下傳音樂

歌曲搜尋

下載下傳歌曲

 綁定指令

 生成可執行檔案

 感想

在前一篇文章,正好總結過了Tkinter以及canvas畫布的使用,學以緻用,用Tkinter來建立一個視窗,在此基礎上實作音樂的下載下傳邏輯,并在最後打包成exe檔案。

 最近剛好學了Tkinter和Canvas畫布,順便總結了一下,想着那它來做點什麼練練手,我平常挺喜歡聽音樂,特别是在大型評論APP平台——網易雲音樂(滑稽),歌不僅推薦的好,而且評論“個個說話又好聽”。是以想着自己做一個音樂下載下傳器,試一試。結果感覺還可以,起碼做出來了,就是界面糙了點,功能簡陋點,除了能跑,也就沒啥優點了。

廢話不多說,上一波效果圖。

【Python爬蟲】爬取網易雲音樂,打造音樂下載下傳器搭建視窗 爬蟲實作下載下傳音樂 生成可執行檔案 感想

 先把源碼分享出來吧,放在了我的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指令所要執行的函數。

運作效果:

【Python爬蟲】爬取網易雲音樂,打造音樂下載下傳器搭建視窗 爬蟲實作下載下傳音樂 生成可執行檔案 感想

 爬蟲實作下載下傳音樂

  • 歌曲搜尋

利用爬蟲實作下載下傳音樂的功能。打開網易雲音樂網頁,任意搜尋歌曲,F12打開網頁源代碼,可以找到每首歌獨特的歌曲id,就像每個人的身份證一樣,是獨一無二的,可以定位到每一首歌。

【Python爬蟲】爬取網易雲音樂,打造音樂下載下傳器搭建視窗 爬蟲實作下載下傳音樂 生成可執行檔案 感想
【Python爬蟲】爬取網易雲音樂,打造音樂下載下傳器搭建視窗 爬蟲實作下載下傳音樂 生成可執行檔案 感想

 網易雲音樂提供了歌曲的外連結口(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會自動打開火狐浏覽器,打開網頁找到歌曲“雅俗共賞”。

【Python爬蟲】爬取網易雲音樂,打造音樂下載下傳器搭建視窗 爬蟲實作下載下傳音樂 生成可執行檔案 感想
# 爬取音樂(動态頁面)
# 搜尋函數
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()
           
【Python爬蟲】爬取網易雲音樂,打造音樂下載下傳器搭建視窗 爬蟲實作下載下傳音樂 生成可執行檔案 感想

說明:

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檔案。
【Python爬蟲】爬取網易雲音樂,打造音樂下載下傳器搭建視窗 爬蟲實作下載下傳音樂 生成可執行檔案 感想

PS:隻支援下載下傳用戶端免費下載下傳的音樂,無法下載下傳付費音樂和VIP音樂

 感想

學無止境,你有爬蟲技術,别人就有防止你爬蟲的技術,停滞不前就是退步!

爬蟲也是學習不久,可能存在一些問題或者改進優化的地方,還請各位大佬不吝賜教,一起進步,嘻嘻。