python免费下歌 (python下载歌曲)

酷狗音乐是一款非常不错的软件,包含着音乐软件所有该有的功能。

初中开始接触上网,*载下**歌曲便一直用酷狗音乐。想当初自己年少无知啊,好不容易凑够5块钱上了2个小时的网,结果愣是一首歌没*载下**下来,*载下**的全是歌词文件!我兴高采烈地往自己的mp4里传输,结果发现不能*放播**!网吧时间到了,口袋钱空了,歌没下下来,当时气死老子了。这也可以说是一段难忘的经历啊。

上了大学以后,为了配合我稍微有一点那么文绉绉的气质,开始跟随网易大军,使用网易云音乐,开启我的高逼格历程!大学毕业,气质全无,我觉得我配不上网易云了,又投入了酷狗音乐的怀抱[笑哭]。

这不,这两天重看《双世宠妃2》,再一次深深地迷上了里面的曲檀儿(梁洁饰演)【花痴】,配合叶炫清的《归去来兮》,简直了!【好像屌丝本质一览无余?才不是,是欣赏!哈哈】

开始分析:

MV链接:https://www.kugou.com/mvweb/html/mv_866733.html

想直接看的,可跳转过去哦!

第一步:打开酷狗WEB,搜索《归去来兮》,点击

python酷狗歌单下载,python爬虫酷狗音乐教学

第二步:点击音乐*放播**界面的mv,进行跳转到*放播**页面。

python酷狗歌单下载,python爬虫酷狗音乐教学

python酷狗歌单下载,python爬虫酷狗音乐教学

简直了,美美美

哈哈,别忘了正事!

第三步:右键(Chrome)检查,Ctrl+F搜索"归去来兮",结果如下:

python酷狗歌单下载,python爬虫酷狗音乐教学

可以看出,这里面有我们需要的MV的标题和MV的哈希值。至于哈希值是啥,待会再解释。

获取到它们,方法如下:

access_url ="链接地址"
# 移除SSL验证时的警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
response = requests.get(access_url, headers=headers, verify=False)
html = response.text
web_data = etree.HTML(html)
datas = web_data.xpath('//script[@type="text/javascript"]')
x = datas[1].xpath('./text()')[0].strip().split('.')[0].split(',')
mv_hash = x[1].split('"')[1]
mv_title = x[2].split('"')[1]
print('MV哈希值:%s,MV标题:%s'%(mv_hash,mv_title))
# 划重点:获取key
key = kugou_hash(mv_hash)

第四步?

在开始第四步之前,先用网上的解释来说明什么是哈希加密!

转载链接:https://www.liaoxuefeng.com/wiki/897692888725344/923057313018752

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

举个例子,你写了一篇文章,内容是一个字符串'how to use python hashlib - by Michael',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了你的文章,并发表为'how to use python hashlib - by Bob',你可以一下子指出Bob篡改了你的文章,因为根据'how to use python hashlib - by Bob'计算出的摘要不同于原始文章的摘要。

可见,摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

好,接下来,第四步:用hash得到key!

m = hashlib.md5() # 哈希 md5加密
kugou_slat = 'kugoumvcloud' # 盐
m.update((mv_hash + kugou_slat).encode("utf8")) # 哈希值+盐
key = m.hexdigest()
return key # 返回key值

第五步:刷新页面,右键检查,Network,搜索key,得到如下结果:

python酷狗歌单下载,python爬虫酷狗音乐教学

可以看到,这里面就有我们想要的超清画质的*载下**链接!

python酷狗歌单下载,python爬虫酷狗音乐教学

python酷狗歌单下载,python爬虫酷狗音乐教学

第六步:既然找到了最后的*载下**链接,那*载下**自然就不在话在!开搞!

download_url = "http://trackermv.kugou.com/interface/index/cmd=100&hash={}&key={}&pid=6&ext=mp4&ismp3=0".format(mv_hash,key)
hash_res = requests.get(download_url, headers=headers)
hash_js = hash_res.json() # json格式
try:
 play_url = hash_js['mvdata']['rq']['downurl']
 file_suffix = play_url.split('/')[-1].split('.')[-1]
 if play_url !="":
 print('1080P MV*载下**地址已找到,请稍候...')
 with open(save_path_real+mv_title + "." + file_suffix, "wb")as fp:
 fp.write(requests.get(play_url).content)
 print('>>>1080P*载下**完成!!!')

至此,我们想要的超清MV便可收入囊中!演示:

python酷狗歌单下载,python爬虫酷狗音乐教学

最后,附上源码:

import requests
import hashlib
from lxml import etree
import urllib3
import winreg
import os
# mv保存地址
def get_desktop():
 key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders')
 return winreg.QueryValueEx(key, "Desktop")[0]
save_path_real = get_desktop()+'\\' + "酷狗音乐MTV" + "\\"
headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}
print('>>>>>>>>>>>>酷狗MV*载下**程序开始<<<<<<<<<<<<<\n')
print('>>>>>>>>>>>>示例URL:http://www.kugou.com/mvweb/html/mv_1138506.html<<<<<<<<<<<<<\n')
# 获取mv的hash和title
def get_mv_name_hash(html, save_path_real):
 web_data = etree.HTML(html)
 datas = web_data.xpath('//script[@type="text/javascript"]')
 x = datas[1].xpath('./text()')[0].strip().split('.')[0].split(',')
 mv_hash = x[1].split('"')[1]
 mv_title = x[2].split('"')[1]
 print('MV哈希值:%s,MV标题:%s'%(mv_hash,mv_title))
 # 获取key
 key = kugou_hash(mv_hash)
 # *载下**MV
 download_mv(mv_title,mv_hash,key,save_path_real)
# 哈希加密的教程链接,转1:https://www.jianshu.com/p/cc2468b82e90
# 哈希加密的教程链接,转2:https://www.jianshu.com/p/cb77838c69db
# 得到key
# 传入MV哈希值 返回KEY值
def kugou_hash(mv_hash):
 m = hashlib.md5() # 哈希 md5加密
 # #song_hash_upper=mv_hash.upper()#大写
 kugou_slat = 'kugoumvcloud' # 盐
 m.update((mv_hash + kugou_slat).encode("utf8")) # 哈希值+盐
 key = m.hexdigest()
 return key # 返回key值
# *载下**
def download_mv(mv_title,mv_hash,key,save_path_real):
 if not os.path.exists(save_path_real):
 os.mkdir(save_path_real)
 print("%s正在*载下**,请稍候..."%mv_title)
 download_url = "http://trackermv.kugou.com/interface/index/cmd=100&hash={}&key={}&pid=6&ext=mp4&ismp3=0".format(mv_hash,key)
 hash_res = requests.get(download_url, headers=headers)
 hash_js = hash_res.json() # json格式
 try:
 play_url = hash_js['mvdata']['rq']['downurl']
 file_suffix = play_url.split('/')[-1].split('.')[-1]
 if play_url !="":
 print('1080P MV*载下**地址已找到,请稍候...')
 with open(save_path_real+mv_title + "." + file_suffix, "wb")as fp:
 fp.write(requests.get(play_url).content)
 print('>>>1080P*载下**完成!!!')
 except:
 try:
 play_url = hash_js['mvdata']['sq']['downurl']
 file_suffix = play_url.split('/')[-1].split('.')[-1]
 if play_url !="":
 print('720P MV*载下**地址已找到,请稍候...')
 with open(save_path_real+mv_title + "." + file_suffix, "wb")as fp:
 fp.write(requests.get(play_url).content)
 print('>>>720P*载下**完成!!!')
 except:
 try:
 play_url = hash_js['mvdata']['hd']['downurl']
 file_suffix = play_url.split('/')[-1].split('.')[-1]
 if play_url !="":
 print('540P MV*载下**地址已找到,请稍候...')
 with open(save_path_real+mv_title + "." + file_suffix, "wb")as fp:
 fp.write(requests.get(play_url).content)
 print('>>>540P*载下**完成!!!')
 except:
 print('>>>无MV!')
# 获取html
def get_html(url):
 access_url = url
 # 移除SSL验证时的警告
 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
 response = requests.get(access_url, headers=headers, verify=False)
 html = response.text
 # 获取mv的hash和标题
 get_mv_name_hash(html, save_path_real)
def main():
 # MV页面链接
 url = input('>>>请输入酷狗音乐MV*放播**页URL地址:')
 get_html(url)
 continue_download = input('>>>是否继续*载下**?输入Y or N,其余字符不可用!\n\n')
 if continue_download == 'Y' or continue_download == 'y':
 main()
# 启动程序
if __name__ == '__main__':
 main()

好了,今天的分享到此就结束了,有想交流的,请记得私信我哦!

代码也可以打包成exe文件,电脑安装python也能*载下**,我已经打包好了,如果小伙伴有需要的,也记得私信我哦。