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

使用 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.xdnf.cn/news/10913.html

相关文章:

  • 01电气设计-380V强电部分设计
  • 前缀和基础训练
  • Docker 镜像(或 Docker 容器)中查找文件命令
  • 5月底 端午节
  • 2024-2025-2-《移动机器人设计与实践》-复习资料-1-7
  • C++语法系列之特殊类设计
  • ​​Agentic Voice Stack 热门项目
  • MySQL连接报SSL错误
  • 【QT】认识QT
  • v4l2常见操作-查看当前摄像头信息,帧率,控制参数,分辨率,支持格式,抓图实践等
  • LangChain核心之Runnable接口底层实现
  • Vue中安装插件的方式
  • [蓝桥杯]路径之谜
  • 快速排序(Quick Sort)算法详解(递归与非递归)
  • 第一章-计算机系统概述深化
  • AI数字人技术革新进行时:井云数字人如何重塑人机交互未来?
  • 瑞幸咖啡香港自营门店增至 12 间 未来或拓展至中环等核心区
  • 问题七、isaacsim中添加IMU传感器
  • one-hot编码VS对象嵌入表示
  • docker创建postgreSql带多个init的sql
  • 工厂模式与多态结合
  • 通信算法之281:大疆DJI无人机ID-DJI DroneID开源工程-相关问题-协议信息问题
  • 【高等数学】(2)函数
  • MongoDB数据库学习
  • 【JS服务器】JETBRAINS IDEs JS服务器使用什么编译JNI
  • Docker或Docker-Compose时间时区配置
  • 【亲测有效 | Cursor Pro每月500次快速请求扩5倍】(Windows版)Cursor中集成interactive-feedback-mcp
  • 工业智能网关保障冷冻仓储设备无人值守安全运行
  • 当 “欧洲版 Cursor” 遇上安全危机
  • 7.RV1126-OPENCV cvtColor 和 putText