栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

帮你踩坑系列:酷我音乐的歌词获取/下载,示例代码用 python

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

帮你踩坑系列:酷我音乐的歌词获取/下载,示例代码用 python

本人在下面代码中踩过的坑主要是:

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/360262.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号