介紹
你是不是常常想要在各大音樂網(wǎng)站上下載音樂桃熄?但是網(wǎng)站卻逼迫你下載他們的應用先口?然而,你下載了應用瞳收,它們卻逼迫你購買vip......沒關系碉京,今天我們就來用爬蟲手段“制裁”這些網(wǎng)站!首先缎讼,就由最簡單的酷狗音樂開始爬收夸!
功能概述
讓用戶輸入要搜索的音樂名,然后把所有的音樂以及每一個音樂對應的信息展示給用戶血崭。再詢問用戶要不要下載任何音樂卧惜,如果要,則讓用戶輸入音樂對應的id號來下載(支持批量下載)夹纫。
找出思路
首先咽瓷,在獲取多首歌曲的信息和下載地址之前,我們需要知道如何獲取一首歌的下載地址舰讹。
打開www.kugou.com 茅姜,在搜索欄里輸入你想要查找的歌曲名。按下回車月匣。切換網(wǎng)頁之后钻洒,點進一首歌曲的播放頁。按下F12锄开,調出開發(fā)者工具素标。選擇network,然后點all萍悴⊥吩猓可以看到寓免,目前是沒有任何東西顯示的。因為所有的文件已經(jīng)在你打開開發(fā)者工具的時候加載完了计维,此時此刻袜香,你只需要F5刷新一下網(wǎng)頁。好了鲫惶,現(xiàn)在
你就能看到類似這樣的頁面蜈首。
?
可以看到什么js文件啊,png文件啊剑按,音頻文件啊疾就,都沒有!因為我們在調出開發(fā)者工具之前艺蝴,網(wǎng)站已經(jīng)加載完了文件,這個時候鸟废,我們只需要按下F5刷新一下網(wǎng)站猜敢。好了,所有的文件加載出來了盒延。進入到一個叫做index.php?的文件缩擂,然后進入到這個文件的地址。
?添寺、
進入這個文件地址之后胯盯,這實際上就是音樂的信息(為了方便,我在文章后面就說是信息地址)计露。我們還可以看到一個叫play_url的東西博脑,這個play_url就是音頻的mp3文件地址,可以看到票罐,這些play_url都是把/變成了/叉趣。我們不用擔心這個,因為網(wǎng)址輸入欄會自動幫我們調整成/该押,但是在用代碼實現(xiàn)爬蟲的時候疗杉,我們就需要把/變成/了。但短時間內蚕礼,我們先不用管這個烟具。讓我們進入到這個網(wǎng)址眉睹,咦箫津?這不是我們剛剛播放的音樂嗎进肯?
?
成功之后喊儡,我們就有了更大的信心和思路去爬蟲坏瞄。我們只要把每首歌曲的信息地址找出來荠察,然后用正則表達式把每首歌曲的信息和音樂地址獲取出來悍及。再一次用爬蟲獲取到音樂的二進制編碼东且,保存在本地。
那我們如何獲取每首歌的信息地址呢金度?通過拼接地址应媚!讓我們看這兩首歌的url有啥不同,你就知道了猜极。
Faded -https://wwwapi.kugou.com/yy/i...
卡路里 -https://wwwapi.kugou.com/yy/i...
可以看到除了hash值以外的東西中姜,就沒有啥區(qū)別了。也就是說我們只需要通過https://wwwapi.kugou.com/yy/i...
來拼接每首歌的信息地址就行了跟伏。那歌曲的hash要去那里找呢丢胚?回到酷狗的音樂搜索欄,隨便搜一首歌按下回車受扳⌒辏可以看到這里有好多首歌。F12-NETWORK-ALL-F5勘高,我們找出一個這樣的文件峡蟋。
?
我們進入這個網(wǎng)址,就可以看到剛剛所有歌曲的hash华望。那問題又來了蕊蝗,我們又要怎樣獲取到這個hash信息網(wǎng)址呢?這個太簡單了赖舟,只需要通過https://songsearch.kugou.com/...
拼接網(wǎng)址就行蓬戚。
這個搜索的歌曲名,我們代碼用input讓用戶輸入歌曲名就行了宾抓。那么子漩,你找到思路了嗎?
思路:拼接出hash信息網(wǎng)址洞慎,正則表達式獲取到所有歌曲的hash痛单,再拼接出單首歌曲的url。最后再一次用正則表達式獲取歌曲的play_url即可劲腿。
開始寫代碼
首先導入我們的requests和re正則表達式庫旭绒。re用來找出音樂的信息和下載地址,requests負責獲取文本和下載音樂焦人。
?
我們還要設置一些變量挥吵,這些變量在后面可是會派上大用場的。
?
我們不是要拼接出多首歌曲的信息網(wǎng)址嗎花椭?那我們就先要讓用戶輸入歌曲名忽匈。接著再拼。
?
現(xiàn)在矿辽,我們就可以用requests請求文本了丹允!由于這個網(wǎng)址是get請求的而且我們請求的是文本郭厌,所以,我們也要用方法requests.get().text方法雕蔽。
?
接著折柠,你可以試著打印一下文本。打印出來的文本和我們拼接的網(wǎng)址的內容毫無區(qū)別(我這里就不打印了批狐,等下python卡死就完了)
在這些文本里扇售,我們可以獲取到每首歌的hash值。用正則表達式查找就行了嚣艇。
?
打印一下song_hashes承冰,可以看到,他是個列表食零。所以我們要進行for遍歷困乒。
?
上段代碼中,我們進行了每個hash的拼接操作贰谣,然后我們在從單首歌曲的信息文本里找到了音樂名和作者和下載地址顶燕。由于音樂名和作者是進行ascii編碼過的,所以我們也要進行一個解碼冈爹。由于歌曲名和歌手有時候會重復打印,所以我們每一次打印音樂和作者之前欧引,都會把音樂和作者名加入到一個字典频伤。每一次打印都會進行一次是否存在字典的判斷。字典的key就由我們的timer變量的變化進行改變key名芝此。另外憋肖,我們還把每首歌的下載地址保存到了song_urls字典里。
打印了音樂信息之后婚苹,就要詢問用戶要下載那首歌了岸更。
?
按以前的做法,用requests.get().content把音樂轉換成二進制文件再進行保存膊升。在get之前怎炊,我們還需要把網(wǎng)址的亂七八糟的\/變成/。之后廓译,就能保存下來了评肆!
我們就拿一首叫做the day you went away的歌試一下
代碼實現(xiàn)效果:
?
程序的不足
酷狗每隔一段時間都會弄個滑動驗證碼,這個時候我們的程序就不能獲取到數(shù)據(jù)非区。這種情況瓜挽,用selenium就可以輕松解決。
完整代碼:
?
?
此文轉載文征绸,著作權歸作者所有久橙,如有侵權聯(lián)系小編刪除俄占!
原文地址:https://www.tuicool.com/articles/Vjyau2Y
需要源代碼或者想了解多的(點擊這里下載)