AI

従来のウェブスクレイピングとモデル・コンテキスト・プロトコル(MCP)の比較:開発者のためのガイド

MCPと従来のウェブスクレイピングの長所と短所を検討し、2025年のデータ抽出ニーズに最適な方法を見つけましょう。
3 分読
MCP 与传统网页抓取的对比

想像してみてほしい:数週間かけてウェブスクレイパーを完成させたとする。CSSのセレクタは微調整され、データはスムーズに流れます。そしてAmazonがレイアウトを変更した。聞き覚えがあるだろうか?

モデル・コンテキスト・プロトコル(MCP)は、ウェブデータの抽出方法を変えることを約束する新しいアプローチだ。もろいCSSセレクタを書く代わりに、AIに平易な英語で指示を与え、AIが重い仕事を処理する。しかし、このAI主導のアプローチは、試行錯誤を重ねた従来の手法よりも本当に優れているのだろうか?

両者のアプローチを深く掘り下げ、実際にスクレイパーをいくつか作り、2025年にどちらの方法が勝利するかを見極めよう。

クイック比較:従来のスクレイピングとMCPスクレイピング

詳細を説明する前に、これらのアプローチの違いを説明しよう:

アスペクト 伝統的なスクレイピング MCPによるスクレイピング
セットアップ時間 数時間から数日 分~時間
メンテナンス 高 – レイアウト変更に伴う故障 下 – AIはマイナーチェンジに適応する
コスト リクエストごとに下げる リクエストごとに高くなる
コントロール ロジックの完全制御 AIの解釈に頼る
学習曲線 ステップ – コーディング・スキルが必要 より優しく – 自然な言語によるプロンプト
最適 ボリュームが多く、安定したサイト ラピッド・プロトタイピング、変化する現場

伝統的なウェブスクレイピング基礎

従来のウェブスクレイピングは、何十年もの間、データ抽出を支えてきました。その核となるのは、データの抽出方法を完全にコントロールできる、簡単な4ステップのプロセスです。

従来のワークフロー

  1. HTTPリクエストを送る:ウェブページを取得するためにHTTPクライアントから始めましょう。Pythonのrequestsライブラリは基本的なニーズに対応していますが、本格的なパフォーマンスを求めるなら、以下のようなものを検討してみてください:
  2. HTMLを解析する:パーサーを使って生のHTMLを実行可能なデータに変換する。BeautifulSoupは、しばしばスピードのためにlxmlによって動かされる、最も一般的な選択肢です。これらのパーサーは 静的コンテンツの抽出に優れています。
  3. データを抽出します:を使用して特定の要素をターゲットにします:
    • クラス、ID、属性で直接選択できるCSSセレクタ
    • 複雑なトラバーサルとテキストマッチングのためのXPath
    • どちらを使えばいいかわからない?XPathとCSSセレクタの比較ガイドをご覧ください。

4.動的コンテンツの処理JavaScriptを多用するサイトでは、ブラウザの自動化が必要だ:

人気のある伝統的なスクラップ・スタック

静的サイトの場合:

  • パイソン:リクエスト+ビューティフル・スープ
  • Node.js:axios+チェリオ
  • 行けコリー

複雑なクロールのために:

  • Python:Scrapyフレームワーク

JavaScriptを多用するサイトのために:

モデル・コンテキスト・プロトコルAIによるスクレイピング

2024年11月25日にAnthropicによってリリースされたModel Context Protocol(MCP)は、大規模言語モデル(LLM)が関数を呼び出すように簡単に外部ツールを呼び出すことを可能にするオープンスタンダードである。

HTTPリクエストやCSSセレクタをハードコーディングする代わりに、「このURLから商品のタイトル、価格、評価を取得する」という結果を記述するだけで、LLMは裏で適切なツール(例えばscrape_product())を選択する。

ウェブ・スクレイピング・チームにとって、このシフトは脆弱な解析ロジックを弾力性のあるプロンプト主導のワークフローに変える。

MCPの仕組み

すべてのメッセージは、JSON-RPC 2.0を介して転送されるため、すべての呼び出しは言語にとらわれず、ストリームフレンドリーになる。

  • ホスト– 会話を開始するLLMアプリケーション(Claude Desktopなど
  • クライアント– ホストに組み込まれたプロトコル・ハンドラ
  • サーバー– 1つ以上のツールを公開するサービス
  • ツール– JSONやCSVのような構造化された結果を返す名前付き関数

マジックは相互作用の流れの中で起こる:

  1. タスクを説明する。 「このナイキの靴の価格履歴を取得する。
  2. LLMはツールを選択します。あなたのリクエストをscrape_product_history(url)にマップします。
  3. サーバーが実行。ヘッドレス・ブラウジング、プロキシ・ローテーション、CAPTCHA解決は、ツールの設定方法に基づいて行われます。
  4. 構造化された出力。LLMはきれいなJSONを受け取り、それを返すか、パイプで送る。

💡 心に留めておいてください:MCPは、ウェブ抽出だけでなく、あらゆるツールの呼び出しを管理する。MCPはSQLクエリ、git操作、ファイルI/Oなどをオーケストレーションできる。しかし、誰かがツールを書かなければならない。AIは実装されていないロジックを発明することはできない。

MCPがウェブスクレイピングのワークフローにどのような革命をもたらすのか、詳しく見てみましょう。

公式MCP SDK

Model Context Protocol組織は、主要言語用のSDKを提供している:

  • TypeScript SDK– 主な実装
  • Python SDK– AI/MLワークフローのためのフル機能
  • Java SDK– Spring AIでメンテナンス
  • C# SDK– マイクロソフトとのパートナーシップ(プレビュー)
  • Ruby SDK– Shopifyとのコラボレーション
  • Rust SDK– 高性能実装
  • Kotlin SDK– JVMベース、Androidに最適

ヘッド・トゥ・ヘッド:アマゾンのスクレーパーを双方向で構築する

両方のアプローチを使って同じAmazon商品スクレイパーを作ってみよう。この実践的な比較によって、従来のスクレイピングと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をいじった瞬間に、あなたのスクレーパーは壊れてしまう。データの分析よりも、壊れたセレクタの修正に多くの時間を費やすことになる。

Amazonのアンチボットプロテクションをバイパスする必要がありますか?Amazon CAPTCHAを回避するための完全ガイドをご覧ください。

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サーバーはコンテンツを提供するだけで、AIは自然言語によるリクエストに基づいて何を抽出すべきかを判断する。

カーソルを使ったMCPの設定

自分で試してみたいですか?MCPサーバーとCursorを統合する方法はこちらです:

カーソル設定メニュー

ステップ 1:カーソルを開き、設定 → カーソル設定に移動する。

ステップ2:サイドバーでMCPを選択する

ステップ 3:クリック+ 新しいグローバルMCPサーバーの追加

設定画面

ステップ4:サーバー構成を追加します:

{
  "mcpServers": {
    "amazon_product_scraper": {
      "command": "/path/to/python",
      "args": ["/path/to/amazon_scraper_mcp.py"]
    }
  }
}
json-configuration-editor

ステップ5:保存し、接続が緑色に表示されていることを確認する

mcp-server-connected-status

ステップ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: Run ツール ⏎ をクリックします。

AIがすべての抽出ロジックを処理するので、セレクタは必要ない!

👉ブライトデータのMCPサーバーを統合して、リアルタイムのAI対応ウェブデータにアクセスする方法をご覧ください。

各アプローチの使用時期

両方のスクレーパーを作ってみて、トレードオフがはっきりした。

すべてのリクエスト、セレクタ、プロキシをエンドツーエンドで制御する必要がある場合は、従来のスクレイピングを選択してください。

  • 大量かつ繰り返し可能なジョブ
  • ほとんど変化のない、明確なサイト
  • ミリ秒単位と依存関係が重要なパイプライン

💡 ヒント:伝統的な削り方:

一方、製品がすでにLLM中心であったり、エージェントにオンデマンドでライブデータを取得させたい場合は、MCP主導のワークフローを採用する。

  • セレクタを書くと遅くなる、高速プロトタイプ
  • 頻繁に変更されるサイトやドメイン間で異なるサイト
  • あまり技術的でないチームメイトは、プロンプトを使ってデータ収集のトリガーを引くことができる。
  • LLM推論の恩恵を受ける複雑なフロー(検索→ページネート→抽出など
  • 余分な待ち時間やツールコールのコストを許容できる会話アプリ

ヒント:MCP統合のために:

Bright Data の MCP サーバーはWeb UnlockerCrawl APIBrowser API、またはSERP APIを単一の JSON-RPC エンドポイントにラップします。エージェントは、search_engineのような利用可能なツールを呼び出すだけで、サーバーはステルスブラウジング、CAPTCHAの解決、プロキシローテーションを自動的に処理します。

未来はハイブリッド

どちらのアプローチも特効薬ではないので、賢いチームは両方を組み合わせる。

  • ディスカバリーにMCPを使用。プロンプト駆動型のスクレイパーをスピンアップして、新しいデータソースを数分で検証。
  • 従来のコードで最適化する。ターゲットとスキーマが安定したら、手作業でチューニングしたセレクタに切り替え、スピードとコスト効率を上げる。
  • 成熟したスクレイパーをMCPツールとして公開します。既存のPythonまたはNode.jsクローラを軽量なMCPサーバーでラップし、エージェントが1回の関数呼び出しで呼び出せるようにします。

最新のプラットフォームはすでにこのモデルに従っている。例えば、ブライト・データのMCPサーバーは、AI主導の探索とプロダクション・グレードのスクレイピング・インフラストラクチャを組み合わせることができる。

結論

従来のウェブスクレイピングはどこにも行きません。一方MCPは、柔軟性とLLM対応のインテリジェンスという新しいレイヤーをもたらします。

将来はハイブリッドになる-両方を使い、仕事の要求に応じて切り替える。

AI主導の抽出のためのスケーラブルで準拠したインフラストラクチャが必要な場合は、ブライト・データのAI対応ウェブデータ・インフラストラクチャをご覧ください – レジデンシャル・プロキシから構築済みAPI、フルマネージドMCPサーバーまで。

すでにエージェントワークフローを構築していますか?Google ADKとBright Data MCPの統合ガイドをご覧ください。