1. 项目概述与核心痛点
如果你用过一些AI助手来处理网页内容,比如让它帮你总结一篇公众号文章,或者查看一个GitHub仓库的README,你可能会遇到一个让人头疼的问题:你明明已经把链接直接发给了它,但它却像没看见一样,转头又去搜索引擎里搜了一圈,最后给你一个基于搜索结果摘要的、可能不完整甚至过时的答案。更糟的是,对于一些动态内容平台,比如小红书、知乎,或者需要登录才能完整查看的页面,普通的网页抓取工具(web_fetch)常常会败下阵来,返回一个“页面加载失败”或者只抓取到一堆JavaScript代码,看不到真正的用户内容。site-navigator这个OpenClaw技能项目,就是专门为了解决这个“最后一公里”的访问难题而生的。
简单来说,site-navigator不是一个新造的浏览器,也不是一个替代OpenClaw现有工具(如browser或web_fetch)的轮子。它更像是一个经验丰富的“导航员”或“策略引擎”。当AI智能体(Agent)面对一个用户提供的具体链接时,这个技能会指导它:“别急着去搜,先试试直接打开这个链接看看。如果打不开或者内容不全,我们再想想别的办法,比如用能执行JavaScript的浏览器去渲染页面。我们的目标是直达内容本身,而不是在信息的边缘打转。”这个项目的价值在于,它将零散的网页访问经验(比如如何识别知乎的文章页、如何判断公众号文章是否加载完整)系统化、规则化,让AI在处理这类任务时变得更聪明、更直接,同时也更省钱——因为它能有效减少对付费搜索API的不必要调用。
1.1 核心需求解析:从“能访问”到“会访问”
为什么我们需要一个专门的“导航”技能?这源于几个在自动化网页处理中非常具体的痛点:
第一,链接的“无效直达”问题。用户提供一个B站视频链接,AI用web_fetch去抓取,很可能只拿到一个需要客户端渲染的SPA(单页应用)骨架,真正的视频标题、简介、评论都拿不到。这时,AI需要有能力判断:“静态抓取失败了,我应该切换到browser工具去模拟真实浏览器打开。”
第二,平台的“动态墙”问题。像小红书、微信公众号这类平台,反爬机制复杂,内容动态加载。一个简单的GET请求往往吃闭门羹。site-navigator的目标是积累对这些特定平台的“作战经验”,形成模式(Patterns)。例如,它可能包含这样一条经验:“对于xiaohongshu.com域名的链接,首次尝试web_fetch若返回状态码403或内容为空,应直接建议使用browser进行渲染访问,并注意页面可能存在的登录弹窗拦截。”
第三,任务路径的“策略选择”问题。这是更高级的痛点。假设任务是“查看用户yandong2023在GitHub上的site-navigator项目最新issue”。一个幼稚的策略可能是:1. 用搜索API搜索“yandong2023 site-navigator issue”;2. 从结果中找一个链接;3. 再访问。而一个优化的、由site-navigator指导的策略是:1. 直接拼接已知模式,访问https://github.com/yandong2023/site-navigator/issues;2. 如果页面正常打开,则直接读取;3. 如果重定向或报错,再考虑辅助搜索。后者路径更短、成本更低、结果更可靠。
第四,证据的“强弱判断”问题。AI在回答时,需要知道自己结论的依据是否可靠。site-navigator引入了“证据层级”概念。来自搜索引擎摘要的二手信息是“弱证据”,而直接从目标网站一手页面完整渲染并提取的内容是“强证据”。技能会指导AI优先追求并报告强证据,避免基于碎片信息做出武断结论。
这个项目的本质,是将人类处理棘手网页时的直觉和经验(试探、回退、切换方法、识别页面状态)编码成AI可理解和执行的策略,让AI从“拥有访问工具”进化到“懂得如何有效使用工具”。
2. 架构设计与核心组件拆解
site-navigator的架构清晰体现了其“策略层”的定位。它不包含任何运行时代码,而是由一系列Markdown文档构成的“知识库”和“决策树”。这些文档被设计成能被OpenClaw的智能体读取和理解,从而影响其决策过程。整个架构可以看作一个分层处理的决策系统。
2.1 技能触发与路由层 (SKILL.md)
这是整个技能的入口和总调度中心。它定义了何时启用site-navigator策略。通常,触发条件包括:用户输入中包含明确的URL(http/https开头);或任务描述中提及“打开链接”、“查看页面”、“阅读文章”等意图,且目标平台是已知的困难平台(如小红书、知乎)。
一旦触发,SKILL.md中的逻辑会引导智能体进行初始路由决策。这个决策主要基于两个关键判断:
- 目标页面类型判断:这是“发现页”还是“内容页”?例如,
zhihu.com/question/123456可能是一个问题列表页(发现页),而zhihu.com/question/123456/answer/987654才是一个具体的答案页(内容页)。策略会建议,对于发现页,可能需要进一步导航;对于内容页,则可以尝试直接提取。 - 初始访问方法选择:优先尝试轻量的
web_fetch(速度快、成本低),还是直接启用重型的browser(兼容性好、能执行JS)?选择依据包括域名模式(已知的困难站点可能直接建议用browser)、历史经验以及任务对交互性的要求(如需要点击“展开全文”)。
实操心得:在编写你自己的路由规则时,一个非常实用的技巧是建立“域名-方法”的映射快查表。例如,你可以用简单的规则定义:
*.weixin.qq.com->优先 browser(因为公众号文章常需JS渲染);*.github.com->优先 web_fetch(因为GitHub的API和静态化做得较好)。这个表可以随着经验积累不断更新。
2.2 浏览器操作手册层 (references/openclaw-browser-playbook.md)
这是针对browser工具的“最佳实践”指南。直接调用浏览器自动化有很多坑:页面加载不稳定、元素定位失败、意外弹窗阻塞等。本层文档旨在让智能体更“稳健”地使用浏览器。
其核心思想是“快照优先”。即,在通过浏览器与页面进行任何交互(点击、滚动、输入)之前,先获取当前页面的完整快照(截图或DOM状态)。基于这个快照来分析页面状态:是否加载完全?是否出现了登录框?目标内容是否可见?然后,再决定下一步交互指令。这避免了在页面状态未知的情况下盲目操作导致的失败。
文档还会包含诸如“如何处理无限滚动页面”、“如何等待特定元素出现再继续”、“如何优雅地处理超时和网络错误”等具体模式。例如,对于B站视频页,策略可能是:“等待.video-info这个CSS选择器对应的元素出现,如果超过10秒未出现,则判定为加载失败,触发恢复流程。”
2.3 证据与输出规范层 (references/source-hierarchy.md,references/output-contract.md)
这一层规定了智能体应该如何“思考”和“说话”。
source-hierarchy.md建立了证据可信度的金字塔模型。通常层级如下(从高到低):
- 直接渲染内容:通过
browser工具获取的目标页面完整渲染文本。 - 直接API响应:从目标站点官方API获取的结构化数据。
- 静态页面抓取:通过
web_fetch获取的完整HTML正文(经Readability等工具清理后)。 - 官方文档/公告:站点内的帮助页面或公告。
- 第三方摘要/转述:搜索引擎结果摘要、其他网站的转载内容。
output-contract.md则规定了输出格式。例如,任何基于网页的回复都应包含:
- 来源声明:“根据对 [页面标题] (URL) 的直接访问...”
- 访问方法:“(通过浏览器渲染获取)” 或 “(通过静态抓取获取)”
- 内容状态:“页面加载完整,主要内容已提取。” 或 “页面部分内容需要交互(如登录),以下为可见部分摘要。”
- 置信度提示:如果证据较弱,需要说明“此信息基于页面摘要,建议直接访问链接核实”。
2.4 任务模式与失败恢复层 (references/task-patterns.md,references/failure-recovery.md)
task-patterns.md对常见任务进行了抽象分类。比如:
- “阅读文章”模式:目标是一篇完整的文本内容。关键步骤是:抵达文章页 -> 提取正文 -> 忽略侧栏和评论。
- “查看仓库”模式:目标是GitHub仓库主页。关键步骤是:抵达仓库URL -> 提取README -> 关注Star/Fork数等关键指标。
- “验证页面”模式:目标是确认某个链接是否有效或是否为预期页面。关键步骤是:访问URL -> 检查HTTP状态码和标题 -> 比对页面关键元素。
failure-recovery.md是整个技能的“安全网”。它定义了当首选方法失败后的备选路径。这是一个典型的决策流:
- 尝试
web_fetch-> 失败(如403错误)。 - 切换到
browser渲染 -> 成功,但页面要求登录。 - 评估:当前上下文是否有可用登录态?无。
- 执行恢复:返回结果,声明“页面需要登录,当前无法获取完整内容。可见部分为...”。
- 同时,记录该URL模式与“需要登录”的关联,未来类似情况可更快决策。
2.5 站点经验沉淀层 (references/site-patterns/*.md)
这是项目的“记忆库”和长期价值所在。每个文件对应一个特定站点的导航经验。例如,zhihu.md可能包含:
- URL模式识别:
/question/\d+/answer/\d+是答案页;/question/\d+是问题页(可能包含多个答案)。 - 内容定位器:答案正文通常位于CSS选择器
.RichContent-inner内。 - 交互点:“展开全文”按钮的识别与点击逻辑。
- 常见陷阱:知乎有时会弹出模态框,干扰抓取,需要先关闭。
- 备用方案:如果桌面版页面复杂,可以尝试切换移动端UA访问
zhihu.com的移动版页面,其结构通常更简单。
通过这种方式,智能体不是每次从零开始探索一个网站,而是可以“查阅”前人(实际上是之前的任务执行)总结的经验手册,快速应用最佳实践。
3. 实战部署与集成指南
理解了架构之后,如何将site-navigator真正用起来?以下是基于开源项目惯例和OpenClaw生态的实践指南。
3.1 环境准备与技能安装
首先,你需要一个已经部署好的OpenClaw环境。OpenClaw通常是一个允许你定义和运行AI智能体工作流的框架或平台。site-navigator作为技能,需要被放置在该环境能够加载的路径下。
步骤一:获取技能文件。最直接的方式是从GitHub仓库克隆:
git clone https://github.com/yandong2023/site-navigator.git这会在本地创建一个site-navigator目录,里面包含了所有核心的Markdown文档。
步骤二:集成到OpenClaw。具体集成方式取决于你的OpenClaw部署模式。常见的有两种:
- 作为全局技能:将整个
site-navigator目录复制到OpenClaw配置中指定的全局技能目录下(例如~/.openclaw/skills/)。这样,所有在该环境中的智能体都可以引用这个技能。 - 作为项目依赖:在你的具体OpenClaw项目(或“工作流”)目录下,创建一个
skills/子目录,将site-navigator放进去。然后在你的工作流配置文件中,通过相对路径引用它。这种方式更灵活,便于版本管理和项目隔离。
步骤三:验证加载。在你的OpenClaw智能体定义或提示词(Prompt)中,尝试引用site-navigator中的概念。例如,在给智能体的系统指令中增加:“当处理用户提供的直接链接时,请参考site-navigator技能中的策略,优先尝试直接访问并评估页面状态。” 然后运行一个测试任务,观察智能体的决策过程是否发生了变化(例如,是否更少地直接调用搜索API)。
3.2 核心工作流解析
集成后,一个嵌入了site-navigator策略的智能体,处理一个链接任务的工作流大致如下:
- 接收与解析任务:用户输入:“帮我总结一下这个链接的内容:https://mp.weixin.qq.com/s/abc123...”
- 技能触发:智能体识别出输入包含明确URL,且域名为
weixin.qq.com(微信公众号)。触发site-navigator技能。 - 初始路由:查询
site-patterns/wechat.md(如果存在)或通用规则。得知微信公众号文章页JS渲染较多,静态抓取成功率低。决策:跳过web_fetch,直接使用browser工具。 - 浏览器执行:遵循
openclaw-browser-playbook.md指南。首先导航至该URL,等待页面加载(例如,等待包含文章正文的特定元素出现)。获取页面快照和渲染后的文本。 - 状态判断与内容提取:判断页面是否成功加载(标题是否为“公众号文章”而非“登录”)。如果成功,使用定位器提取正文区域内容。如果发现需要登录的弹窗,则进入失败恢复流程。
- 证据评估与输出:根据
source-hierarchy.md,本次获取的内容属于“直接渲染内容”,为最高置信度。按照output-contract.md格式组织回答:“根据对公众号文章《XXX》页面的直接访问(通过浏览器渲染),文章主要内容如下:...” - 经验沉淀(可选):如果本次处理发现了新的模式(例如,该公众号文章有一种新的反爬机制),可以将此经验更新到
site-patterns/wechat.md中,供未来任务参考。
3.3 针对特定平台的配置要点
不同的平台需要不同的策略微调。以下是一些关键平台的实战注意事项:
- 微信公众号:最大的挑战是反爬和登录墙。策略上必须依赖
browser。在Playbook中,需要配置更长的页面等待时间,并准备好处理“请先登录”的模态框。一个技巧是,检查页面标题或主要区域是否包含“登录”二字,如果是,则立即判定为失败,避免无谓等待。 - 小红书:与公众号类似,动态加载和登录要求高。除了使用
browser,在site-patterns/xiaohongshu.md中可以记录内容容器的常见CSS选择器,如.note-content。注意,小红书移动端页面可能比桌面端更友好。 - 知乎:混合型。公开的问答页面有时可通过
web_fetch获取基础内容,但“展开全文”和评论区必须用browser。策略可以是:先web_fetch,如果获取内容简短且包含“展开”字样,则自动触发升级到browser。 - B站:视频信息页面结构化程度高。可以优先尝试
web_fetch获取JSON-LD等结构化数据。如果失败,再用browser获取渲染后的文本。对于视频本身,site-navigator的策略可能仅限于获取元信息(标题、UP主、简介),而非处理视频流。 - GitHub:对自动化相对友好。公开仓库的README、Issue、Code都可以通过
web_fetch高效获取。browser主要用于需要渲染Markdown或处理复杂交互(如查看GitHub Actions运行日志)的场景。在site-patterns/github.md中可以定义各种页面类型(repo, issue, pr, wiki)的内容定位器。
注意事项:在配置浏览器自动化时,务必遵守目标网站的
robots.txt协议,并设置合理的请求间隔,避免给对方服务器造成压力,这既是法律和道德要求,也能保证你的访问IP不被封禁。
4. 效能提升与成本优化实践
引入site-navigator不仅是为了提高访问成功率,另一个重要驱动力是优化成本,特别是减少对昂贵付费搜索API的调用。
4.1 建立“链接优先”的成本意识
许多AI工作流设计有一个惯性:无论用户输入什么,第一步总是“搜索”。对于模糊查询这没问题,但对于一个具体的URL,搜索是多余且低效的。假设调用一次付费搜索API(如Brave Search)的成本是0.01美元,而一次直接的web_fetch或browser调用成本几乎可以忽略不计(自托管情况下主要是计算资源)。那么,将“打开用户提供的GitHub链接”这个任务从“先搜索再访问”改为“直接访问”,每次任务就能节省0.01美元。
site-navigator通过明确的策略规则,在智能体心中植入了这种“成本-路径”意识。在SKILL.md或task-patterns.md中,可以明确写出规则:“对于格式匹配https://github.com/{owner}/{repo}的输入,任务类型为‘查看仓库’,首选路径为‘直接访问’,禁用初始通用搜索步骤。”
4.2 分层降级策略与资源消耗平衡
成本优化不仅是省搜索的钱,也包括合理分配计算资源。browser工具虽然强大,但启动慢、内存占用高。site-navigator的分层策略本身就是一种资源优化:
- 第一层(成本最低):尝试
web_fetch。适用于静态或半静态页面(如GitHub README、技术博客)。速度快,资源消耗极小。 - 第二层(成本中等):若第一层失败或内容不完整,启动
browser,但采用“快照优先”模式。即,打开页面,渲染,提取文本,然后立即关闭浏览器标签或实例,避免长时间占用。 - 第三层(成本最高):仅在前两层都无法获取足够信息,且任务确实需要交互(如翻页、点击)时,才进行持续的浏览器交互。
通过failure-recovery.md来管理这些层的切换,确保智能体不会一上来就使用“大炮打蚊子”,也不会在轻量方法无效时卡住。
4.3 效果评估与策略迭代
部署site-navigator后,如何衡量其效果?可以关注以下几个指标:
- 直接访问成功率:对于用户提供的直接链接,智能体不经过搜索直接尝试访问的成功比例。
- 任务完成时间:对比使用技能前后,处理同类链接任务的平均耗时。
- 搜索API调用量:统计周期内,付费搜索API调用次数的下降比例。
- 用户满意度:通过反馈或结果质量评估,看总结的内容是否更准确、更完整。
建议在测试初期,对智能体的决策过程进行日志记录。例如,记录每个链接任务:触发了哪个技能、选择了哪条路径、各步骤的成功/失败状态、最终结果的信源级别。分析这些日志,可以发现哪些平台的模式需要优化,哪些失败恢复规则不生效,从而持续迭代site-patterns和failure-recovery中的内容。
5. 常见问题排查与进阶技巧
在实际运行中,你可能会遇到一些典型问题。以下是基于经验的排查思路和进阶使用方法。
5.1 典型问题速查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 智能体完全忽略链接,仍去搜索。 | 1.site-navigator技能未正确加载或集成。2. 系统提示词中未强调“链接优先”策略。 3. 链接格式未被技能触发规则识别。 | 1. 检查技能文件路径,确认OpenClaw能读取到。 2. 强化系统指令,明确“若输入包含URL,首先尝试直接访问”。 3. 检查 SKILL.md中的触发条件,确保其能匹配你的输入格式。 |
web_fetch总是返回403或空内容。 | 目标网站有较强的反爬机制(如小红书、微信公众号)。 | 1. 在site-patterns中为该域名添加规则,标记为“需用browser”。2. 检查 web_fetch是否可配置User-Agent或Headers,尝试模拟常见浏览器。 |
browser启动后页面白屏或卡住。 | 1. 页面加载超时。 2. 浏览器驱动版本与实际浏览器不匹配。 3. 网络问题。 | 1. 在Playbook中增加页面加载超时时间和等待特定元素出现的逻辑。 2. 确保Chromedriver等驱动版本与安装的Chrome/Firefox版本兼容。 3. 检查代理或防火墙设置。 |
| 成功打开页面但提取不到正确内容。 | 1. 内容定位器(CSS选择器)过时或错误。 2. 页面内容为异步加载,提取时尚未就绪。 | 1. 手动打开目标页面,使用开发者工具检查元素,更新site-patterns中的定位器。2. 在Playbook中增加滚动页面或等待网络空闲的逻辑,确保内容加载完成。 |
| 遇到登录墙,流程中断。 | 目标页面需要认证,而自动化环境无有效登录态。 | 1. 在failure-recovery.md中为此类情况定义优雅的失败处理:记录状态,返回“需要登录”的提示。2. (进阶)考虑在安全的、可控的环境下,为浏览器实例预注入Cookie或使用已登录的浏览器配置文件。注意:此操作涉及账号安全,需谨慎评估风险。 |
5.2 进阶技巧:构建你自己的站点模式库
site-patterns是项目的精髓。你可以像维护一个知识库一样来建设它。每遇到一个新的、难以处理的网站,就为它创建一个.md文件。文件内容可以遵循以下结构:
# 站点名 (example.com) ## 识别特征 - 域名模式:`*.example.com` - 典型URL路径:`/article/{id}`, `/user/{name}` ## 访问策略 - 首选方法:`browser` (因大量JS渲染) - 备用方法:无(静态抓取无效) ## 内容定位 - 文章标题:`h1.article-title` - 正文区域:`div.content-body` - 下一页按钮:`a.next-page` (用于分页处理) ## 常见陷阱 - 页面加载5秒后会出现广告弹窗,选择器为 `.ad-modal`,需关闭。 - 移动端页面URL为 `m.example.com`,结构更简单,可优先尝试。 ## 备注 - 该站点对高频访问敏感,建议在Playbook中设置至少5秒的延迟。通过这种方式,你的智能体处理这个站点的能力就会随着每一次任务执行而不断增强。
5.3 与现有工作流的融合
site-navigator不是一个孤立的系统,它可以与你现有的OpenClaw工作流深度结合。例如:
- 与知识库结合:将从链接中提取的优质内容,经过清洗后存入向量数据库,丰富智能体的知识背景。
- 作为子流程:在一个复杂的分析任务中,如果某个步骤需要获取特定网页信息,可以调用嵌入了
site-navigator策略的子智能体来专门负责。 - 结果后处理:获取原始网页内容后,可以链接到其他的文本处理技能,如摘要总结、情感分析、关键信息提取等,形成端到端的自动化管线。
这个项目的魅力在于,它始于一个具体的痛点——链接访问不靠谱,但最终构建的是一套让AI更懂如何与现实世界复杂系统(即各类网站)交互的方法论。它不需要你重写核心的抓取或渲染引擎,而是通过策略和经验的积累,让已有的工具发挥出十倍的功效。随着你处理的链接越来越多,你的site-patterns库会越来越丰富,你的智能体也会变得越来越“老练”,真正成为一个能替你顺畅浏览网页、获取信息的得力助手。