当前位置: 首页 > news >正文

使用 Python + ExecJS 获取网易云音乐歌曲歌词


🎵 使用 Python + ExecJS 获取网易云音乐歌曲歌词

在本篇博客中,我们将通过一个完整的 Python 脚本,利用 execjs 模块调用 JavaScript 代码,成功获取网易云音乐的歌曲歌词。整个过程涵盖了加密参数的生成、API 请求发送与歌词提取,适合有一定爬虫基础的同学参考与实践。


📦 环境准备

🐍 Python 库依赖

请先确保安装了以下依赖:

pip install requests PyExecJS

💻 Node.js 环境

由于网易云的加密参数是通过 JavaScript 实现的,我们需要借助 Node.js 来执行 JS 代码。请确保你已安装 Node,并且 execjs 能正常调用:

node -v  # 确认安装成功

📄 核心代码解析

下面是核心脚本的关键步骤及代码解释。

1️⃣ 读取加密逻辑

网易云音乐使用了前端加密,我们将其 JavaScript 加密逻辑(比如 RSA/AES 混合加密)保存为 1.js 文件:

import execjsnode = execjs.get('Node')  # 获取 Node.js 运行环境
with open('1.js', 'r', encoding='utf-8') as f:js_code = f.read()
ctx = node.compile(js_code)

2️⃣ 获取歌曲列表

我们通过网易云的搜索接口 https://music.163.com/weapi/search/suggest/web,发送带加密参数的 POST 请求:

songname = input('输入歌曲名: ')
ik = f'{{"s":"{songname}","limit":"8","csrf_token":"f8ca6f7e8ab34d79642bef1fbbdfacc4"}}'
result = ctx.call('ck', ik)headers = {'Content-Type': 'application/x-www-form-urlencoded'}
url = "https://music.163.com/weapi/search/suggest/web?csrf_token=f8ca6f7e8ab34d79642bef1fbbdfacc4"
payload = (f'params={urllib.parse.quote(result["params"])}'f'&encSecKey={urllib.parse.quote(result["encSecKey"])}'
)response = requests.post(url, headers=headers, data=payload)
songlist = response.json()["result"]["songs"]

显示搜索结果并选择歌曲:

for i, song in enumerate(songlist, 1):print(i, song["name"], song["artists"][0]["name"])choice = int(input(f"请输入歌曲前序号1-{len(songlist)}: "))
songid = songlist[choice - 1]["id"]

3️⃣ 获取歌词

搜索接口拿到 songid 后,我们通过另一个接口获取歌词内容:

ik2 = f'{{"id":"{songid}","lv":-1,"tv":-1,"csrf_token":"f8ca6f7e8ab34d79642bef1fbbdfacc4"}}'
result2 = ctx.call('ck', ik2)url = "https://music.163.com/weapi/song/lyric?csrf_token=f8ca6f7e8ab34d79642bef1fbbdfacc4"
payload = (f'params={urllib.parse.quote(result2["params"])}'f'&encSecKey={urllib.parse.quote(result2["encSecKey"])}'
)response = requests.post(url, headers=headers, data=payload)
print(response.text)

💡 小贴士

  • 你需要从网易云网页端抓包获得的 JS 加密逻辑,通常在 /weapi 接口前会有对应的加密处理。

  • csrf_token 虽然貌似是必要参数,但实际接口中多数为空字符串也可正常请求。

  • 获取歌词成功后返回的是 JSON 格式,内容在 lrc 字段中:

{"lrc": {"lyric": "[00:00.000] 歌词内容..."}
}

✅ 最终效果

通过本脚本,你可以:

  • 通过歌曲名称快速搜索网易云的匹配结果;

  • 选择指定歌曲后,获取其歌词(如果有);

  • 全过程模拟网页端加密请求,避开普通反爬机制。


🧠 总结

这篇博客展示了如何结合 Python 与 JavaScript 环境,实现对网易云音乐的加密接口调用。对于有一定爬虫经验的开发者,这是一个深入理解网页端加密交互的好案例。


如果你有任何问题或想要获取完整代码github链接:mrisD/wangyiyunhttps://github.com/mrisD/wangyiyun

🚀 Happy Coding!


http://www.lqws.cn/news/104257.html

相关文章:

  • 红黑树与红黑树的插入——用C++实现
  • 关于list集合排序的常见方法
  • JAVA获取ES连接并查询所有数据
  • Eigen实现非线性最小二乘拟合 + Gauss-Newton算法
  • Server2003 B-1 Windows操作系统渗透
  • Java项目OOM排查
  • 华为云Flexus+DeepSeek征文|基于华为云Flexus X实例的小说转语音助手应用构建实录
  • JS对数据类型的检测
  • CppCon 2014 学习:Lightning Talk: Writing a Python Interpreter for Fun and Profit
  • Java 调用第三方接口注意事项
  • Axure设计案例:滑动拼图解锁
  • 电子电路:全面深入了解晶振的定义、作用及应用
  • WordPress 6.5版本带来的新功能
  • 接口重试的7种常用方案!
  • Eureka 高可用集群搭建实战:服务注册与发现的底层原理与避坑指南
  • C++:优先级队列
  • SOC-ESP32S3部分:28-BLE低功耗蓝牙
  • 【数学】高斯积分+伽马函数公式自用背诵笔记
  • Rust 学习笔记:Cargo 工作区
  • CppCon 2014 学习:Rolling Your Own Circuit Simulator
  • 应用智能化转型—MCP原理分析
  • 帝可得 - 策略管理
  • 【MATLAB去噪算法】基于CEEMD联合小波阈值去噪算法(第三期)
  • c++基础(三)
  • Trae CN IDE自动生成注释功能测试与效率提升全解析
  • Linux: network : switch:hp5500
  • 情趣私域运营:打造高效转化的私域营销体系
  • 【Redis】笔记|第7节|大厂生产级Redis高并发分布式锁实战(二)
  • 第11节 Node.js 模块系统
  • WebRTC中sdp多媒体会话协议报文详细解读