引子:記得高中的時(shí)候,一位同桌是五月天的超級(jí)粉絲,一下課就大聲哼唱(絲毫不在意旁邊人的感受,哈哈),剛開始還挺煩的(我下課要趕緊補(bǔ)覺),后來也就慢慢的習(xí)慣了,以至于五月天的歌曲成為了記憶中青澀而又躁動(dòng)的青春的觸發(fā)器。剛好最近在學(xué)習(xí)Python3網(wǎng)絡(luò)爬蟲,如是想把網(wǎng)易云音樂上面的關(guān)于五月天的歌曲及歌詞給下載下來,下面將詳細(xì)的介紹操作過程。
1. 總體思路分析
在行動(dòng)之前,首先想象一下我們要將目標(biāo)歌曲及歌詞下載下來,需要經(jīng)過哪些步驟?

按照上面的大體思路,我們可以自定義函數(shù)模擬爬取過程。
2. 具體爬取步驟
2.1 獲取網(wǎng)頁


我們使用的是requests庫來獲取網(wǎng)頁,其中請(qǐng)求頭head中的參數(shù)信息可以從網(wǎng)站上粘貼過來:

可以看到這里面的請(qǐng)求頭參數(shù)中并沒有 ‘Host’ 的參數(shù)信息,因此在上面的自定義函數(shù)中可以不用這個(gè)參數(shù)。
2.2 網(wǎng)頁解析
接下來我們就可以用beautifulsoup來解析網(wǎng)頁了:

上面函數(shù)中find中要查找的內(nèi)容需要我們?nèi)庋蹚木W(wǎng)站源代碼中搜尋:


從上面的觀察中我們可以發(fā)現(xiàn),我們需要獲取的歌曲信息都在源碼屬性 class='f-hide'的<ul>標(biāo)簽中,而后面的 herf='/song?id=55331024' 中的 id 信息則是每一首曲子的地址。根據(jù)這些信息再去理解我們上面寫的函數(shù)就比較清晰了。
2.3 信息提取
按照上面的寫法,獲取的信息里面還有很多我們不想要的雜質(zhì),因此為了獲取更純凈的歌詞信息,我們找到了網(wǎng)易云音樂的API,只要把歌曲的ID放在API鏈接上便可以獲取歌詞了。在API中歌詞信息是以json格式加載的,所以需要利用json將其進(jìn)行序列化解析出來,并配合正則表達(dá)式進(jìn)行清洗歌詞。具體代碼如下:

這樣的話我們就能獲取每一首音樂的歌詞了。
2.4 歌詞存儲(chǔ)
接下來我們將剛剛提取的歌曲歌詞存儲(chǔ)在指定的文件夾中:

這一步比較簡單,需要強(qiáng)調(diào)的是文件的寫入格式,‘a(chǎn)’表示的是以追加方式打開一個(gè)文件。如果該文件已存在,文件指針將會(huì)放在文件結(jié)尾。也就是說,新的內(nèi)容將會(huì)被寫入到已有內(nèi)容之后。如果該文件不存在,則創(chuàng)建新文件來寫入。
2.5 下載并存儲(chǔ)歌曲
除了下載歌詞外,我們還有一個(gè)任務(wù)就是要將曲子給下載下來:

這里面我們用到的是 urllib.request 版塊中的urlretrieve函數(shù),該函數(shù)的作用是將遠(yuǎn)程數(shù)據(jù)下載到本地。
2.6 主函數(shù)
以上,我們將主要的函數(shù)都完成了,接下來的工作便是將這些函數(shù)進(jìn)行組合已達(dá)到我們爬取的目的。

在主函數(shù)中,我們用到了異常處理機(jī)制,因?yàn)槲覀冊谂廊〉倪^程中發(fā)現(xiàn)有些歌曲的命名方式的問題導(dǎo)致存儲(chǔ)失敗,從而造成程序出現(xiàn)bug,這里截取的 FileNotFoundError 異常就是主要避免這種問題。
2.7 運(yùn)行結(jié)果
運(yùn)行以上所有的函數(shù),如果正常的話將會(huì)出現(xiàn)如下的結(jié)果:

其中我們需要輸入歌手的 ID,這個(gè)可以在網(wǎng)易云音樂上查找出來。
然后,我們可以在本地的文件中找到兩個(gè)文件夾 "lyrics1"和"songs1",其中前者存放的是歌詞,后者存放的是曲子。我們分別打開看看:


接下來,我們可以好好的享受一下我們的勞動(dòng)成果了。
結(jié)語:越來越覺得通過這種輸出方式來學(xué)習(xí)是一種非常有效的方法,然后最重要的是能體會(huì)到快樂。希望本文能夠幫助到需要的人...