# Web 工具 · 搜网页与抓网页

> grok 伸到代码库之外靠两个工具：web_search 走服务端（xAI Responses API 的搜索能力），web_fetch 走客户端（reqwest 抓页面、htmd 转 markdown、还带 SSRF 防护）。这一章讲清两者的分工与那些安全细节。

- 作者：David（道雾轩）
- 专栏：Grok Build 源码解读（https://daiw.org/manual/grok-build.md）
- 最后更新：2026-09-15
- 原文：https://daiw.org/manual/grok-build/web-tools
- 转载与引用：请注明出处并附原文链接（https://daiw.org/about/copyright）

# Web 工具 · 搜网页与抓网页

有时候答案不在代码库里，在网上——查个 API 文档、看个报错。grok 伸到外面靠两个工具，一个走服务端、一个走客户端，分工清楚。

## `web_search`：服务端搜索

id `web_search`(kind `WebSearch`，只读)。参数 `query` + 可选 `allowed_domains`。关键：它**不是本地爬虫**，而是调 xAI 的 **Responses API 的 web-search 能力**——搜索在服务端做，回来带 `content` 和 `citations`(引用)。这也呼应了[三种 API 流](https://daiw.org/manual/grok-build/api-streams)里提到的**后端托管工具**：模型请求里带上 web-search，结果由服务端 agentic sampler 执行。

## `web_fetch`：客户端抓取

id `web_fetch`(kind `WebFetch`，只读)。参数就一个 `url`。这个走**客户端**：`reqwest` 抓页面 → 用 **`htmd`** 把 HTML 转成 markdown(剥掉 `<script>`/`<style>`)，对文档站还会优先带 `text/markdown` 的 Accept 头以跳过转换。

它的安全细节值得看：

- **SSRF 防护**(`ssrf.rs`)：防模型被诱导去抓内网地址(`169.254.169.254` 这类元数据端点)。默认挡掉一切非公网地址(回环、RFC 1918、链路本地、CGNAT……)，只有显式打开 `allow_local` 才放行明确的回环主机。这是「让 agent 访问任意 URL」时必须堵的洞。
- **HTTP 自动升 HTTPS**、长页面截断、`DomainMatcher` 域名控制、结果缓存。
- **对需要登录的 URL 会失败**并明说——它不带你的 cookie。

<Callout type="info">
  一个诚实的观察：开源的 grok 仍**没有可用的「computer use / 浏览器操作」工具**。有意思的是，仓库里已经出现一份 `browser_tab` / `browser_network_details` 工具的端到端测试(`tests/browser_tab_chrome_e2e.rs`，驱动真 Chrome)，但它依赖的 `xai-grok-browser-tools` crate 和 `browser` feature 都不在公开仓库里。所以对外的触手仍是这两个 web 工具(加上服务端的 `x_search`)——知道一个系统**没做什么**(或者没放出来什么)，和知道它做了什么同样重要。
</Callout>

## 和《从 LLM 到 Coding Agent》对照

对照 [tool-use](https://daiw.org/manual/llm-to-agent/tool-use)：教学实现里加个 web 工具就是 `fetch(url)`。grok 的增量在两处：一是把搜索做成**服务端托管**(省得客户端维护搜索基建、还能用上服务端的实时索引)，二是抓取侧的 **SSRF 防护 + HTML→markdown 清洗**——让「读网页」既安全又对模型友好。

至此工具能力盘完。Part 2 最后一章看一个我觉得最有意思的设计：grok 怎么**假装成别家 agent**，好让你的现成配置直接能用。

---

上一篇：[LSP 代码智能](https://daiw.org/manual/grok-build/lsp) · 下一篇：[与别家 agent 互通](https://daiw.org/manual/grok-build/agent-interop)
