介紹
你是不是常常想要在各大音樂網站上下載音樂?但是網站卻逼迫你下載他們的應用?然而,你下載了應用,它們卻逼迫你購買vip......沒關系,今天我們就來用爬蟲手段“制裁”這些網站!首先,就由最簡單的酷狗音樂開始爬!
功能概述
讓用戶輸入要搜索的音樂名,然后把所有的音樂以及每一個音樂對應的資訊展示給用戶,再詢問用戶要不要下載任何音樂,如果要,則讓用戶輸入音樂對應的id號來下載(支持批量下載),
找出思路
首先,在獲取多首歌曲的資訊和下載地址之前,我們需要知道如何獲取一首歌的下載地址,
打開www.kugou.com ,在搜索欄里輸入你想要查找的歌曲名,按下回車,切換網頁之后,點進一首歌曲的播放頁,按下F12,調出開發者工具,選擇network,然后點all,可以看到,目前是沒有任何東西顯示的,因為所有的檔案已經在你打開開發者工具的時候加載完了,此時此刻,你只需要F5重繪一下網頁,好了,現在
你就能看到類似這樣的頁面,

?
可以看到什么js檔案啊,png檔案啊,音頻檔案啊,都沒有!因為我們在調出開發者工具之前,網站已經加載完了檔案,這個時候,我們只需要按下F5重繪一下網站,好了,所有的檔案加載出來了,進入到一個叫做index.php?的檔案,然后進入到這個檔案的地址,

?、
進入這個檔案地址之后,這實際上就是音樂的資訊(為了方便,我在文章后面就說是資訊地址),我們還可以看到一個叫play_url的東西,這個play_url就是音頻的mp3檔案地址,可以看到,這些play_url都是把/變成了/,我們不用擔心這個,因為網址輸入欄會自動幫我們調整成/,但是在用代碼實作爬蟲的時候,我們就需要把/變成/了,但短時間內,我們先不用管這個,讓我們進入到這個網址,咦?這不是我們剛剛播放的音樂嗎?

?
成功之后,我們就有了更大的信心和思路去爬蟲,我們只要把每首歌曲的資訊地址找出來,然后用正則運算式把每首歌曲的資訊和音樂地址獲取出來,再一次用爬蟲獲取到音樂的二進制編碼,保存在本地,
那我們如何獲取每首歌的資訊地址呢?通過拼接地址!讓我們看這兩首歌的url有啥不同,你就知道了,
Faded - https://wwwapi.kugou.com/yy/i...
卡路里 - https://wwwapi.kugou.com/yy/i...
可以看到除了hash值以外的東西,就沒有啥區別了,也就是說我們只需要通過 https://wwwapi.kugou.com/yy/i...
來拼接每首歌的資訊地址就行了,那歌曲的hash要去那里找呢?回到酷狗的音樂搜索欄,隨便搜一首歌按下回車,可以看到這里有好多首歌,F12-NETWORK-ALL-F5,我們找出一個這樣的檔案,

?
我們進入這個網址,就可以看到剛剛所有歌曲的hash,那問題又來了,我們又要怎樣獲取到這個hash資訊網址呢?這個太簡單了,只需要通過 https://songsearch.kugou.com/...
拼接網址就行,
這個搜索的歌曲名,我們代碼用input讓用戶輸入歌曲名就行了,那么,你找到思路了嗎?
思路:拼接出hash資訊網址,正則運算式獲取到所有歌曲的hash,再拼接出單首歌曲的url,最后再一次用正則運算式獲取歌曲的play_url即可,
開始寫代碼
首先匯入我們的requests和re正則運算式庫,re用來找出音樂的資訊和下載地址,requests負責獲取文本和下載音樂,

?
我們還要設定一些變數,這些變數在后面可是會派上大用場的,

?
我們不是要拼接出多首歌曲的資訊網址嗎?那我們就先要讓用戶輸入歌曲名,接著再拼,

?
現在,我們就可以用requests請求文本了!由于這個網址是get請求的而且我們請求的是文本,所以,我們也要用方法requests.get().text方法,
![]()
?
接著,你可以試著列印一下文本,列印出來的文本和我們拼接的網址的內容毫無區別(我這里就不列印了,等下python卡死就完了)
在這些文本里,我們可以獲取到每首歌的hash值,用正則運算式查找就行了,
![]()
?
列印一下song_hashes,可以看到,他是個串列,所以我們要進行for遍歷,

?
上段代碼中,我們進行了每個hash的拼接操作,然后我們在從單首歌曲的資訊文本里找到了音樂名和作者和下載地址,由于音樂名和作者是進行ascii編碼過的,所以我們也要進行一個解碼,由于歌曲名和歌手有時候會重復列印,所以我們每一次列印音樂和作者之前,都會把音樂和作者名加入到一個字典,每一次列印都會進行一次是否存在字典的判斷,字典的key就由我們的timer變數的變化進行改變key名,另外,我們還把每首歌的下載地址保存到了song_urls字典里,
列印了音樂資訊之后,就要詢問用戶要下載那首歌了,

?
按以前的做法,用requests.get().content把音樂轉換成二進制檔案再進行保存,在get之前,我們還需要把網址的亂七八糟的\/變成/,之后,就能保存下來了!
我們就拿一首叫做the day you went away的歌試一下
代碼實作效果:

?
程式的不足
酷狗每隔一段時間都會弄個滑動驗證碼,這個時候我們的程式就不能獲取到資料,這種情況,用selenium就可以輕松解決,
完整代碼:

?

?
此文轉載文,著作權歸作者所有,如有侵權聯系小編洗掉!
原文地址:https://www.tuicool.com/articles/Vjyau2Y
需要源代碼或者想了解多的(點擊這里下載)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/140199.html
標籤:其他
