python实战:不到50行的代码让你下载酷狗音乐任意版本的VIP歌曲

**1、**此处以下载《周杰伦—等你下课》为目标歌曲,首先我们来到酷狗音乐网页版:https://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord=等你下课 ,搜索到目标歌曲有许多版本。点击第一首来到播放页面,如下图操作打开chrome的开发者工具后切换到Network,重新刷新页面,找到请求到这首歌曲播放源的URL。
python实战:不到50行的代码让你下载酷狗音乐任意版本的VIP歌曲_第1张图片
从上面可以看到这首歌曲播放源的URL为play_url的值,切换到Headers中可以看到请求的URL为:https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery19105183192177131513_1551168792939&hash=718567D263C17BB3945B596CDD887C27&album_id=8308163&_=1551168792940 ,为了得到该URL的请求规律,我们将上面URL的某些参数进行删除,看能否请求到正常的数据,经过测试发现其可以简化为:https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash=718567D263C17BB3945B596CDD887C27 ,可见我们只需得到歌曲对应的hash即可。

**2、**返回到搜索页面,打开chrome的开发者工具后切换到Network,重新刷新页面,找到请求到这些歌曲的URL,如下图:
python实战:不到50行的代码让你下载酷狗音乐任意版本的VIP歌曲_第2张图片
从上图的Preview中可以看到有我们所需要的hash值,切换到Headers可以看到请求URL为:https://songsearch.kugou.com/song_search_v2?callback=jQuery112406843776112652964_1551169279967&keyword=等你下课&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1551169279969 ,为了得到该URL的请求规律,同理我们将上面URL的某些参数进行删除,看能否请求到正常的数据,经过测试发现其可以简化为:https://songsearch.kugou.com/song_search_v2?keyword=等你下课&platform=WebFilter ,至此我们可以敲代码了,以下是全部代码。

from requests_html import HTMLSession
import urllib.request,os,json
from urllib.parse import quote
class KuGou():
    def __init__(self):
        self.get_music_url='https://songsearch.kugou.com/song_search_v2?keyword={}&platform=WebFilter'
        self.get_song_url='https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash={}'
        if not os.path.exists("d:/music"):
            os.mkdir('d:/music')

    def parse_url(self,url):
        session = HTMLSession()
        response = session.get(url)
        return response.content.decode()

    def get_music_list(self,keyword):
        music_dirt=json.loads(self.parse_url(self.get_music_url.format(quote(keyword))))
        music_list=music_dirt['data']['lists']
        song_list=[]
        for music in music_list:
            song_name=music['FileName'].replace("<\\/em>", "").replace("", "")
            song_list.append({'hash':music['FileHash'], 'song_name':song_name})
            print(str(len(song_list))+'---'+song_name)
        return song_list

    def download(self,song):
        song_dirt=json.loads(self.parse_url(self.get_song_url.format(song['hash'])))
        download_url=song_dirt['data']['play_url']
        if download_url:
            try:
                # 根据音乐url地址,用urllib.request.retrieve直接将远程数据下载到本地
                urllib.request.urlretrieve(download_url, 'd:/music/' + song['song_name'] + '.mp3')
                print('Successfully Download:' + song['song_name'] + '.mp3')
            except:
                print('Download wrong~')

if __name__ == '__main__':
    kugou=KuGou()
    while True:
	    keyword=input('请输入要下载的歌曲名:')
	    print('-----------歌曲《'+keyword+'》的版本列表------------')
	    music_list=kugou.get_music_list(keyword)
	    song_num=input('请输入要下载的歌曲序号:')
	    kugou.download(music_list[int(song_num)-1])

程序运行结果:
python实战:不到50行的代码让你下载酷狗音乐任意版本的VIP歌曲_第3张图片

你可能感兴趣的:(python)