使用 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 execjs

node = 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!


相关推荐
Q_Q196328847535 分钟前
python+springboot+uniapp基于微信小程序的校园二手闲置二手交易公益系统 二手交易+公益捐赠
spring boot·python·django·flask·uni-app·node.js·php
semicolon_hello42 分钟前
C++中 optional variant any 的使用
开发语言·c++
报错小能手2 小时前
C++笔记(基础)string基础
开发语言·c++·笔记
先知后行。3 小时前
Qt 网络编程
开发语言·网络·qt
做运维的阿瑞3 小时前
Python零基础入门:30分钟掌握核心语法与实战应用
开发语言·后端·python·算法·系统架构
Q_Q19632884753 小时前
python+spring boot洪涝灾害应急信息管理系统 灾情上报 预警发布 应急资源调度 灾情图表展示系统
开发语言·spring boot·python·django·flask·node.js·php
pop_opo_4 小时前
使用 Python + Pygame 键盘控制无人机(AirSim)
python·无人机·pygame
༾冬瓜大侠༿4 小时前
C语言:自定义类型——联合体和枚举
java·c语言·开发语言
程序猿老罗5 小时前
使用Python轻松实现Word到PDF的批量转换
python·pdf·word
无限进步_7 小时前
【C语言】统计二进制中1的个数:三种方法的比较与分析
c语言·开发语言