使用Fetch API

上一节介绍的Search API已经具备了自动搜索网页、读取网页、生成内容摘要的功能。

如果你要读取特定的网页,可以用
Fetch API。

之前我们已经介绍过一些读取特定网页内容的方法。

例如要抓取格式化的网页数据,可以参考: 抓取网页数据(爬虫)   抓取AJAX数据

例如要直接抓取网页源代码,代码也很简单:


Dim
hc As New HttpClient("https://www.tianya.net/")
Dim
html As String = hc.GetData()
Output.Show(html)


但HttpClient抓回来的是“给浏览器看”的代码,可能只有一堆 <div id="app"></div> 和 <script>,真实的数据根本不在源码里,而在后续的 AJAX 请求或 JS 渲染里,所以并不适合投喂给大模型。

例如你用 HttpClient 抓一个新闻网页,拿到的 HTML 源码里包含了:导航栏、侧边栏、页脚、广告脚本、评论区、大量无用的 <style> 和 <script> 标签。如果你把这几万字的乱码直接丢给大模型,不仅消耗海量 Token,还会让模型产生严重的幻觉(它会被无关的代码干扰)。

DeepSeek提供了一个网页抓取接口(Fetch API),用于抓取网页,
官方说明地址:

https://api-docs.deepseek.com/zh-cn/api/fetch


DeepSeek Fetch 内部做了极其复杂的内容提取算法,它会帮你把导航、广告、侧边栏全部剔除,只留下核心的正文,并且自动转换成排版极佳的 Markdown 格式,适合投喂给大模型。

DeepSeek Fetch 在服务端使用的是无头浏览器(Headless Browser),它会执行 JavaScript,等网页完全渲染出来、数据加载完毕后,再把最终的内容提取下来,这是HttpClient做不到的。

上一节介绍的 Search API 是“广撒网”,本节介绍的 Fetch API 是“精阅读”。两者的配合,就能让大模型真正拥有“上网查资料”的能力。

示例

本节任务:基于DeepSeek的Fetch API,设计一个抓取网页的工具,让 大模型能够在需要时自动抓取指定网页的内容。

下面的是参考代码,可直接在命令窗口测试执行:

Dim apiKey As String = "sk-a734b83536da45e9aedc3e42605bfb3a" '请替换为自己的APIKey
Dim
caller As New LLMCaller("https://api.deepseek.com/chat/completions", "deepseek-flash", apiKey)
caller.Messages =
New JArray()
' 1.
定义工具
With
caller.AddTool("web_fetch", "抓取指定网页的正文内容,以 Markdown 格式返回标题和正文。")
    .AddParameter(
"url", "string", "要抓取的网页完整地址,必须以 http:// 或 https:// 开头。", True)
End
With
' 2.
实现工具执行逻辑
caller.ToolExecutor =

Function
(ttoolName As String, targs As JObject) As String
   
Select Case ttoolName
       
Case "web_fetch"
           
Dim targetUrl As String = targs("url").ToString()
           
' 发起 Fetch 请求
           
Dim hc As New HttpClient("https://api.deepseek.com/v1/tools/fetch")
            hc.SkipError =
True
            hc.ContentType =
"application/json"
            hc.Headers.Add(
"Authorization", "Bearer " & apiKey)
           
Dim reqBody As JObject = New JObject() From {{"url", targetUrl}}
            hc.Content = reqBody.ToString()
           
Dim res As String = hc.GetData()
           
Dim result As New JObject()
           
If hc.StatusCode <> 200 Then
                result(
"title") = "抓取失败"
                result(
"content") = "抓取失败,状态码:" & hc.StatusCode & ",状态描述:" & hc.StatusDescription
           
Else ' 解析结果
               
Dim page As JObject = JsonConvert.DeserializeObject(res)
               
Dim title As String = If(page("title") IsNot Nothing, page("title").ToString(), "")
               
Dim content As String = If(page("content") IsNot Nothing, page("content").ToString(), "")
                result(
"title") = title
                result(
"content") = content '如果担心网页内容过长,可以考虑截取,例如:content.Substring(0,30000)
           
End If
           
Return result.ToString()
       
Case Else
           
Return "未知工具:" & ttoolName
   
End Select
End
Function
' 3.
发起提问
caller.UserMessage =
"请帮我阅读这篇文章:https://finance.sina.com.cn/tech/roll/2026-10-23/doc-iniweiyw4833115.shtml,并总结出核心要点。"
If
caller.GetResult() Then
    MessageBoxA.Show(caller.Result)

Else

    MessageBoxA.Show(caller.Error)

End
If


本页地址:http://www.foxtable.com/webhelp/topics/7232.htm