SERP‑API 与 MCP:AI Agent 联网数据获取落地实践
摘要
随着AI Agent技术快速发展,大模型仅依靠训练知识库,无法获取互联网最新公开信息。想要实现实时检索、网页抓取,传统自研爬虫要面对代理维护、反爬拦截、页面改版等一系列棘手问题。亮数据(Bright Data)提供SERP‑API搜索引擎接口与MCP模型上下文协议两套能力,为AI智能体提供标准化联网数据源。本文结合实操界面截图,从整体架构、SERP‑API创建流程、MCP接入配置、二者协同逻辑、落地注意事项完整讲解,帮助开发者快速给大模型项目补齐网页搜索与数据抓取能力。

AI Agent完成一次联网检索回答,整套流程分为四层,如架构图所示。最上层接收用户原始查询,经过智能编排层完成任务理解、查询改写、工具调用决策;随后进入发现层调用SERP‑API拿到搜索候选URL;再交给抓取层,通过Browser API或者Scraper工具获取网页正文;最后在结果生成层完成内容清洗、信息整合,交由大模型总结输出最终答案。SERP‑API承担着整个链路里“互联网信息发现”的核心角色,而MCP协议,则是让AI Agent可以自动调用这套工具的桥梁。
SERP‑API 与 MCP:AI Agent 联网数据获取讲解视频
1 传统自建爬虫的现实困境
很多开发者一开始会选择手写爬虫实现搜索结果采集。但实际上线之后会遇到大量问题:搜索引擎风控拦截、验证码、IP被封禁,需要长期维护代理池;网页DOM结构频繁改版,解析代码反复失效;想要切换地区、语种、设备参数,请求参数调试繁琐。
对于AI Agent项目来说,原生爬虫返回原始HTML,还需要额外开发信息抽取逻辑,增加大量开发工作量。亮数据的SERP‑API与MCP,就是把代理、反爬、解析全部封装成服务,开发者只需要聚焦上层业务。
2 SERP‑API:搜索引擎结构化搜索接口实操
SERP‑API即搜索引擎结果页API,不需要自己写爬虫,平台后端完成搜索引擎访问、绕过风控、页面解析,直接返回结构化搜索数据。下面结合平台操作截图,完整看一遍创建SERP‑API的完整流程。
进入后台 -「网络访问API」‑添加API,接口类型选择搜索引擎爬虫SERP,该接口支持谷歌、必应等主流搜索引擎,平台内置住宅代理自动处理验证码、JS渲染,点击继续进入配置页面。
配置页面填写API名称,选择对应搜索引擎抓取工具,设置检索范围、广告抓取相关参数,确认之后点击添加API,完成接口实例创建。
创建完成后直接进入API测试界面,平台生成终端调用命令,可以直接复制代码在本地运行,也可以一键导入Postman调试。同时页面提示IP访问安全风险,生产环境建议配置允许访问的IP白名单,避免密钥泄露带来额外消耗。
调用SERP‑API之后,平台返回已经清洗完成的JSON结构化数据,包含标题、摘要、链接、广告条目、相关搜索等字段。业务脚本、后端程序可以直接读取字段,用于SEO监控、知识库素材采集、行业关键词批量调研。
3 MCP协议:把搜索工具直接交给AI Agent调用
MCP(Model Context Protocol)模型上下文协议,它不产生数据,它是一套交互标准,让AI客户端可以自动发现、调用外部工具。亮数据把SERP、网页抓取全部封装为MCP工具集,AI不需要手动写HTTP调用代码,大模型自己判断什么时候需要联网搜索。
在平台AI网关‑MCP栏目,可以看到MCP服务配置页面,服务启用之后,会生成MCP接入地址密钥,同时页面列出兼容的客户端:Cursor、Claude桌面端、OpenAI SDK、Langchain、n8n等主流开发工具。
官方文档提供各个客户端的接入教程,以Cursor编辑器为例,支持托管MCP服务,也可以本地自托管MCP Server,给AI编码助手赋予网页搜索、网页抓取能力。
在Cursor设置的Tools & MCP选项中填入亮数据MCP服务地址,即可成功加载brightdata‑mcp,启用全部65个工具。此时Agent在回答问题缺少实时信息时,会自动触发SERP搜索、网页抓取,整个过程不需要开发者编写调用逻辑。
4 SERP‑API与MCP该怎么选型
二者并不是替代关系,面向不同开发场景,选择不一样的接入方式:
-
后端脚本、数据分析、批量离线采集场景:直接调用SERP‑API。程序主动控制关键词、请求频次,拿到JSON数据入库、统计、导出,适合批量任务。
-
AI Agent、本地大模型、AI编辑器场景:对接MCP服务。交给大模型自主决策是否联网检索,适合问答、智能助手这类动态交互场景。
5.代码实战搭建一个联网Agent
前面讲清了架构和平台配置,这一章用 SERP‑API + Web Unlocker + Python 跑通一条完整链路。示例项目结构与本文架构一一对应:
用户 Query
↓
SERP API(发现层)→ 候选 URL 列表
↓
Web Unlocker(抓取层)→ 网页正文
↓
LLM / 本地汇总(生成层)→ 最终回答
完整代码仓库可按以下结构组织:
brightdata-serp-agent/
├── config.py # 环境变量与 Zone 配置
├── brightdata_client.py # SERP + Unlocker 封装
├── agent.py # Discovery → Fetch → Summarize
├── run_demo.py # 命令行入口
├── output/ # 运行产物
└── requirements.txt
环境准备
第一步:安装依赖
pip install requests openai # openai 可选,接大模型时用
第二步:配置环境变量
在 Bright Data 后台创建好 SERP API 和 Web Unlocker 之后,本地写入:
# Windows PowerShell
$env:BRIGHTDATA_API_KEY = "你的API密钥"
$env:SERP_ZONE = "serp_api7" # 对应后台 SERP Zone 名称
$env:UNLOCKER_ZONE = "mcp_unlocker" # 对应 Web Unlocker Zone 名称
# Linux / macOS
export BRIGHTDATA_API_KEY="你的API密钥"
export SERP_ZONE="serp_api7"
export UNLOCKER_ZONE="mcp_unlocker"
封装 Bright Data 客户端
核心是对 https://api.brightdata.com/request 的统一调用。SERP 搜索时在 URL 末尾加 &brd_json=1,平台会返回结构化 JSON,而不是原始 HTML。
config.py
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
OUTPUT_DIR = BASE_DIR / "output"
OUTPUT_DIR.mkdir(exist_ok=True)
API_ENDPOINT = "https://api.brightdata.com/request"
API_KEY = os.getenv("BRIGHTDATA_API_KEY", "")
SERP_ZONE = os.getenv("SERP_ZONE", "serp_api7")
UNLOCKER_ZONE = os.getenv("UNLOCKER_ZONE", "mcp_unlocker")
brightdata_client.py
import json
from urllib.parse import quote_plus
import requests
from config import API_ENDPOINT, API_KEY, SERP_ZONE, UNLOCKER_ZONE
class BrightDataError(RuntimeError):
pass
def _request(zone: str, url: str, timeout: int = 90) -> str:
if not API_KEY:
raise BrightDataError("请先设置 BRIGHTDATA_API_KEY")
resp = requests.post(
API_ENDPOINT,
headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}",
},
json={"zone": zone, "url": url, "format": "raw"},
timeout=timeout,
)
if resp.status_code != 200:
raise BrightDataError(f"HTTP {resp.status_code}: {resp.text[:500]}")
return resp.text
def serp_search(query: str, engine: str = "google") -> dict:
"""发现层:调用 SERP API,返回结构化搜索结果"""
q = quote_plus(query)
if engine == "google":
target = f"https://www.google.com/search?q={q}&brd_json=1"
elif engine == "bing":
target = f"https://www.bing.com/search?q={q}&brd_json=1"
else:
raise ValueError(f"不支持的引擎: {engine}")
raw = _request(SERP_ZONE, target)
return json.loads(raw)
def scrape_page(url: str) -> str:
"""抓取层:通过 Web Unlocker 获取网页 HTML"""
return _request(UNLOCKER_ZONE, url)
def extract_organic_results(serp: dict, limit: int = 5) -> list[dict]:
"""从 SERP JSON 中提取自然搜索结果"""
results = []
for item in serp.get("organic", []):
link = item.get("link") or item.get("url") or ""
if not link.startswith("http"):
continue
results.append({
"title": item.get("title", ""),
"link": link,
"description": item.get("description", item.get("snippet", "")),
})
if len(results) >= limit:
break
return results
这段代码对应架构里的 发现层 + 抓取层,代理、验证码、页面解析都由 Bright Data 后端处理,本地只关心 JSON 字段。
串联 Agent 主流程
Agent 逻辑分三步:SERP 发现 URL → Unlocker 抓取正文 → 汇总输出。
agent.py(核心片段)
import json
import re
from html import unescape
from pathlib import Path
from brightdata_client import (
BrightDataError,
extract_organic_results,
scrape_page,
serp_search,
)
from config import OUTPUT_DIR
def strip_html(html: str, max_chars: int = 2000) -> str:
"""简单 HTML 转纯文本,生产环境可换 trafilatura / readability"""
text = re.sub(r"(?is)<script.*?>.*?</script>", " ", html)
text = re.sub(r"(?is)<style.*?>.*?</style>", " ", text)
text = re.sub(r"(?is)<[^>]+>", " ", text)
return unescape(re.sub(r"\s+", " ", text)).strip()[:max_chars]
def run_research_agent(query: str, fetch_top_n: int = 2) -> Path:
# ── Step 1:发现层 ──
print(f"[1/3] SERP 搜索: {query}")
serp = serp_search(query)
candidates = extract_organic_results(serp, limit=max(fetch_top_n, 3))
if not candidates:
raise BrightDataError("SERP 未返回有效结果")
# ── Step 2:抓取层 ──
pages = []
for item in candidates[:fetch_top_n]:
print(f"[2/3] 抓取: {item['link']}")
html = scrape_page(item["link"])
pages.append({
"title": item["title"],
"url": item["link"],
"extract": strip_html(html),
})
# ── Step 3:生成层(此处先用本地模板,下一节接 LLM)──
print("[3/3] 汇总结果")
report_lines = [f"# 联网检索报告:{query}\n"]
for i, item in enumerate(candidates, 1):
report_lines.append(f"{i}. **{item['title']}**")
report_lines.append(f" - {item['link']}")
report_lines.append(f" - {item['description']}\n")
for page in pages:
report_lines.append(f"### {page['title']}")
report_lines.append(f"{page['extract'][:400]}...\n")
report = "\n".join(report_lines)
# 持久化,方便调试
(OUTPUT_DIR / "serp_raw.json").write_text(
json.dumps(serp, ensure_ascii=False, indent=2), encoding="utf-8"
)
out_path = OUTPUT_DIR / "agent_report.md"
out_path.write_text(report, encoding="utf-8")
return out_path
run_demo.py
import sys
from agent import run_research_agent
from brightdata_client import BrightDataError
from config import API_KEY
if __name__ == "__main__":
query = sys.argv[1] if len(sys.argv) > 1 else "2026 AI Agent MCP 最新进展"
if not API_KEY:
print("ERROR: 请设置 BRIGHTDATA_API_KEY")
sys.exit(1)
try:
path = run_research_agent(query, fetch_top_n=2)
print(f"\n报告已保存 → {path}")
print(path.read_text(encoding="utf-8")[:1200])
except BrightDataError as e:
print(f"ERROR: {e}")
sys.exit(1)
运行命令:
python run_demo.py "OpenAI Agent SDK 最新功能"
output/ 目录下会生成两个文件:
| 文件 | 内容 |
|---|---|
serp_raw.json |
SERP API 原始结构化返回,含标题、链接、摘要、广告位等 |
agent_report.md |
Agent 汇总后的可读报告 |
接入大模型,完成最终回答
本地模板汇总适合验证链路;真正上线时,应把 SERP 摘要和网页正文作为 上下文,交给 LLM 生成自然语言回答。
from openai import OpenAI
client = OpenAI() # 读取 OPENAI_API_KEY 环境变量
def llm_answer(query: str, serp_items: list[dict], pages: list[dict]) -> str:
context_parts = []
for item in serp_items:
context_parts.append(
f"[SERP] {item['title']}\nURL: {item['link']}\n摘要: {item['description']}"
)
for page in pages:
context_parts.append(
f"[PAGE] {page['title']}\nURL: {page['url']}\n正文: {page['extract']}"
)
context = "\n\n".join(context_parts)
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": (
"你是联网研究助手。仅根据提供的搜索结果和网页正文回答,"
"无法从材料中确认的信息请明确说明。回答末尾列出引用来源。"
),
},
{
"role": "user",
"content": f"用户问题:{query}\n\n参考资料:\n{context}",
},
],
temperature=0.3,
)
return response.choices[0].message.content
在 run_research_agent 末尾替换本地模板即可:
answer = llm_answer(query, candidates, pages)
print(answer)
这样 Agent 就具备完整的 发现 → 抓取 → 推理 闭环。
用 curl 快速验证 SERP API
不想跑完整 Agent,可以先用 curl 单独验证 SERP 接口(与后台测试页生成的命令一致):
curl https://api.brightdata.com/request \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"zone": "serp_api7",
"url": "https://www.google.com/search?q=AI+Agent+MCP&brd_json=1",
"format": "raw"
}'
返回 JSON 中 organic 数组即自然搜索结果,确认字段正常后再接入 Python 脚本。
MCP 方式:零代码接入 Cursor Agent
如果目标是在 Cursor / Claude Desktop 里让 AI 自动联网,不需要手写上述 HTTP 调用,直接配 MCP 即可。
Cursor 配置示例(~/.cursor/mcp.json):
{
"mcpServers": {
"brightdata-mcp": {
"command": "npx",
"args": ["-y", "@brightdata/mcp"],
"env": {
"API_TOKEN": "你的API密钥"
}
}
}
}
配置完成后,Cursor 的 Tools & MCP 页面会加载 brightdata-mcp,可用工具包括:
| MCP 工具 | 作用 | 对应 REST 层 |
|---|---|---|
search_engine |
Google/Bing/Yandex 结构化搜索 | SERP API |
scrape_as_markdown |
单页抓取,返回 Markdown | Web Unlocker |
scraping_browser_* |
浏览器自动化(点击、填表、截图) | Browser API |
实际运行获取到的数据放入在output文件夹:

可以登录亮数据,https://www.bright.cn/products/serp-api?utm_source=brand&utm_campaign=brnd-mkt_cn_csdn_hjs202608,完成AI Agent 联网数据获取落地实践
6 总结
传统自研爬虫,需要开发者兼顾代理池维护、反爬对抗、网页解析,开发维护成本很高。
SERP‑API将搜索引擎检索能力封装成标准化接口,适合后端脚本批量获取搜索结构化数据;MCP协议进一步将整套搜索、抓取工具开放给AI Agent,实现大模型自主联网。
为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。
更多推荐



所有评论(0)