今天和大家分享一下,如何秒下载kugou音乐,无需开网页,无需下任何软件。
获取方法:
公众号回复【音乐下载】即可。得到的文件包括:
exe文件,人人都可以直接使用的,秒下载kugou音乐。
py文件,程序员可以直接使用,随意拿去二次开发,结合图形化界面,达到极致用户体验。
文末附源代码,以及项目思路。
使用方法:
按照提示输入,你想下载的音乐,比如,输入【下山】回车。
然后提示输入,你想下载的音乐序号,比如,输入【2】回车。
下载的音乐会在执行文件(exe或py文件),同一级路径下。
项目思路
1.找列表数据。通过谷歌浏览器F12中Network中的链接观察,找到数据在js分类下开头是song_search_v2的链接中。注意:callback可不需要,带上的话得到的数据需要通过正则或其他截取方法处理为JSON格式数据。
#解析数据
json_music = res_music.json() #解析JSON数据
music_list=json_music['data']['lists'] #通过字典的键获取数据
2. 找下载数据。播放页面的链接为
(https://www.kugou.com/song/#hash=EABDDF85153719DA1991B20ABE5FB80D
&album_id=33912131)通过观察列表页JSON数据和播放页的链接,我们需要拿到hash,album_id。拿到这两个数据(在列表页JSON数据中),我们就可以访问播放页面了。
那么既然要下载音乐,就需要知道下载链接。通过Network下的js分类下的链接观察,我们要的下载链接藏在 开头是 index.php的链接中,下载地址则在得到的JSON数据字典键为play_url下。
# 解析数据
# 方法1.正则获取到最后完整的下载链接
song_download=''.join(soup.text.split('https')[-1:]).replace('\\','').replace('://','').replace('"}});','')
# 方法2.json()解析数据 参考 获取列表数据
3.下载音乐到本地。音频,视频,图片都属于二进制文件,所以需要用.content方法,而不是html结构的.text方法。
#下载歌曲
with open(music_hash_dic[user_choice][2]+'.mp3','wb' ) as f:
print(music_hash_dic[user_choice][2],'正在下载...')
f.write(requests.get(finall_url).content)
print(music_hash_dic[user_choice][2],'下载完成,歌曲在执行文件,同一级路径')
print('=' * 25) # 25个'='
源代码
import json,requests,re,time
#伪装浏览器头部,可通用
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
#外层循环,保证每次下载结束后 可控制程序是否结束
songname=input('请输入你要下载的歌曲名称:')
key_word = '' # 用于保存输入的歌曲名
begin_while = True #开启项目循环
while begin_while:
key_word = songname
# 找数据,数据藏在js文件里 callback=jQuery112404079296929561982_1579355885832&可以去掉,去掉后,就是完整的json字符串,如加上则需要截取字符串为JSON格式字符串
res_music = requests.get('https://songsearch.kugou.com/song_search_v2?keyword={}&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1579355491182'.format(songname))
# 清理多余的参数后的url,也能获取到数据
# res_music = requests.get('https://songsearch.kugou.com/song_search_v2?keyword={}&platform=WebFilter'.format(songname))
json_music = res_music.json()
music_list=json_music['data']['lists']
#利用enumerate函数,将下标作为序号,方便输入选择
music_hash_dic={}
number = 0
for y,x in enumerate(music_list):
number = y + 1
songname=x['FileName'].replace('','').replace('','') # 去掉数据里标签
songhash=x['FileHash']
songid=x['AlbumID']
music_hash_dic[str(y+1)]=[songhash,songid,songname] #将序号作为键,把hash,id,歌曲名称作为字典键值
print(str(y+1)+' | '+songname)
#下面的url有部分没用,但需要带cookies,建议用此url较方便
print('=' * 25) # 25个'='
user_choice = ''
if number > 0 :
user_choice=input('请输入你要下载的歌曲序号:')
while True: # 内层循环
if user_choice.isdigit():
if int(user_choice) > 0 and int(user_choice) <= number:
user_choice = str(int(user_choice)) # 去掉 01前面的0
hash_url='https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery1910017709359422550808_1579413714166&hash={}&album_id={}&dfid=2AZfAI3Sfdln0Z7zq545MRQu&mid=6bcee3705b8816d0cba7e664a5d55ea7&platid=4&_=1579228034450'.format(music_hash_dic[user_choice][0],music_hash_dic[user_choice][1])
soup = requests.get(hash_url,headers=headers)
# 获取到最后完整的下载链接
song_download=''.join(soup.text.split('https')[-1:]).replace('\\','').replace('://','').replace('"}});','')
finall_url='https://'+'{}'.format(song_download)
if '\"err_code\":0' in soup.text: # 下载过多,酷狗方会限制IP,可用代理IP池解决,此处不拓展,后面教程会专门提供
if 'mp3' in finall_url:
#下载歌曲
with open(music_hash_dic[user_choice][2]+'.mp3','wb' ) as f:
print(music_hash_dic[user_choice][2],'正在下载...')
f.write(requests.get(finall_url).content)
print(music_hash_dic[user_choice][2],'下载完成,歌曲在执行文件,同一级路径')
print('=' * 25) # 25个'='
# break
else:
print('=' * 25) # 25个'='
print("此歌曲为VIP版本请选择其他版本")
print('=' * 25) # 25个'='
songname = key_word # 把搜索的歌曲名称重新传给 songname,达到重新加载循环歌曲列表
print("重新读取歌曲列表中...")
time.sleep(3)
break
else:
print("由于酷狗限制,下载次数过多,请稍候尝试")
user_choice_again=input('输入【8】结束使用,其他任意键继续下载歌曲: ')
if user_choice_again != '8':
songname=input('请输入你要下载的歌曲名称:')
break # 关闭内层循环 注意此时外层循环是没有关闭的
else:
print('=' * 25) # 25个'='
print('再见,欢迎下次使用,退出中...')
time.sleep(3)
begin_while = False #关闭项目循环,注意外层循环关闭
break #关闭内层循环
else:
user_choice=input('请输入列表中的序号,再次输入歌曲序号:')
else:
user_choice=input('输入有误,请输入你要下载的歌曲序号:')
else:
songname=input('未找到歌曲,请重新输入你要下载的歌曲名称:')
秒变大牛,就是这么简单~
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。
微信群(关注「Python家庭」一起轻松学Python吧)
QQ ②群(983031854)