應用爬蟲下載酷狗音樂
首先我們需要進入到這個界面
想要爬取這些歌曲鏈接,然而這個是一個假的網站,雖然單機右鍵進行檢查能看到這些歌曲的鏈接,可進行爬取時,卻爬取不到這些信息。
這個時候我們就應該換一種思路了,點擊Network下的JS,如果沒有什么信息,可按F5進行刷新。之后我們點擊如下:
然后我們在點擊Preview,可發現:
lists下面有我們需要的信息,可以通過這些信息重新組成一個網址:
https://www.kugou.com/song/#hash=(FileHash)&album_id=(AlbumID)
FileHash和AlbumID的值能在lists下面找到。
完成這個操作,點擊進入這個組合的網址,就可以進入到這個界面了。
再單擊右鍵進行檢查,發現這里有這首歌的下載鏈接
這個時候再進行爬取,發現其他信息都有,唯獨沒有這個下載鏈接,點擊Network下面的JS,刷新發現有一個JS文件上有這個鏈接
然后我們只需將這個網址進行組合即可https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery19104844152583738923_1580266512987&hash=473EE408104AEB6FB21A3518B6B0F0FC&album_id=596052&dfid=2SSV0x4LWcsx0iylej1F6w7P&mid=44328d3dc4bfce21cf2b95cf9e76b968&platid=4&_=1580266512988
通過多次組合發現,這個網址只需hash、album_id、dfid、mid和platid就可以得到所需要的信息了,且dfif、mid和platid的值是不變的,而前面的兩個變量的值在我說的第四幅圖中可以找到。
完成這個之后,點擊進入,就可以得到想要的信息了。、
代碼代碼如下:
from urllib.request import urlopen import urllib.parse import json # 導入json模塊,為了使下載的js文件更容易得到所需的信息 import time import sys import os # 導入sys和time模塊是為了顯示進度條 def Time_1(): # 進度條函數 for i in range(1,51): sys.stdout.write('\r') sys.stdout.write('{0}% |{1}'.format(int(i%51)*2,int(i%51)*'■')) sys.stdout.flush() time.sleep(0.125) sys.stdout.write('\n') def KuGou_music(): keyword=urllib.parse.urlencode({'keyword':input('請輸入歌名:')}) keyword=keyword[keyword.find('=')+1:] url='https://songsearch.kugou.com/song_search_v2?callback=jQuery1124042761514747027074_1580194546707&keyword='+keyword+'&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1580194546709' content=urlopen(url=url) content=content.read().decode('utf-8') str_1=content[content.find('(')+1:-2] str_2=json.loads(str_1) Music_Hash={} Music_id={} for dict_1 in str_2['data']['lists']: Music_Hash[dict_1['FileName']]=dict_1['FileHash'] Music_id[dict_1['FileName']]=dict_1['AlbumID'] # print(dict_1) list_music_1=[music for music in Music_Hash] # 匹配到的所有歌曲名 列表 list_music=[music for music in Music_Hash] for i in range(len(list_music)): if '- <em>' in list_music[i]: list_music[i]=list_music[i].replace('- <em>','-') if '</em>' in list_music[i]: list_music[i]=list_music[i].replace('</em>','') if '<em>' in list_music[i]: list_music[i]=list_music[i].replace('<em>','') # 使歌曲名稱更加美觀 # 如: < em > 戰狼 < / em > - 斷情筆 經過這個處理之后 戰狼 - 斷情筆 for i in range(len(list_music)): print("{}-:{}".format(i+1,list_music[i])) music_id_1=int(input('請輸入你想下載的歌曲序號:')) # 'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash=E77548A33D7AF84F727C32A786C107D0&album_id=542163&dfid=2SSV0x4LWcsx0iylej1F6w7P&mid=44328d3dc4bfce21cf2b95cf9e76b968&platid=4' # 一個加載js文件的標椎式樣網址 url='https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash='+Music_Hash[list_music_1[music_id_1-1]]+'&album_id='+Music_id[list_music_1[music_id_1-1]]+'&dfid=2SSV0x4LWcsx0iylej1F6w7P&mid=44328d3dc4bfce21cf2b95cf9e76b968&platid=4' js_content=urlopen(url=url) str_3=js_content.read().decode('utf-8') #所加載的js中的內容 dict_2=json.loads(str_3) # 將這個js格式轉換成為字典格式 try: music_href=dict_2['data']['play_backup_url'] #下載的歌曲網址 music_content=urlopen(url=music_href).read() try: os.mkdir('D:\酷狗音樂下載') except Exception as e: print(e,'但不要緊,程序仍然執行') finally: music_path='D:\酷狗音樂下載\\'+list_music[music_id_1-1]+'.mp3' # 歌曲下載路徑 with open(music_path,'wb') as f: print('正在下載當中...') f.write(music_content) Time_1() print('{}.mp3下載成功!'.format(list_music[music_id_1-1])) except: print('對不起,沒有該歌曲的版權!') if __name__=='__main__': print('------聲明:本小程序僅供娛樂,切莫用於商業活動,一經發現,概不負責!-------') KuGou_music()
注意:代碼中的那個下載路徑必須是已經存在了的,否則會報錯。
一些歌曲是下載不了的,如 你的名字 ,這個是付費歌曲,這個程序只能下載 酷狗音樂在網頁上能播放的。
注意:這個代碼僅供娛樂和學習,切莫用於商業目的,一經發現,概不負責!