双引擎网页抓取 + JS 交互 + SPA 渲染
L0 纯 HTTP + L1 crawl4ai 浏览器双引擎自动路由。三档内容精度控制,交互式内容提取(折叠展开/懒加载/JS 注入),exec 命令执行 JS。read_url_content 的完美替代方案。
FEATURES
L0 纯 HTTP (httpx + selectolax + markdownify) 毫秒级响应。L1 crawl4ai (Playwright) 处理 SPA 和反爬。Auto 模式自动路由。
默认: PruningContentFilter 去除噪声。精准: --selector CSS 零噪声。原始: --raw 全页。
--expand-all 展开折叠、--scroll-full 懒加载、--js 自定义JS、--wait-for 等待元素。组合使用提取 SPA 动态内容。
exec 命令:在页面上执行 JS 并返回结果。支持 --session 会话复用、--then-fetch JS 后抓取、--js-only 跳过导航。
三层策略: sitemap.xml → HTML 导航 DOM 提取 → 浏览器深度爬取 (--deep)。
从 Swagger UI / spec URL 自动发现并转换为结构化 Markdown,含参数表、Schema、响应码。
REFERENCE
页面抓取与 Markdown 转换
| 命令 | 说明 | 示例 |
|---|---|---|
fetch | 单页抓取 (自动引擎) | ./scrape fetch https://open.feishu.cn/document/... |
--engine cdp | 强制浏览器引擎 | ./scrape fetch URL --engine cdp |
--selector | 精准提取容器 | ./scrape fetch URL --engine cdp --selector ".doc-body" |
--expand-all | 展开所有折叠内容 | ./scrape fetch URL --expand-all --wait 5000 |
--scroll-full | 全页滚动触发懒加载 | ./scrape fetch URL --scroll-full |
--js | 执行自定义 JS | ./scrape fetch URL --js "document.querySelectorAll('.btn').forEach(e => e.click())" |
--js-file | 从文件执行 JS | ./scrape fetch URL --js-file /path/to/interact.js --wait 5000 |
--wait-for | 等待元素出现 | ./scrape fetch URL --wait-for ".api-response-table" |
--auto | 自动发现+抓取 | ./scrape fetch https://docs.example.com --auto -o docs/ |
--from-file | 从 URL 列表抓取 | ./scrape fetch --from-file urls.txt -o docs/ |
--merge | 合并为单文件 | ./scrape fetch --from-file urls.txt --merge -o all.md |
--raw | 全页输出 | ./scrape fetch URL --raw |
--summary-only | 仅显示摘要 | ./scrape fetch URL --summary-only |
在页面上下文中执行 JS 并取回结果
| 命令 | 说明 | 示例 |
|---|---|---|
exec | 执行 JS 返回结果 | ./scrape exec URL --js "return document.title" |
--then-fetch | JS 后抓取为 Markdown | ./scrape exec URL --js "expandAll()" --then-fetch -o /tmp/result.md |
--session ID | 复用浏览器会话 | ./scrape exec URL --session mysession --js "getState()" |
--js-only | 跳过导航 (已有会话) | ./scrape exec URL --js-only --session mysession --js "return data" |
站点结构分析与链接提取
| 命令 | 说明 | 示例 |
|---|---|---|
discover | 站点分析 | ./scrape discover https://docs.example.com |
--deep | 浏览器深度爬取 | ./scrape discover URL --engine cdp --deep --max-pages 100 |
--json | JSON 输出 | ./scrape discover URL --json |
OpenAPI/Swagger 规范提取
| 命令 | 说明 | 示例 |
|---|---|---|
openapi | 提取 API 文档 | ./scrape openapi https://api.example.com/v3/api-docs -o api.md |
从 Swagger UI | 自动发现 spec | ./scrape openapi https://api.example.com/swagger-ui/ -o api.md |
Agent 内置的 read_url_content 适用于简单静态页面,但在以下场景完全失败:
| 精度 | 方式 | 效果 | 适用场景 |
|---|---|---|---|
| 默认 | 无需额外参数 | PruningContentFilter 去除噪声 | 大多数场景 |
| 精准 | --selector ".content" | 零噪声提取 | 生产级文档 |
| 全页 | --raw | 完整页面 | 调试分析 |
精准模式工作流:先抓样本页 → 分析残留噪声 → 识别 CSS 选择器 → 批量重抓。
./scrape fetch https://open.feishu.cn/document/server-docs/im-v1/message/createAuto 引擎自动探测到 SPA → 降级到 L1 浏览器 → 输出完整 Markdown。
对于折叠内容、懒加载页面、需要 JS 交互的场景:
# 展开所有折叠/手风琴内容(通用预设)
./scrape fetch URL --expand-all --wait 5000
# 滚动触发懒加载
./scrape fetch URL --scroll-full
# 自定义 JS 点击展开按钮
./scrape fetch URL --js "document.querySelectorAll('.expand-btn').forEach(e => e.click())"
# 等待特定元素出现后再提取
./scrape fetch URL --wait-for ".api-response-table"
# 组合使用
./scrape fetch URL --expand-all --js "extraAction()" --wait-for ".loaded" -o /tmp/docs/在页面上下文中执行 JS,提取运行时数据:
# 提取页面的 JS 状态
./scrape exec URL --js "return JSON.stringify(window.__NEXT_DATA__)"
# 执行 JS 后再抓取页面
./scrape exec URL --js "expandAll()" --then-fetch -o /tmp/result.md
# 会话复用:多步交互
./scrape exec URL --session s1 --js "loginAndNavigate()"
./scrape exec URL --js-only --session s1 --js "return getData()"# 自动发现 + 批量抓取
./scrape fetch https://docs.example.com --auto -o /tmp/docs/
# 从 URL 列表抓取,合并为单文件
./scrape fetch --from-file urls.txt --merge -o /tmp/all.md文件自动使用页面标题命名(读取成员.md,Getting_Started.md)。
./scrape discover <url> --json → 获取 URL + 标题./scrape fetch --from-file urls.txt -o /path/to/docs/| 选项 | 命令 | 说明 |
|---|---|---|
--engine MODE | discover, fetch | auto (默认), http (仅L0), cdp (仅L1) |
--selector CSS | fetch, exec | CSS 选择器精准提取 |
--raw | fetch, exec | 全页输出(跳过过滤) |
--js CODE | fetch, exec | 提取前执行 JS |
--js-file PATH | fetch, exec | 从文件执行 JS |
--wait-for CSS | fetch | 等待元素出现 |
--expand-all | fetch | 展开折叠内容 |
--scroll-full | fetch | 滚动触发懒加载 |
--then-fetch | exec | JS 后抓取为 Markdown |
--session ID | exec | 复用浏览器会话 |
--js-only | exec | 跳过导航 (已有会话) |
--auto | fetch | 自动发现+抓取 |
--from-file FILE | fetch | 从 URL 列表读取 |
--merge | fetch | 合并为单文件 |
--json | discover, fetch | JSON 输出 |
--summary-only | fetch | 仅显示摘要 |
--max-pages N | discover, fetch | 限制页数 |
--deep | discover | 浏览器深度爬取 |
-o PATH | fetch, exec, openapi | 输出路径 |
curl -LsSf https://astral.sh/uv/install.sh | shweb-scraper/
├── scrape ← Bash CLI 入口 (uv 环境自启动)
├── SKILL.md ← Agent 指令文件
└── scripts/
├── engine.py ← 双引擎核心 (L0 httpx + L1 crawl4ai)
├── scrape_cli.py ← CLI 命令: discover / fetch / exec / openapi
└── pyproject.toml ← Python 依赖声明
依赖: crawl4ai (Playwright) | httpx | selectolax | markdownifyINSTALL