
本文详解如何使用 python 处理含前端反爬逻辑(如动态 cookie 生成)的目标网站,以真实获取渲染后的 html 内容,重点演示通过 js2py 执行页面内嵌 js 脚本、自动计算 key cookie 并完成会话复用的完整流程。
本文详解如何使用 python 处理含前端反爬逻辑(如动态 cookie 生成)的目标网站,以真实获取渲染后的 html 内容,重点演示通过 js2py 执行页面内嵌 js 脚本、自动计算 key cookie 并完成会话复用的完整流程。
许多现代网站(如 OpenCorporates)为防范自动化访问,在 HTML 中嵌入一段 JavaScript,要求客户端执行特定计算(例如质因数分解 + 位运算),并将结果作为 KEY Cookie 提交后才返回真实内容;否则仅返回
Loading... 占位页。直接使用 urllib 或 requests.get() 无法触发该逻辑,导致抓取失败。解决思路是:模拟浏览器行为——先获取初始 HTML → 提取并执行其中的 JS 计算逻辑 → 构造合法 Cookie → 携带 Cookie 重发请求。关键在于可靠地解析并运行那段混淆度较高的内联脚本。
以下为可直接运行的完整解决方案:
import re
import requests
from bs4 import BeautifulSoup
import js2py
url = "https://opencorporates.com/companies/us_fl/P97000018463"
with requests.Session() as session:
# 第一步:获取初始响应(含 JS 计算逻辑)
response = session.get(url)
html_text = response.text
# 第二步:正则提取注释内的 JS 代码块(注意 flags=re.S 启用点号匹配换行)
script_match = re.search(r"<!--([\s\S]*?)//-->", html_text)
if not script_match:
raise RuntimeError("Failed to locate inline JS calculation script")
script_code = script_match.group(1)
# 将 document.cookie=... 替换为 return ...,使其可被 js2py 直接求值
script_code = script_code.replace("document.cookie=", "return ").strip()
# 第三步:执行 JS,获取 KEY 值(格式如 "123*456:2297856402:3577604866:1")
try:
cookie_value = js2py.eval_js(script_code)()
key_part = cookie_value.split("=", 1)[-1].split(";", 1)[0] # 提取 KEY=xxx 部分
except Exception as e:
raise RuntimeError(f"JS evaluation failed: {e}")
# 第四步:设置 Cookie 并重新请求
session.cookies.set("KEY", key_part, domain="opencorporates.com", path="/")
final_response = session.get(url)
# 第五步:解析真实内容
soup = BeautifulSoup(final_response.content, "html.parser")
company_name = soup.find("h1")
print("Company Name:", company_name.text.strip() if company_name else "[Not found]")✅ 输出示例:
立即学习“Java免费学习笔记(深入)”;
Company Name: J.G. IMPORT & EXPORT INC.
注意事项与最佳实践:
- 依赖安装:需提前执行 pip install requests beautifulsoup4 js2py;js2py 是纯 Python 实现的 JS 引擎,无需 Node.js 环境,但对极复杂 ES6+ 语法支持有限——本例中的传统 JS 完全兼容。
- Cookie 域与路径:务必显式指定 domain 和 path(如示例中 domain="opencorporates.com", path="/"),否则部分网站可能拒绝认证。
- 会话复用关键:必须使用 requests.Session() 保持连接与 Cookie 上下文,两次请求不可分离。
- 健壮性增强:生产环境建议添加超时(session.get(url, timeout=10))、异常重试、User-Agent 头(session.headers.update({"User-Agent": "Mozilla/5.0..."}))及 HTTP 状态码校验。
- 替代方案权衡:若页面 JS 过于复杂或含 Web API 调用,可考虑 playwright 或 selenium 启动真实浏览器,但资源开销大、速度慢;本方法轻量高效,适用于纯计算型反爬。
掌握此类“JS Cookie 绕过”技巧,是构建高可用网络爬虫的重要一环——它不依赖渲染引擎,却能精准破解前端逻辑,让数据采集回归本质:可靠、可控、可维护。










