Blog / AI
AI

传统网络抓取与模型上下文协议 (MCP):开发人员指南

探讨 MCP 与传统网络搜索的利弊,找出最适合您 2025 年数据提取需求的方法。
3 分钟阅读
MCP 与传统网页抓取的对比

想象一下:你花了数周时间完善你的网络搜刮器。CSS 选择器经过微调,数据流畅,然后亚马逊改变了布局。你精心改进的选择器一夜之间就崩溃了。听起来很熟悉吧?

模型上下文协议(MCP)是一种有望改变我们提取网络数据方式的新方法。你不用再编写蹩脚的 CSS 选择器,而只需向人工智能发出简单明了的指令,人工智能就能完成繁重的工作。但这种人工智能驱动的方法真的比久经考验的传统方法更好吗?

让我们深入研究这两种方法,构建一些真实的刮擦器,看看哪种方法能在 2025 年获胜。

快速比较:传统扫描与 MCP 扫描

在我们深入探讨细节之前,先来看看这些方法的不同之处:

方面 传统刮削 MCP 驱动的扫描
设置时间 小时到天数 分钟至小时
维护 高 – 因布局变化而中断 较低 – 人工智能可适应微小变化
费用 按要求降低 按要求提高
控制 完全控制逻辑 依赖人工智能解释
学习曲线 陡峭 – 需要编码技能 更温和–自然语言提示
最适合 高流量、稳定的站点 快速原型设计,不断变化的场地

传统网络抓取:基础

几十年来,传统的网络刮擦技术一直在为数据提取提供动力。其核心是一个直接的四步流程,让你完全控制数据提取的方式。

传统工作流程

  1. 发送 HTTP 请求:从 HTTP 客户端开始获取网页。Python 的请求库可以满足基本需求,但如果需要更高的性能,可以考虑使用它:
  2. 解析 HTML:使用解析器将原始 HTML 转化为可操作的数据。BeautifulSoup仍是首选,通常使用lxml以提高速度。这些解析器擅长静态内容提取。
  3. 提取数据:使用以下功能锁定特定元素
    • CSS 选择器,可直接按类、ID 或属性进行选择
    • 用于复杂遍历和文本匹配的 XPath
    • 不确定该使用哪个?我们的XPath 与 CSS 选择器指南对此进行了分析

4.处理动态内容:对于 JavaScript 较多的网站,你需要浏览器自动化:

静态网站

用于复杂爬行

适用于 JavaScript 繁重的网站

模型上下文协议:人工智能驱动的搜索

模型上下文协议(MCP)由 Anthropic 于 2024 年 11 月 25 日发布,它是一项开放标准,允许大型语言模型(LLM)像调用函数一样轻松调用外部工具–可以把它想象成人工智能应用程序的 USB-C。

无需硬编码 HTTP 请求或 CSS 选择器,只需描述结果–“从该 URL 抓取产品标题、价格和评级”–LLM 就会在幕后选择合适的工具(如scrape_product())。

对于网络搜刮团队来说,这种转变可将脆弱的解析逻辑转变为有弹性、由提示驱动的工作流程。

MCP 如何工作

所有信息都通过JSON-RPC 2.0 传输,使每次调用都与语言无关,并对数据流友好。

  • 主机– 启动对话的 LLM 应用程序(如 Claude Desktop
  • 客户端– 嵌入主机的协议处理程序
  • 服务器– 公开一个或多个工具的服务
  • 工具– 返回 JSON 或 CSV 等结构化结果的命名函数

神奇之处在于互动流程:

  1. 描述任务 “获取这款耐克鞋的历史价格”。
  2. LLM 选择一个工具。它会将您的请求映射到scrape_product_history(url)
  3. 服务器执行。无头浏览、代理轮换和验证码问题的解决取决于工具的配置方式。
  4. 结构化输出。LLM 接收干净的 JSON 并将其返回或通过管道输送。

💡 请记住:MCP 可管理任何工具调用,而不仅仅是网络提取。它可以协调 SQL 查询、git 操作、文件 I/O 等。但仍需有人编写工具。人工智能无法发明尚未实现的逻辑。

深入了解MCP 如何彻底改变网络搜索工作流程

官方 MCP SDK

模型上下文协议组织为主要语言提供 SDK:

正面交锋:双管齐下打造亚马逊搜索器

让我们使用这两种方法构建相同的亚马逊产品搜索器。这种实际比较将突出传统刮板和 MCP 驱动的刮板之间的真正差异。

亚马逊产品页面

传统方法

首先,让我们使用 Playwright 和 BeautifulSoup 创建一个传统的刮板:

import asyncio
from playwright.async_api import async_playwright
from bs4 import BeautifulSoup

async def scrape_amazon_product(url):
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto(url)
        await page.wait_for_selector("#productTitle", timeout=10000)

        soup = BeautifulSoup(await page.content(), "html.parser")
        await browser.close()

        def extract(selector, default="N/A", attr=None, clean=lambda x: x.strip()):
            element = soup.select_one(selector)
            if not element:
                return default
            value = element.get(attr) if attr else element.text
            return clean(value) if value else default

        return {
            "title": extract("#productTitle"),
            "current_price": extract(".a-price-whole"),
            "original_price": extract(".a-price.a-text-price span"),
            "rating": extract("#acrPopover", attr="title"),
            "reviews": extract("#acrCustomerReviewText"),
            "availability": extract(
                "#availability span", clean=lambda x: x.strip().split("\n")[0].strip()
            ),
        }

async def main():
    product = await scrape_amazon_product("https://www.amazon.in/dp/B0BTDDVB67")

    print("\nProduct Information:")
    print("-------------------")
    print("\n".join(f"{k.replace('_', ' ').title()}: {v}" for k, v in product.items()))

if __name__ == "__main__":
    asyncio.run(main())

挑战:这些 CSS 选择器(#productTitle.a-price-whole)都是硬编码。亚马逊一调整 HTML,你的 scraper 就会崩溃。你将花费更多的时间来修复损坏的选择器,而不是分析数据。

需要绕过亚马逊的反僵尸保护?了解我们关于绕过亚马逊验证码的完整指南。

MCP 方法

现在,让我们用 MCP 制作同样的刮板。

from mcp.server.fastmcp import FastMCP
from playwright.async_api import async_playwright
from markdownify import markdownify as md
from bs4 import BeautifulSoup

# Initialize FastMCP instance
mcp = FastMCP("Amazon Scraper")

@mcp.tool()
async def scrape_product(url: str) -> str:
    """
    Fetch an Amazon product page, extract the main product section,
    and return it as Markdown.
    """
    browser = None
    try:
        async with async_playwright() as playwright:
            # Launch headless browser
            browser = await playwright.chromium.launch(headless=True)
            page = await browser.new_page()

            # Navigate and wait for the product title
            await page.goto(url, timeout=90000)
            await page.wait_for_selector("span#productTitle", timeout=30000)

            # Extract HTML and parse
            html_content = await page.content()
            soup = BeautifulSoup(html_content, "lxml")
            product_section = soup.find("div", id="dp") or soup.body

            return md(str(product_section)).strip()

    except Exception as e:
        return f"Error: {e}"
    finally:
        if browser is not None:
            await browser.close()

if __name__ == "__main__":
    mcp.run(transport="stdio")

差异:注意到缺少了什么吗?没有特定的价格、评级或可用性选择器。MCP 服务器只提供内容,人工智能会根据您的自然语言请求找出需要提取的内容。

使用光标设置 MCP

想亲自尝试一下吗?下面介绍如何将您的 MCP 服务器与 Cursor 集成:

光标设置菜单
光标设置菜单

步骤 1:打开光标并导航至设置 → 光标设置

步骤 2:在侧边栏选择MCP

第 3 步:点击+ 添加新的全局 MCP 服务器

MCP 配置界面

第 4 步:添加服务器配置:

{
  "mcpServers": {
    "amazon_product_scraper": {
      "command": "/path/to/python",
      "args": ["/path/to/amazon_scraper_mcp.py"]
    }
  }
}
json 配置编辑器

步骤 5:保存并验证连接是否显示绿色

MCP服务器连接状态

步骤 6:现在,您可以在 Cursor 聊天工具中使用自然语言了:

Extract the product title, current price, original price, star rating, review count, three key features, and availability from https://www.amazon.in/dp/B0BTDDVB67 and return as JSON
光标聊天界面

步骤 7:单击运行工具 ⏎

提取的产品数据结果

人工智能处理所有提取逻辑,无需选择器!

👉了解如何集成 Bright Data 的 MCP 服务器以访问实时、AI 就绪的网络数据。

何时使用每种方法

在制造出这两种刮削器之后,其中的利弊就一目了然了。

当您需要对每个请求、选择器和代理进行端到端控制时,请选择传统的刮擦技术。

  • 大批量、可重复的工作
  • 定义明确的地点,很少改变
  • 每毫秒和依赖关系都很重要的管道

💡 提示:用于传统刮削:

另一方面,如果您的产品已经以 LLM 为中心,或者您希望代理按需获取实时数据,则应采用 MCP 驱动的工作流程。

  • 快速原型,编写选择器会拖慢您的速度
  • 经常变化或跨域变化的网站
  • 技术水平较低的队友可通过提示触发数据收集
  • 受益于 LLM 推理的复杂流程(如搜索 → 分页 → 提取
  • 可承受额外延迟或工具调用成本的对话式应用程序

💡 提示:用于 MCP 集成:

Bright Data 的 MCP 服务器Web UnlockerCrawl APIBrowser APISERP API封装在一个 JSON-RPC 端点后面。您的代理只需调用search_engine可用工具,服务器就会自动处理隐身浏览、验证码解锁和代理轮换。

未来是混合动力

这两种方法都不是灵丹妙药,因此聪明的团队会将两者结合起来。

  • 使用 MCP 进行发现。在几分钟内启动由提示驱动的刮擦程序,验证新的数据源。
  • 使用传统代码优化。目标和模式稳定后,改用手工调整的选择器,以提高速度和成本效益。
  • 将成熟的抓取程序作为 MCP 工具公开。将现有的 Python 或 Node.js 爬虫封装在轻量级 MCP 服务器中,这样代理只需调用一个函数即可调用它们。

现代平台已经遵循了这一模式。例如,Bright Data 的 MCP 服务器可让您将人工智能主导的探索与生产级刮擦基础设施相结合。

结论

传统的网络搜刮技术不会消失–它仍然是大多数大规模数据操作的基础。与此同时,MCP 带来了一层新的灵活性和 LLM 就绪智能。

未来是混合型的–两者都用,根据工作需要切换。

如果您需要可扩展、符合要求的基础架构来进行人工智能驱动的提取,请参阅Bright Data 的人工智能就绪网络数据基础架构–从住宅代理到预建 API 和全面管理的 MCP 服务器。

已经在构建代理工作流?查看将 Google ADK 与 Bright Data MCP 集成的指南。

支持支付宝等多种支付方式