加密网页通常不是真加密,而是前端混淆或动态渲染,真实html结构不存在于初始响应中,必须触发js执行才能还原,因此直接用requests无法获取内容,需用playwright等无头浏览器复现真实浏览器行为。

加密网页通常不是真加密,而是前端混淆或动态渲染
浏览器里看到的“加密网页”几乎都不是服务端加密传输,而是用 JavaScript 做了 HTML 内容的字符串混淆、Base64 编码、AES 解密(密钥硬编码在 JS 里),或者干脆把 DOM 完全靠 JS 动态拼出来。真实 HTML 文档结构根本不存在于初始响应中,document.body.innerHTML 在 JS 执行前是空的或只有占位符。
这意味着:直接用 requests.get() 拿到的响应体里没有你要的结构;用 curl 或浏览器“查看页面源代码”也看不到真实节点;必须触发 JS 执行才能还原。
- 典型特征:响应 body 里有大量
eval(、atob(、crypto-js、document.write(或超长十六进制字符串 - 关键判断点:打开开发者工具 → 切到 “Elements” 标签页 → 看渲染后的 DOM;再切到 “Network” → 找 HTML 请求 → 看 Preview/Response,二者结构明显不一致,就属于这类
- 不要浪费时间尝试纯 Python 解密——密钥可能从接口动态获取、解密逻辑带时间戳校验、或依赖浏览器环境变量(如
navigator.userAgent)
用 Playwright/Puppeteer 等无头浏览器才是可靠解法
绕过前端混淆的唯一稳定路径,是复现真实浏览器行为。Playwright 比 Selenium 更轻、更健壮,推荐优先用它;Puppeteer(Node.js)也可,但 Python 生态里 Playwright 的同步 API 更直观。
重点不是“等 JS 执行完”,而是等真实内容节点出现。不能只靠 page.wait_for_timeout(3000) 这种固定延时——网络慢、CPU 弱、JS 逻辑改版都会导致失败。
- 用
page.wait_for_selector("main article h1", state="attached")等待关键语义节点挂载,比延时靠谱得多 - 如果页面依赖登录态或 Cookie,先用
context.add_cookies()注入,别重复走登录流程 - 禁用图片和字体加载可提速:
page.route("**/*.{png,jpg,gif,woff,woff2}", lambda route: route.abort()) - 避免
page.content(),改用page.inner_html("body")或更精确的选择器,防止拿到未渲染完的中间状态
解密逻辑能抽出来跑吗?要看密钥和上下文是否可脱离浏览器
极少数情况下,JS 解密逻辑确实可剥离:比如密钥写死在代码里、只用 atob() + JSON.parse()、或调用 Web Crypto API 但参数全静态。这时你可以用 execjs(Python)或 vm2(Node.js)沙箱执行片段 JS。
但多数现实场景下会踩坑:
-
require("crypto").createDecipheriv在 Node.js 里可用,但浏览器里的crypto.subtle.decrypt无法直接复用 - JS 里用了
location.href、performance.now()、document.currentScript等浏览器专属 API,沙箱里直接报错 - 混淆代码里嵌了反调试逻辑,比如检测
toString()是否被重写、或定时查debugger断点状态 - 就算解出 HTML 字符串,里面可能还有内联
onclick或data-*属性,需二次解析才能还原交互结构
提取后结构不稳定?问题大概率出在动态水印或懒加载
拿到解密后的 HTML,发现标题对得上但正文缺段落、图片地址全是占位符、或者每刷新一次 class 名都变——这不是解密失败,而是页面本身做了运行时干预。
- 常见手法:
document.querySelectorAll(".content").forEach(el => el.innerHTML = el.innerHTML.replace(/./g, ""))这类 DOM 劫持,必须在篡改发生前抓取 - 解决方案:用
page.on("response", ...)监听 XHR/Fetch,捕获原始数据接口(常藏在fetch("api/content?id=...")里),比解析 HTML 更干净 - 懒加载图片/视频会用
IntersectionObserver触发,此时img.src还是data-src,需滚动或手动触发 observer 回调 - 结构差异还可能来自服务端 A/B 测试:同一 URL 返回不同 HTML,需检查请求头(
User-Agent、Cookie、Sec-Ch-Ua)是否一致
真实场景里,最耗时的环节往往不是解密,而是识别哪些节点是“骨架”、哪些是“装饰”,以及确认每次访问背后是否藏着隐藏的环境指纹校验。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











