本指南深入讲解如何高效、批量采集百度搜索结果页(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 示例

  1. 构建你的百度 URL(按需分页):

第 1 页:https://www.baidu.com/s?wd=machine%20learning%20platforms
第 2 页:https://www.baidu.com/s?wd=machine%20learning%20platforms&pn

  1. 通过 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样本,用于解析器质量检测。

这篇文章有用吗?

点击星号为它评分!

平均评分 / 5. 投票数:

到目前为止还没有投票!成为第一位评论此文章。

No more articles