反爬虫绕过工具链
工具升级路径
curl ──(被拦截)──→ Playwright ──(被拦截)──→ 真实 Chrome + CDP逐级升级,能用简单工具就不上复杂方案。
各级工具对比
| 工具 | 优点 | 局限 | 被拦截特征 |
|---|---|---|---|
| curl / wget | 最快、可脚本化、无依赖 | 无 JS 执行,UA/TLS 指纹明显 | 403、HTML 错误页、空响应 |
| Playwright / Puppeteer | 真实渲染、可交互 | navigator.webdriver=true,自动化 TLS 指纹 | Akamai / Cloudflare 检测页 |
| 真实 Chrome + CDP | 完全真实浏览器指纹 | 启动慢、不易并发 | 极少被拦 |
真实 Chrome + CDP 方法
适用于被 Akamai Bot Manager、Cloudflare Turnstile 等高级反爬拦截的场景。
1. 启动 Chrome
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
--remote-debugging-port=9222 \
--disable-blink-features=AutomationControlled2. 通过 playwright-core 连接
const { chromium } = require('playwright-core');
const browser = await chromium.connectOverCDP('http://127.0.0.1:9222');
const context = browser.contexts()[0];
const page = context.pages()[0];3. 在浏览器上下文内下载文件
利用浏览器自身的网络栈(带 cookies、TLS 指纹等),绕过服务端检测:
const bytes = await page.evaluate(async (url) => {
const r = await fetch(url);
return Array.from(new Uint8Array(await r.arrayBuffer()));
}, targetUrl);
require('fs').writeFileSync(filePath, Buffer.from(bytes));关键点:fetch 在页面上下文执行,走的是浏览器真实网络栈,不是 Node.js 侧发起的请求。
实测记录
| 站点 | curl | Playwright | 真实 Chrome + CDP |
|---|---|---|---|
| HKEX 披露易 | ✅ | ✅ | — |
| 巨潮资讯 | ✅ | ✅ | — |
| NASDAQ IR(京东/拼多多/蔚来) | ❌ | ❌ Akamai | ✅ |
| SEC EDGAR | ❌ 403 | ✅ (需 UA) | ✅ |
遇到新站点时补充此表。