网易云音乐评论接口已强制加密,需用Playwright等无头浏览器执行前端加密逻辑获取数据。直接requests请求会返回-460错误,因服务端仅接受WebCrypto+AES+RSA混合加密的密文请求,推荐注入window.asrsea()生成参数并拦截XHR响应。

网易云音乐评论接口已加密,直接 requests 无法获取真实数据
现在网易云音乐所有评论相关接口(如 /weapi/v1/resource/comments)都使用 WebCrypto + AES-128-CBC + RSA 混合加密,请求体是密文,requests.get() 或 requests.post() 直接发原始参数会返回空数据或 {"code": -460} 错误。这不是反爬强度问题,而是服务端根本不认未加密的请求。
常见错误现象:
• 请求返回 {"code":-460,"msg":"Cheating"}
• comments 字段为空数组,但网页能正常显示
• 抓包看到的 params 和 encSecKey 是长字符串,手动拼接后仍失败(因为加密逻辑依赖时间戳、随机数、RSA公钥等动态因子)
实操建议:
• 不要尝试“自己实现加密”——网易云加密逻辑在前端 JS 中持续更新,2023年后已加入混淆、调试陷阱和环境检测(如检查 window.chrome)
• 真实可行路径只有两条:用 PyExecJS / Node.js 执行原始加密 JS(需维护 JS 文件同步),或改用无头浏览器驱动真实页面
推荐方案:用 Playwright 启动 Chromium 并注入 JS 提取评论
Playwright 能加载完整页面、执行加密逻辑、绕过大部分环境检测,且比 Selenium 更稳定。关键不是“模拟登录”,而是让浏览器自己完成加密并拿到响应。
立即学习“Python免费学习笔记(深入)”;
使用场景:
• 只需抓少量歌曲/专辑(比如单个 song_id=186016)的前 500 条热评+最新评论
• 不需要高频轮询(避免触发风控)
• 你有本地 Node.js 环境(Playwright 依赖它)
实操建议:
• 安装:pip install playwright,然后运行 playwright install chromium
• 目标 URL 格式为 https://music.163.com/#/song?id=186016,注意是 hash 路由,需等待 iframe 加载完成
• 在页面中执行 JS 注入,调用网易云已有的 window.asrsea() 函数生成加密参数(该函数存在于页面 <script></script> 中)
• 用 page.evaluate() 获取评论 DOM 元素,或更可靠地:拦截 XHR 响应,匹配 /weapi/v1/resource/comments 请求,读取其 response.json()
示例片段(截取关键逻辑):
await page.goto('https://music.163.com/#/song?id=186016')<br>await page.waitForTimeout(2000) # 等 iframe 渲染<br>const comments = await page.evaluate(async () => {<br> // 拦截并等待第一个评论接口响应<br> return new Promise(resolve => {<br> const xhr = new XMLHttpRequest();<br> xhr.open('POST', '/weapi/v1/resource/comments');<br> xhr.onload = () => resolve(JSON.parse(xhr.responseText));<br> xhr.send(JSON.stringify({<br> params: window.asrsea(...),<br> encSecKey: window.asrsea(...)<br> }));<br> });<br});
华为云 Python SDK 查询工具。自动发现已安装 SDK 的服务包、Client类、API 方法、入参详情、类信息(__init__ 参数、属性、类型、描述),支持关键字搜索,快速定位目标 API 使用方法。
导出 Excel 时注意字段清洗和编码边界
网易云评论 JSON 中的 content 可能含换行符、emoji、零宽空格(\u200b)、HTML 实体(如 &),直接写入 pandas.DataFrame.to_excel() 会导致 Excel 打开报错或格式错乱。
常见错误现象:
• Excel 提示“发现不可读内容”,点击恢复后文字错位
• 评论内容在单元格中显示为 #VALUE! 或空白
• 导出后中文变成乱码(实际是 Excel 默认 ANSI 编码打开 UTF-8 文件)
实操建议:
• 用 re.sub(r'[\x00-\x08\x0b-\x0c\x0e-\x1f]', '', text) 清洗控制字符
• 将 emoji 替换为占位符(如 text.encode('utf-16', 'surrogatepass').decode('utf-16') 不推荐;稳妥做法是 emoji.demojize(text))
• 导出时不依赖 openpyxl 默认引擎,显式指定:df.to_excel("comments.xlsx", engine="openpyxl", index=False)
• 不要双击直接打开 .xlsx,用 Excel 菜单“数据 → 自获取 → 从工作簿”导入,可规避编码识别错误
绕过账号登录限制的最小可行方式
网易云对未登录用户限制:只能看前 15 条热评,且无法访问 /weapi/v1/resource/comments 接口。但“未登录”不等于“没 Cookie”,关键在于复用一个有效的 NESSTID 和 _ntes_nnid。
使用场景:
• 你有一台长期登录网易云的电脑(浏览器有有效会话)
• 不想写登录逻辑(用户名密码易被封)
• 只需每天手动更新一次 Cookie
实操建议:
• 打开 Chrome 开发者工具 → Application → Cookies → 复制 NESSTID、_ntes_nnid、__csrf 三个值
• 在 Playwright 启动时注入:context.add_cookies([{"name": "NESSTID", "value": "...", "domain": ".163.com", "path": "/"}])
• 注意:Cookie 有效期约 7 天,过期后请求返回 {"code": 301},需重新提取
• 不要传 musicu 或 __remember_me——它们含敏感信息且容易触发风控
真正难的从来不是“怎么导出 Excel”,而是如何让那一串 params 和 encSecKey 被服务器认可。每次网易前端 JS 更新,加密入口函数名、参数顺序、RSA 公钥位置都可能变,硬编码必崩。所以别省那几秒启动浏览器的时间。

















