| name | web-scraper-comparison |
| description | 实证对比 Jina Reader、Playwright、Obscura 在文章抓取场景下的表现。结论:Jina 最适合 cron 任务,Obscura 尚未成熟。 |
| version | 1.0.0 |
| author | Hermes Agent |
| license | MIT |
| metadata | {"hermes":{"tags":["web-scraping","comparison","jina","playwright","obscura"],"category":"research"}} |
Web Scraper Comparison
结论速查
| 方案 | 速度 | 内容完整度 | 格式 | 稳定性 | 适用场景 |
|---|
| Jina Reader | 2-6s | ✓ 完整 | Markdown | 高 | cron 主力 |
| AWS RSS Feed | 快 | ✓✓ 44KB+ | HTML | 极高 | AWS Blog(最优) |
| we-mp-rss SQLite | 即时 | ✓✓ 150KB+ | HTML | 100% | WeChat(已订阅号) |
| Playwright | 7-15s | ~80% 含噪声 | Text | 中 | 需登录/交互 |
| Playwright Stealth (headless=True + init_script) | 10-15s | ✓ 完整 | Text | 中-高 | 重 bot 站 + headless/cron(无需 profile/API key) |
| Obscura | 不稳定 | 频繁失败/空 | - | 低 | 不推荐生产用 |
| TinyFish | 云端 | 中等 | 中 | 中 | WeChat 最后兜底 |
实测数据
GitHub Blog (JS 重页面)
- Jina: 45,162 chars, 2.3s ✓
- Playwright: 20,480 chars, 7.7s (含导航噪声,内容被截断)
- Obscura: TIMEOUT (页面加载但无法完成,30s+)
AWS Blog
- Jina: 21,171 chars, 6.3s ✓
- Playwright: 可用但含大量 boilerplate
- Obscura: 页面加载成功但
--dump text 返回空
WeChat 公众号
- Jina: 间歇 CAPTCHA(2026-04 正常,05 月中遇阻)
- Playwright (headless: true, desktop UA): 同样 CAPTCHA
- Playwright (headless: false, iPhone 14 Pro UA + persistent profile): ✅ bypass verify.html,反爬不触发(本地登录态 + iOS TLS fingerprint)
- Obscura: "环境异常" 验证页
知乎专栏 (zhuanlan.zhihu.com/p/<id>) — 2026-06-10 实测
- curl + Mozilla UA: HTTP 403 +
<meta id="zh-zse-ck"> JS challenge
browser_navigate (Hermes headless Chromium, 默认 desktop UA): 同 zse-ck challenge — navigator.webdriver === true 是已知 bot 签名
- Jina Reader: timeout 或空(受限代理网络)
- Zhihu JSON API (
/api/v4/articles/<id>): code 10003 "请升级客户端后重试" — client-version gated
- Zhihu OIA (
oia.zhihu.com/...): code 40362 "请求存在异常" — IP-flagged
- Playwright Profile + iPhone 14 Pro UA: ✅ bypass — ~10-15s/URL,零 API 成本。
zhuanlan.zhihu.com/p/2001069051741496397 (LastWhisper "Thinking in Context" Codex 上下文工程) 实测成功
- Playwright Stealth (headless=True + add_init_script + desktop Chrome UA): ✅ bypass — 2026-06-10 同 URL 实测成功,无需 profile warm-up、无需 GUI、无需 API key。机制:6 个 JS 可见信号补丁(webdriver / plugins / languages / permissions / chrome / WebGL vendor)。详见
content-fetching/references/playwright-stealth-headless.md
- TinyFish: ✅ 成功(需
TINYFISH_API_KEY)
关键发现 (2026-06-10): Playwright Profile 用 iPhone 14 Pro UA + 持久化 profile 是首选 last-resort for heavy Chinese bot-protected sites (Zhihu/CSDN/小红书)。机制:
- iOS Safari TLS fingerprint 与 desktop Chrome 显著不同,Zhihu 将其视为低风险移动客户端
- 持久化 profile 提供稳定的 cookie/storage state,被识别为"returning visitor"
- 已知失败模式: 仅
Object.defineProperty(navigator, 'webdriver') JS 补丁不够 — 仍会被 TLS fingerprint 拦截
2026-06-10 修正 (重要): 上一条"已知失败模式"的判断仅适用于需要 TLS fingerprint 检查的少数场景。对 Zhihu zse-ck 而言(2026-06-10 实测),所有 6 个 JS 可见信号都打补丁后即可 bypass(headless=True + desktop Chrome UA)。TLS fingerprint 检查并非所有反爬的通用前置。详见 content-fetching/references/playwright-stealth-headless.md 的 6-signal patch 清单。
详见: content-fetching/references/zhihu-and-cnsite-fetcher.md (Layer 7 完整机制 + 决策流程) + content-fetching/references/playwright-stealth-headless.md (Layer 8 通用 pattern,可复用于 CSDN/小红书等)
Obscura 已知问题
- macOS binary 不稳定: Linux binary 无法在 macOS 运行(
cannot execute binary file),macOS x86_64 binary segfault,aarch64 版本可运行但仍有稳定性问题
- JS 重页面超时: GitHub Blog、 Hacker News 等页面无法在合理时间内完成渲染
- 内容提取失败: 页面加载看起来成功,但
--dump text/markdown 返回空或 1 char
- v0.1.5 结论: 不适合作为生产 cron 任务的兜底方案
Playwright 已知问题
- 速度慢: 启动 browser + 渲染 + 提取约 7-15s,是 Jina 的 3-5x
- nav 噪声:
document.body.innerText 包含 Skip to content/sidebar 等导航噪声,需要额外清洗
- 依赖重量: 需要 chromium 安装,容器环境维护成本高
AWS Blog 最优方案:原生 RSS Feed
无需任何工具,直接用官方 RSS:
https://aws.amazon.com/blogs/machine-learning/feed/
<content:encoded> 包含完整 HTML (~44KB/篇),远超 Jina 的 21KB
- 速度极快,可靠性极高
- 无 JS 渲染问题,无 CAPTCHA
其他 AWS Blog 方案对比:
| 方案 | 内容 | 速度 | 可靠性 |
|---|
| RSS Feed ✅ | 44KB+ 完整 HTML | 快 | 极高 |
| Jina Reader | 21KB | 6s | 一般 |
| Playwright | 含噪声 | 8s | 一般 |
| Obscura | 空 | - | 失败 |
通用 RSS 发现模式:大型技术博客(AWS、Microsoft、Google 等)通常都有 /feed/ 或 ?format=rss 的原生 RSS,优先用 RSS 而非浏览器抓取。
WeChat 公众号最优方案:we-mp-rss 本地缓存
we-mp-rss Docker 容器 (localhost:8001) 已在本地缓存 659 篇带完整内容的微信文章,存在 SQLite DB。
DB 路径:docker cp we-mp-rss:/app/data/db.db /tmp/we-mp-rss.db
表结构:
conn = sqlite3.connect('/tmp/we-mp-rss.db')
cursor.execute("SELECT content_html FROM articles WHERE url = ?", (article_url,))
row = cursor.fetchone()
if row:
html_content = row[0]
已订阅的号(20个):阿里云开发者、机器之心、AGI Hunt、架构师、量子位、新智元、腾讯技术工程、AI寒武纪、技术极简主义、腾讯研究院等。
RSS 接口:http://localhost:8001/rss/{mp_id} 提供单个订阅号完整内容。
cron 任务中的用法:
Jina 失败(WeChat CAPTCHA)
→ 查询 we-mp-rss SQLite by URL
→ 缓存命中 → 用 content_html 入库(100% 成功)
→ 缓存未命中 → TinyFish 兜底
推荐的分层策略
第1层: Jina Reader (r.jina.ai) → 覆盖 80%+,速度快,内容干净
失败 →
第2层: 目标平台专用方案
├─ AWS Blog → 原生 RSS Feed
├─ WeChat(已订阅) → we-mp-rss SQLite 本地缓存
└─ Zhihu (zhuanlan) → **Playwright Profile + iPhone 14 Pro UA** (首选,零成本)
OR **Playwright Stealth (headless=True + init_script)** (headless/cron)
失败 →
第3层: Playwright Profile (其他需登录/反爬重的中文站)
失败 →
第3.5层: Playwright Stealth (headless=True + init_script) — 2026-06-10
→ 重 bot 站通用 pattern,适用于 cron/SSH,无需 profile/API key
→ 6-signal patch 详见 content-fetching/references/playwright-stealth-headless.md
失败 →
第4层: TinyFish 兜底(需 TINYFISH_API_KEY)
失败 →
标记失败 + 人工介入
原则:优先用平台原生方案(RSS/本地缓存),其次才是通用抓取工具。重 bot 中文站(Zhihu/CSDN/小红书)现已统一收敛到两个 Playwright 变体:(a) Profile + iPhone UA for GUI/local Mac, (b) headless + init_script stealth for cron/SSH/headless Linux。两种都能绕过 zse-ck,选择取决于运行环境(GUI 可用性 + 是否需要持久登录态)。
何时考虑 Playwright
- 需要登录 Cookie/Session 的页面
- 需要截图或视觉验证
- 复杂多步交互(填表 → 提交 → 抓结果)
- 重 bot 中文站 (Zhihu/CSDN/小红书) — 用
headless: false + iPhone 14 Pro UA + 持久化 profile,详见 content-fetching/references/zhihu-and-cnsite-fetcher.md Layer 7
- 不推荐: 批量文章抓取(速度+噪声问题)
何时考虑 Obscura
当前:不推荐生产使用。等待版本成熟后重新评估。
Jina Reader 已知局限
- WeChat/部分国内平台间歇性 CAPTCHA
- 部分 paywall 页面无法穿透
- 速度受目标站点的 robots.txt 约束