**1、**此处以下载《周杰伦—等你下课》为目标歌曲,首先我们来到酷狗音乐网页版:https://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord=等你下课 ,搜索到目标歌曲有许多版本。点击第一首来到播放页面,如下图操作打开chrome的开发者工具后切换到Network,重新刷新页面,找到请求到这首歌曲播放源的URL。
从上面可以看到这首歌曲播放源的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,如下图:
从上图的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])