摘要

随着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该怎么选型

二者并不是替代关系,面向不同开发场景,选择不一样的接入方式:

  1. 后端脚本、数据分析、批量离线采集场景:直接调用SERP‑API。程序主动控制关键词、请求频次,拿到JSON数据入库、统计、导出,适合批量任务。

  2. 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,实现大模型自主联网。

Logo

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

更多推荐