想像してみてほしい:数週間かけてウェブスクレイパーを完成させたとする。CSSのセレクタは微調整され、データはスムーズに流れます。そしてAmazonがレイアウトを変更した。聞き覚えがあるだろうか?
モデル・コンテキスト・プロトコル(MCP)は、ウェブデータの抽出方法を変えることを約束する新しいアプローチだ。もろいCSSセレクタを書く代わりに、AIに平易な英語で指示を与え、AIが重い仕事を処理する。しかし、このAI主導のアプローチは、試行錯誤を重ねた従来の手法よりも本当に優れているのだろうか?
両者のアプローチを深く掘り下げ、実際にスクレイパーをいくつか作り、2025年にどちらの方法が勝利するかを見極めよう。
クイック比較:従来のスクレイピングとMCPスクレイピング
詳細を説明する前に、これらのアプローチの違いを説明しよう:
アスペクト | 伝統的なスクレイピング | MCPによるスクレイピング |
---|---|---|
セットアップ時間 | 数時間から数日 | 分~時間 |
メンテナンス | 高 – レイアウト変更に伴う故障 | 下 – AIはマイナーチェンジに適応する |
コスト | リクエストごとに下げる | リクエストごとに高くなる |
コントロール | ロジックの完全制御 | AIの解釈に頼る |
学習曲線 | ステップ – コーディング・スキルが必要 | より優しく – 自然な言語によるプロンプト |
最適 | ボリュームが多く、安定したサイト | ラピッド・プロトタイピング、変化する現場 |
伝統的なウェブスクレイピング基礎
従来のウェブスクレイピングは、何十年もの間、データ抽出を支えてきました。その核となるのは、データの抽出方法を完全にコントロールできる、簡単な4ステップのプロセスです。
従来のワークフロー
- HTTPリクエストを送る:ウェブページを取得するためにHTTPクライアントから始めましょう。Pythonの
requests
ライブラリは基本的なニーズに対応していますが、本格的なパフォーマンスを求めるなら、以下のようなものを検討してみてください:- httpxまたはaiohttpによる非同期操作
- 並列リクエストのためのリクエストフューチャー
- 最適化のヒントについては、ウェブスクレイピングの高速化に関するガイドをご覧ください。
- HTMLを解析する:パーサーを使って生のHTMLを実行可能なデータに変換する。BeautifulSoupは、しばしばスピードのためにlxmlによって動かされる、最も一般的な選択肢です。これらのパーサーは 静的コンテンツの抽出に優れています。
- データを抽出します:を使用して特定の要素をターゲットにします:
- クラス、ID、属性で直接選択できるCSSセレクタ
- 複雑なトラバーサルとテキストマッチングのためのXPath
- どちらを使えばいいかわからない?XPathとCSSセレクタの比較ガイドをご覧ください。
4.動的コンテンツの処理JavaScriptを多用するサイトでは、ブラウザの自動化が必要だ:
- セレン:幅広い言語をサポートするベテランの選択
- 脚本家モダンで速く、信頼できる
- Puppeteer:Node.jsワークフローに最適
- Bright Dataのスクレイピング・ブラウザ:ボット対策とプロキシ管理を内蔵
人気のある伝統的なスクラップ・スタック
静的サイトの場合:
複雑なクロールのために:
- Python:Scrapyフレームワーク
JavaScriptを多用するサイトのために:
- 脚本家+脚本家ステルス
- Puppeteer +puppeteer-extra-plugin-stealth
- セレンベース
モデル・コンテキスト・プロトコル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のような構造化された結果を返す名前付き関数
マジックは相互作用の流れの中で起こる:
- タスクを説明する。 「このナイキの靴の価格履歴を取得する。
- LLMはツールを選択します。あなたのリクエストをscrape_product_history(url)にマップします。
- サーバーが実行。ヘッドレス・ブラウジング、プロキシ・ローテーション、CAPTCHA解決は、ツールの設定方法に基づいて行われます。
- 構造化された出力。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"]
}
}
}
ステップ5:保存し、接続が緑色に表示されていることを確認する
ステップ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対応ウェブデータにアクセスする方法をご覧ください。
各アプローチの使用時期
両方のスクレーパーを作ってみて、トレードオフがはっきりした。
すべてのリクエスト、セレクタ、プロキシをエンドツーエンドで制御する必要がある場合は、従来のスクレイピングを選択してください。
- 大量かつ繰り返し可能なジョブ
- ほとんど変化のない、明確なサイト
- ミリ秒単位と依存関係が重要なパイプライン
💡 ヒント:伝統的な削り方:
- IPローテーションと地理的制限に対応するブライトデータのプロキシサービスをご覧ください。
- 120以上の一般的なドメインから事前に構築された抽出のためのWeb Scraper APIを試す
- データセット・マーケットプレイスですぐに使えるデータを探す
一方、製品がすでにLLM中心であったり、エージェントにオンデマンドでライブデータを取得させたい場合は、MCP主導のワークフローを採用する。
- セレクタを書くと遅くなる、高速プロトタイプ
- 頻繁に変更されるサイトやドメイン間で異なるサイト
- あまり技術的でないチームメイトは、プロンプトを使ってデータ収集のトリガーを引くことができる。
- LLM推論の恩恵を受ける複雑なフロー(検索→ページネート→抽出など
- 余分な待ち時間やツールコールのコストを許容できる会話アプリ
ヒント:MCP統合のために:
- コミュニティMCPサーバーをチェック
- 公式のMCPリファレンス実装を試す
- エンタープライズグレードの信頼性を誇るBright DataのMCPインテグレーションをお試しください。
Bright Data の MCP サーバーは、Web Unlocker、Crawl API、Browser 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の統合ガイドをご覧ください。