本指南深入讲解如何高效、批量采集百度搜索结果页(SERP)数据,全面对比自助 Playwright、Bright Data 的 SERP API 以及 AI 代理工作流三种方案。内容涵盖实用代码示例、分页处理技巧,以及反爬虫应对策略,助你轻松应对大规模数据采集挑战。
百度是中国首选的搜索引擎,蕴含丰富的市场洞察、SEO机会和竞争情报。在本指南中,我们对比了三种可靠的百度 SERP 数据采集方式:轻量级自助爬虫、Bright Data 的 SERP API(全托管),以及通过 Web MCP 的 AI 代理工作流。你还将获得基于实际经验的代理与反爬技巧。
速览要点
- 你可以在几分钟内搭建一个可用的爬虫,但要实现规模化采集,必须进行代理轮换和反爬处理。
- Bright Data 的 SERP API 解决了最难的问题(如验证码、指纹识别、IP 轮换)。
- AI 代理可以通过 Web MCP 自动收集并总结百度 SERP 数据。
了解百度搜索结果页(SERP):你会遇到什么?
URL 格式:
- 基础地址:https://www.baidu.com/s
- 查询参数:wd=<你的查询词>
- 分页参数:pn 每页递增 10(第 1 页可省略或为 0,第 2 页为 pn=10,第 3 页为 pn=20,以此类推)。
页面布局:
- 左侧:AI 总结(如有)、自然搜索结果、相关搜索、分页导航。
- 右侧:百度热搜(热门话题,通常与你的查询无关)。
反爬现实:
- 直接发起 HTTP 请求,经常会遇到“稍后再试”或验证页面。
- 如果没有防护措施,批量采集时会遇到指纹检测、速率限制和基于 IP 的流量限制。
合规提醒:务必查阅网站条款及当地法规,合理、合规使用 SERP 数据。
方案 A:Bright Data SERP API(最快且稳定扩展)
如果你希望用最少的代码获得生产级的稳定性,Bright Data 的 SERP API 可以帮你处理页面渲染、代理轮换和反爬防护。你只需提供百度 SERP 的 URL,就能获得渲染后的 HTML(可直接解析)。
你需要准备:
- Bright Data 账号
- SERP API 区域(如 serp_api)
- Bright Data API 密钥
Node.js 示例
- 构建你的百度 URL(按需分页):
第 1 页:https://www.baidu.com/s?wd=machine%20learning%20platforms
第 2 页:https://www.baidu.com/s?wd=machine%20learning%20platforms&pn
- 通过 SERP API 发起请求:
// npm i node-fetch
import fetch from "node-fetch";
import { URLSearchParams } from "url";
const API_KEY = process.env.BRIGHT_DATA_API_KEY; // set in env
const ZONE = "serp_api"; // your SERP API zone
const params = new URLSearchParams({ wd: "machine learning platforms" });
const targetUrl = `https://www.baidu.com/s?${params.toString()}`;
const resp = await fetch("https://api.brightdata.com/request", {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ zone: ZONE, url: targetUrl, format: "raw" }),
});
const html = await resp.text();
// Parse with cheerio/parse5/etc.
console.log(html.slice(0, 500));
为什么推荐这种方式
- 免除验证码、指纹识别和 IP 轮换的烦恼。
- 兼容任何 HTTP 客户端,易于集成到数据处理流程中。
- 弹性扩展,无需本地部署浏览器集群。
方案 B:Browser API + Playwright(全浏览器控制,无需运维)
如果你更倾向于驱动真实浏览器,但又不想维护代理、会话和大量 Chrome 实例,Bright Data 的Browser API 可以通过 CDP 提供加固的远程浏览器。你可以通过 Playwright/Chromium 进行连接,代理轮换和反爬措施则在后台自动处理。
Node.js + Playwright 示例
npm i playwright
import { chromium } from "playwright";
const WSS = "wss://:@brd.superproxy.io:9222"; // from your Bright Data account
const browser = await chromium.connectOverCDP(WSS);
const context = await browser.newContext();
const page = await context.newPage();
const q = "machine learning platforms";
await page.goto(`https://www.baidu.com/s?wd=${encodeURIComponent(q)}`, { waitUntil: "networkidle" });
// Inspect live DOM and update selectors as needed:
const results = await page.$$eval(".result", nodes =>
nodes.map(n => {
const linkEl = n.querySelector(".sc-link");
const title = linkEl?.textContent?.trim() || "";
const href = linkEl?.getAttribute("href") || "";
const descEl = n.querySelector("[data-module='abstract']");
const description = descEl?.textContent?.trim() || "";
const image = n.querySelector(".sc-image img")?.getAttribute("src") || "";
const official = !!n.querySelector("a[href^='https://aiqicha.baidu.com/feedback/official']");
return { title, href, description, image, official };
})
);
console.log(results);
await browser.close();
适用场景:
- 你需要真实浏览器的效果和选择器级别的精细控制。
- 你需要与动态元素交互,而不仅仅是解析静态 HTML。
方案 C:自建Baidu爬虫(适合原型开发)
你完全可以用 Playwright 快速搭建一个可用的爬虫。对于小规模任务来说,这没问题。但如果要扩展规模,就需要增加代理轮换、限流、重试机制和选择器维护。
Python 示例
# pip install playwright
# python -m playwright install
from playwright.sync_api import sync_playwright
from urllib.parse import urlencode
import csv, time
def build_baidu_url(query: str, page: int = 1) -> str:
base = "https://www.baidu.com/s"
params = {"wd": query}
if page > 1:
params["pn"] = (page - 1) * 10
return f"{base}?{urlencode(params)}"
def parse_results(page):
items = []
for loc in page.locator(".result").all():
link_el = loc.locator(".sc-link")
href = link_el.get_attribute("href") or ""
title = (link_el.inner_text() or "").strip()
desc_el = loc.locator("[data-module='abstract']")
description = desc_el.inner_text().strip() if desc_el.count() > 0 else ""
img_el = loc.locator(".sc-image img")
image = img_el.get_attribute("src") if img_el.count() > 0 else ""
official = loc.locator("a[href^='https://aiqicha.baidu.com/feedback/official']").count() > 0
items.append({"title": title, "href": href, "description": description, "image": image, "official": official})
return items
def scrape(query: str, pages: int = 2):
all_rows = []
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
for pnum in range(1, pages + 1):
url = build_baidu_url(query, page=pnum)
page.goto(url, wait_until="networkidle")
time.sleep(0.5)
all_rows.extend(parse_results(page))
browser.close()
return all_rows
if __name__ == "__main__":
data = scrape("web scraping tools", pages=3)
with open("baidu_results.csv", "w", newline="", encoding="utf-8") as f:
fields = data[0].keys() if data else ["title","href","description","image","official"]
w = csv.DictWriter(f, fieldnames=fields)
w.writeheader()
w.writerows(data)
print(f"Saved {len(data)} rows to baidu_results.csv")
自建爬虫实用建议
- 经常检查选择器——Baidu 的 DOM 结构可能会变动。
- 调试时用可视化模式(headful),调试完再切回无头模式(headless)。
- 加入退避、抖动(jitter)和重试机制;轮换会话和IP。
选项D:通过 Bright Data Web MCP 使用 AI Agent(自动化流程)
Bright Data 的 Web MCP 向 LLM Agent 提供诸如 search_engine 和 scrape_as_markdown 等工具。只需一次性配置,之后你的 Agent 就能自动抓取并总结 Baidu 搜索结果页。
极简配置(兼容 Claude Desktop 及其他支持 MCP 的工具)
{
"mcpServers": {
"Bright Data Web MCP": {
"command": "npx",
"args": ["-y", "@brightdata/mcp"],
"env": {
"API_TOKEN": ""
}
}
}
}
应用场景
- 研究助手:自动收集搜索结果页,翻页迭代,并返回结构化摘要。
- 监控流程:定期重复抓取,自动标记页面变化。
选择适合 Baidu 的代理类型(最佳代理测评视角)
- 住宅代理:最适合模拟普通用户流量和大规模访问,通常是对抗 SERP 反爬系统最安全的选择。
- 移动代理:信任度最高,但价格更贵——当住宅代理命中率不够时可以尝试。
- ISP(静态住宅)代理:比轮换住宅代理更快,适合需要稳定会话的场景,但如果被封锁增多要及时轮换。
- 数据中心代理:成本低,但最容易被 SERP 标记,适合低敏感度任务或配合托管反爬层使用。
推荐:根据你的成功率和预算选择 Bright Data 的住宅、移动或 ISP 代理。如果不确定,可先从 SERP API(托管服务)入手并进行效果测量。
需要提取哪些数据(以及原因)
- 标题和URL:用于排名快照、点击目标和竞品分析。
- 描述/摘要:用于相关性检查和SERP差异比对。
- 图片(如有):有助于识别知识面板或富媒体结果。
- 官方认证标识:便于区分已验证实体。
- 相关搜索:为关键词聚类提供种子词。
- 趋势(右侧栏):了解更广泛的关注热点。
导出选项
- CSV:适合商业智能分析和快速分享。
- JSON/JSONL:适合数据流和二次导入。
- 保留少量原始HTML样本,用于解析器质量检测。

