拆解 insane-search 核心架构:Phase 0→3 自适应调度器如何逐层突围 WAF
【免费下载链接】insane-searchAuto-bypass for blocked websites in Claude Code — Phase 0→3 adaptive scheduler, no API keys项目地址: https://gitcode.com/gh_mirrors/in/insane-search
insane-search 是面向 Claude Code 的公开页面读取器,它的灵魂是一套Phase 0→3 自适应调度器:当普通抓取遇到403、反爬(WAF)或 JS 挑战时,它按"最便宜的公共路由优先"原则逐层升级,直到某条路走通为止,全程无需 API key、无需代理配置。这篇文章带你从零看懂它如何把一堵"403 Forbidden"的墙,变成可用的干净文本。
WAF 拦截的四种形态:为什么需要"逐层升级"
传统爬虫一遇到拦截就"认输",而 insane-search 的设计哲学是——不预判、只升级。它把拦截信号分成几类,每一类都对应不同的"突围武器":
| 拦截信号 | 典型表现 | 触发的升级动作 |
|---|---|---|
| WAF / 机器人拦截 | 403、cf-ray、_abck、datadome等特征 | 进入 TLS 指纹伪装 |
| 限流 | 429/503 | 先带抖动(jitter)重试,失败再升级 |
| JS 挑战页 | "Just a moment…"、验证码 | 直接进入真实浏览器 |
| 空壳 SPA | 200 但内容<200字符 | 用渲染器抓取 |
这套"信号 → 升级"的判定逻辑,集中在 fallback.md 里定义,是整个调度器的"决策表"。
Phase 0:优先走官方公开 API,成本最低
有官方公开接口的平台(Reddit、X、YouTube、Hacker News、arXiv…)会被优先命中专用路由,因为它们最准、最省。调度器在进入通用抓取链之前,先查这张"平台索引表":
- Reddit →
.rss源(无鉴权.json如今常被 WAF 拦成 403) - X 单条推文 →
tweet-result/ oEmbed,时间线 → syndication - YouTube →
yt-dlp元数据 - Threads 视频 → 内联
video_versionsJSON
这一步由 phase0.py 中的平台识别函数完成,它也是引擎里唯一被允许写平台域名的文件——这是刻意保留的"官方通道例外",详见 PLATFORMS.md。
Phase 1:轻量探针 + URL 变体,覆盖通用网站
没有专用 API 的普通网站(博客、电商、论坛)走通用抓取链。它会并行抛出多条轻探针,再叠加一系列 URL 变形,命中即止:
- 内置 WebFetch、Jina Reader、Chrome 桌面 UA 直连
- 移动端 UA +
m.子域变形、.json//rss//feed变体
URL 变形规则由 url_transforms.py 统一管理,而整个抓取链的编排、重试与结果封装在 fetch_chain.py 中。它的关键约束是——第一个 200 不算赢,必须通过下面的 4 层校验才算数。
Phase 2:TLS 指纹伪装,骗过 Akamai / Cloudflare
当探针被 WAF 挡住,调度器升级为TLS 指纹伪装:不只是换个 User-Agent,而是用curl_cffi模拟 safari → chrome → firefox 的完整 TLS 指纹(JA3/JA4),并搭配 cookie 预热、referer 链路,"看起来像真人"。
它面对的是按 WAF 产品(而非具体网站)维护的画像库 waf_profiles.yaml,例如 Akamai Bot Manager 会标注出所需能力标签(needs_real_tls_stack、needs_js_exec、needs_protocol_stealth),以及历史上会立刻 403 的"黑名单指纹"。检测算法见 waf_detector.py。
| WAF 产品 | 典型检测特征 | 需要的能力 |
|---|---|---|
| Akamai Bot Manager | _abck、bm_sz、X-Akamai-* | 真实 TLS + JS 执行 + 协议隐身 |
| Cloudflare Turnstile | cf-ray、__cf_bm | JS 执行 + 协议隐身 |
| AWS WAF | aws-waf-token | 真实 TLS 栈 |
Phase 3:真实无头浏览器,渲染 JS 挑战页
指纹伪装也过不了时(典型是 JS 挑战 / 验证码),调度器动用真实浏览器渲染。executor.py 会按画像的能力标签,自动挑选最合适的执行器:
- 仅需 JS 执行 → Playwright(MCP)
- 需要真实 TLS 栈 → 本地 Node + 系统 Chrome 模板
- 需要协议隐身 → nodriver / patchright 模板
这些可复用的浏览器脚本放在 templates/ 目录。浏览器默认以有头(headful)模式运行——因为 headless Chrome 的指纹信号太容易被 Cloudflare 识破。
4 层校验:为什么 HTTP 200 不等于成功
贯穿所有阶段的一道"安全阀"是 4 层 AND 校验,由 validators.py 中的validate()实现:
- 无挑战标记——命中 "Just a moment…"、"Access Denied" 等硬标记即判失败
- 尺寸正常——过小(如 <3KB 或等于 WAF 特征尺寸)判为挑战页
- Cookie 传感器正常——如 Akamai 的
_abck未解状态 - 内容选择器命中——调用方提供选择器则给
strong_ok,否则weak_ok
此外,所有响应都会顺带扫描 OGP / JSON-LD,即使只拿到"半页",也能榨出标题、摘要、价格等结构化信息。而抓取到的网页正文一律按不可信数据处理(见 content_safety.py),页面里的任何"指令"都不会被执行。
它只读公开内容,遇到登录墙会如实停下
最后必须说清它的边界:insane-search 是一个公开内容读取器,不是绕过鉴权的工具。
- ✅ 走公开页面、公开 API、RSS、归档、浏览器的公开响应
- ❌停在登录墙和付费墙——检测到即如实返回
authentication required,绝不假装破解 - 从不以你的身份登录,从不存储或传输凭证
一句话总结这套架构:它不是更聪明地猜,而是"最便宜的路先走,一路走通为止"——这正是 Phase 0→3 自适应调度器能稳定突围 WAF 的关键。如果你想深入各阶段细节,建议从 SKILL.md 与 references/ 目录读起。
【免费下载链接】insane-searchAuto-bypass for blocked websites in Claude Code — Phase 0→3 adaptive scheduler, no API keys项目地址: https://gitcode.com/gh_mirrors/in/insane-search
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考