用途:将一个 URL(或整站)的内容转为干净的 markdown,落盘到 raw/ 或 wiki 草稿,绝不保留原始 HTML,以节省 token 并得到清晰文本。适用于用户给出 URL 想抓取内容、把外部文档/文章拉入 raw/ 或 wiki 草稿,以及为研究批量读取多页。非目标:不克隆页面外观(那是 /web-clone),不直接写入 wiki/(需经 /propose 或 ingest),不抓取需登录或站点禁止的内容。
流程:URL → 后端(会话内 WebFetch、内置 urllib+regex、premium 适配器 firecrawl/crawl4ai/jina)→ markdown → raw/ 或 wiki 草稿 → /propose 或 ingest → wiki。
主要能力与用法:
- JS 较重或需渲染的页面,若在智能体会话中,优先用会话内 WebFetch(可渲染 JS 并返回 markdown),无需配置。
- 脚本化、单页静态抓取(离线、无密钥):python3 harness/scripts/web-crawl.py fetch "<URL>" --out raw/<slug>.md。内置后端刻意保持基础:urllib 抓取 + 正则 HTML→markdown,无 JS 渲染、仅单页、无智能抽取,是离线兜底而非 Firecrawl 品质。
- 已有本地 HTML:web-crawl.py md <file.html>。
- 真正抓取(JS 渲染、整站、干净抽取)需接入 premium 后端:在 harness/web-crawl.config.yaml 中配置 backend: firecrawl|crawl4ai|jina 及 api_key_env/endpoint,然后将 verified:true。Firecrawl(托管、crawl-to-markdown、约 5-10 倍 token 缩减、提供 MCP)或 Crawl4AI(开源、自托管、自适应选择器)。
- 落盘后保存 markdown 到 raw/ 或 wiki 草稿,再用 /propose 或 ingest 把提炼内容带入 wiki,绝不直接写 wiki/。
限制与失败边界:必须输出 markdown 而非原始 HTML;须遵守 robots.txt 与站点条款,不抓取需登录或禁止内容;内置后端是离线兜底,premium 后端未接好时不得宣称其可用。仅内置且页面为 JS 渲染时结果不完整;未接 premium 却要求整站抓取会被配置阻断(内置仅支持单页),应如实说明。抓取错误需报告 URL 与错误。健康检查:python3 harness/scripts/web-crawl.py --self-test 通过即后端正常。完成标准是 markdown 文件已存在于 raw/ 或草稿,且回复中说明所用后端。相关:harness/scripts/web-crawl.py 与 harness/web-crawl.config.yaml。