本人在下面代码中踩过的坑主要是:
bytesArr_lric = resp.content # 直接 bytesArray , 转为text再解压缩会报错。
# str_lric = resp.text #得到歌词密文
上面二句 有一句 是将服务器返回的内容,转为文本,再将需要解压缩的部分 split 出来,再调用 zlib.decompress(btsLricContent) #解压缩, 结果解压缩报错。
原因是直接转为文本时,原压缩内容已经改变,解压缩模块报压缩文件模式错误,无法解压缩。
上面二句代码中的另一句就是正确的, bytesArr_lric = resp.content 直接用服务器返回的歌词内容,格式 bytes 数组,经 split 分割后 将 "rnrn"之后的压缩内容用于解压缩,zlib.decompress()就不再报错了。
下面是我用 python 写的代码的关键部分:
import requests
from lxml.html import etree #pip install lxml
import zlib
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}
def getLric_kuwo(music_mid): #下载 kuwo 歌词 ,music_mid 是kuwo 音乐的 rid 或 mid 是数字的字符串
# 歌词 kuwo krc api
url1 = 'https://player.kuwo.cn/webmusic/st/getNewMuiseByRid?rid=MUSIC_{}'.format(music_mid)
resp = requests.get(url1,headers=headers) #取得歌词 ID
if resp.status_code < 200 or resp.status_code >= 300: #处理服务器返回的异
print(resp.reason + ", get lyric_id failed!n")
return ""
tree = etree.HTML(resp.text)
musiclyric_id = tree.xpath("//lyric/text()") #取歌词_ID, 之后可以根据 歌词_ID 取得加密后的歌词 krc格式
url2 = 'http://newlyric.kuwo.cn/newlyric.lrc?{}'.format(musiclyric_id[0])
resp = requests.get(url2, stream=True, headers=headers) #取歌词密文。 kuwo 歌词被加密,需要解密!
if resp.status_code < 200 or resp.status_code >= 300: #处理服务器返回的异
print( resp.reason + ', get lyric by lyric_id ' + musiclyric_id + ' failed!n')
bytesArr_lric = resp.content # 直接 bytesArray , 转为text再解压缩会报错。
# str_lric = resp.text #得到歌词密文
lric = ""
lric = decode_kuwoLyric(bytesArr_lric) #kuwo 歌词解压缩
return lric
def decode_kuwoLyric(bytes_lyric): #kuwo 歌词解压缩
lric=""
btsLricContent = bytes_lyric.split(b'rnrn')[-1] #对 bytes 数组进行 split
# print(btsLricContent)
# saveBinDataToFile(str(46337337) + ".gz", btsLricContent) #保存到文件
decompre_lric = zlib.decompress(btsLricContent) #解压缩
lric = str(decompre_lric, encoding="gbk") #?='utf-8'
return lric
def saveBinDataToFile(savepath, binaryData): #将 bytes 保存为文件
saveOK = False
try:
f = open(savepath, 'wb')
f.write(binaryData) # 写入文件, binaryData 必为 bytes 格式, 否则报错
f.close()
saveOK = True
except:
saveOK = False
return saveOK
music_rid='79479'
filename_lyrc = '79479.lrc'
strlyric = getLric_kuwo( music_rid) #取得歌词 解密的 krc 格式,可转 lrc 格式
ret = saveBinDataToFile(filename_lyrc, str.encode(strlyric))
if ret== True:
print("n Lyric download OK!")
参考资料:
酷我音乐API_水也的博客-CSDN博客_酷我音乐api



