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

bytesArr_lric = resp.content    # 直接 bytesArray , 转为text再解压缩会报错。
    # str_lric = resp.text    #得到歌词密文

上面二句 有一句 是将服务器返回的内容,转为文本,再将需要解压缩的部分 split 出来,再调用 zlib.decompress(btsLricContent) #解压缩, 结果解压缩报错。

原因是直接转为文本时,原压缩内容已经改变,解压缩模块报压缩文件模式错误,无法解压缩。

上面二句代码中的另一句就是正确的, bytesArr_lric = resp.content  直接用服务器返回的歌词内容,格式 bytes 数组,经 split 分割后 将 "\r\n\r\n"之后的压缩内容用于解压缩,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'\r\n\r\n')[-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

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

  1. 微信开发踩坑系列一之Native支付

    微信开发踩坑系列一之Native支付 1.前言 1.1.文章说明 1.2.微信支付简介 1.3.项目技术栈 2.Native支付开发 2.1.官方描述 2.2.两种模式介绍 2.3.开发前准备工作 2 ...

  2. python导入类有红线_python踩坑系列之导入包时下划红线及报错“No module named”问题...

    python踩坑系列之导入包时下划红线及报错"No module named"问题 使用pycharm编写Python时,自己写了一个包(commontool),在同级另一个路径下 ...

  3. python代码下出现红线_python踩坑系列之导入包时下划红线及报错“No module named”问题...

    python踩坑系列之导入包时下划红线及报错"No module named"问题 使用pycharm编写Python时,自己写了一个包(commontool),在同级另一个路径下 ...

  4. openlayers6 踩坑系列(三)绘制和编辑(矩形,圆,多边形,点,线)

    重要:博客内使用地图全替换为WMap,想使用的请参考我这篇博客(WMap) 最近在做矢量图形这一块,发现圆形和多边形,都可以使用openlayers自带的Modify类进行编辑,然后随意放大缩小旋转, ...

  5. 【踩坑系列】 SpringBoot ,SpringSecurity,activiti 项目无法正常跳转到登录界面

    [踩坑系列] SpringBoot ,SpringSecurity,activiti 项目无法正常跳转到登录界面 前言 一直强制跳转到springSecurity 的默认的登录界面,无法正常跳转到自己 ...

  6. 【踩坑系列】mysql 修改root密码失败

    [踩坑系列] mysql 修改root密码失败 问题原因 mysql 修改root密码失败 ,主要是因为root的host不是localhost,是%的问题. 修改密码的步骤 -- 切换到 mysql ...

  7. Oracle Clob类型踩坑系列

    Oracle Clob类型踩坑系列 1]存储过程中向Clob中插入值 插入32767字节长度数据.无报错 Declarev_Clob Clob := '[32767长度字节数据]'; BeginIns ...

  8. 【踩坑系列】uniapp之h5 跨域的问题

    文章目录 [踩坑系列]uniapp之h5 跨域的问题 前言 什么是跨域 如何解决 参考文章 [踩坑系列]uniapp之h5 跨域的问题 前言 在浏览器上调试移动端的界面,出现 不允许出现多个 'Acc ...

  9. android7.1.1开发过程中出现部分音乐播放器(酷狗,QQ音乐,酷我音乐)歌词不能长久显示在桌面

    android7.1.1开发过程中出现部分音乐播放器(酷狗,QQ音乐,酷我音乐)歌词不能长久显示在桌面 处理:二号三方apk沟通,三方apk在7.1.1上做相应的适配, 这个和android7.1.1 ...

  10. java数字转大写 其他报异常_【踩坑系列】使用long类型处理金额,科学计数法导致金额转大写异常...

    python科学计算数据应用(第2版) 156.4元 (需用券) 去购买 > 1. 踩坑经历 上周,一个用户反馈他创建的某个销售单无法打开,但其余销售单都可以正常打开,当时查看了生产环境的ERR ...

最新文章

  1. STM32H7的Cache和MPU
  2. .net里鼠标选中的text数据怎么获取_怎么利用Excel设置当天生日提醒功能
  3. python解包操作_Python编程使用*解包和itertools.product()求笛卡尔积的方法
  4. SSY and JLBD
  5. JavaScript --- 跨浏览器的事件对象
  6. html5实现3d翻页效果,利用css3 3d transform制作超逼真翻书效果
  7. 深度优先搜索之踩方格问题
  8. 二进制模2除法(CRC校验)
  9. 服务器显示器超分辨率,不花钱就能让显示器分辨率翻番?不试你就亏了!
  10. 裸辞1天 vs 裸辞10天 vs 裸辞一个月
  11. 实验室设计规范与标准
  12. lofter 爬虫_Python网络爬虫1 - 爬取网易LOFTER图片
  13. 带你认识六种设计原则(开闭原则、里氏代换原则、依赖倒转原则....)
  14. nrm安装成功后但是不能使用
  15. 44 | 答疑(三)
  16. SLAM--VICP(Velocity Updating Iterative Closest Point Algorithm)学习笔记
  17. 我的世界网易怎么调成java,网易版我的世界如何将单机地图改为联机地图
  18. 学习固不可少 回顾也别有风味
  19. sentinel监控界面无显示
  20. IOS IAP APP内支付 Java服务端代码

热门文章

  1. 图像处理之LOMO特效
  2. 第三方支付——微信web端支付(java)
  3. 用foobar,ape转mp3
  4. 使用VS2019将c#生成dll文件
  5. Rundll32.exe原理及使用, 参数传递问题解决方法(可用于批处理中)
  6. 计算机网络:广域网的基本概念
  7. 百度富文本编辑jsp上传_类百度富文本编辑器文件上传。
  8. 视频教程-用友U8视频教程全集(合同管理)-ERP
  9. Linux系统升级及内核版本升级
  10. python基础题目练习,购买猕猴桃