MCPによるブラウザ自動化:Scrapelessを使ってクラウドブラウザを操作する
Advanced Bot Mitigation Engineer
TL;DR:
- Scrapeless MCPサーバーは、ホストされたクラウドブラウザを操作する16の
browser_*ツールを提供し、スクリプトがクリック、スクロール、ナビゲート、およびレンダリングされたページを読むことができるようにします。ローカルのChromiumは不要です。 browser_createはセッションIDを返し、その後の呼び出し(browser_goto、browser_get_text、browser_close)はすべてそのIDを持ち、同じブラウザで操作を行います。- ツールはJavaScriptをレンダリングします:クライアントでレンダリングされたクオーツページをナビゲートし、読み返すと10のレンダリングされたクオーツが返されます。
- これは
scrape_markdownの対応物です:1回の呼び出しで取得できるページにはコンテンツツールを使用し、ページがインタラクションや待機を必要とする場合にはブラウザツールを使用します。 - モデルプロバイダーキーは関与していません。ブラウザツールはMCPセッションを介して直接呼び出されます。
- Scrapelessの無料プランから始めて、最初のクラウドブラウザを操作しましょう。
いくつかのページは1回のリクエストでコンテンツを提供しません。データはクリック、スクロール、またはスクリプトの実行待機の後に現れ、一度のフェッチはそれらの前にシェルを返します。Scrapeless MCPサーバーは、モデルコンテキストプロトコルを介して実際のクラウドブラウザを駆動する一連のブラウザツールでこれに応えます。これにより、あなたのコードは高レベルのアクションを発行し、ブラウザはScrapelessのインフラストラクチャ上で実行されます。
このガイドでは、サーバーに接続し、ブラウザツールのリストを示し、セッションの作成からレンダリングされたページの読み取り、クリーンに閉じるまでをすべて、ライブサーバーとライブブラウザに対して検証します。ここにはモデルがループに含まれていないため、何も不正確なものはありません。
Scrapelessブラウザツールの理由
Scrapeless MCPサーバーは21のツールを提供しており、そのうち16がブラウザコントロールです:作成と終了、ナビゲーション、クリック、入力、スクロール、キー押下、スクリーンショット、待機です。これらはホストされたScrapelessクラウドブラウザを操作し、これはローカルの自動化スタックがChrome DevToolsプロトコルから得るプログラム制御と同じです。ただし、ブラウザはリモートであり、インストールは不要です。Scrapeless Scraping Browserの記事では、クラウドブラウザとその並行性モデルについて詳しく説明しています。
これらはコンテンツツールと並んで配置されています。scrape_markdownは1回の呼び出しでページを返し、フェッチで十分な場合に適しています。browser_*ツールは、セッションを必要とするページ用です:インタラクト、待機、そして読み取ります。
前提条件
- Python 3.10以降。
- ダッシュボードからのScrapeless APIキーを、
SCRAPELESS_API_KEYとしてエクスポートします。 - ローカルブラウザは不要です。ツールはScrapeless上のクラウドブラウザを駆動します。
インストール
MCPクライアントライブラリをインストールします。
bash
pip install mcp
シェルにScrapelessキーを設定します。実行時に本物のキーを使用し、プレースホルダーをソースから外してください。
bash
export SCRAPELESS_API_KEY="sk_your_key_here"
接続してブラウザツールをリストする
サーバーにストリーミング可能なHTTP接続を開き、セッションを初期化し、ツールをリストします。browser_プレフィックスでフィルタリングすると、クラウドブラウザが提供するインタラクション語彙が表示されます。
python
import asyncio
import os
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def main() -> None:
async with streamablehttp_client(
"https://api.scrapeless.com/mcp", headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]}
) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
names = sorted(tool.name for tool in (await session.list_tools()).tools)
browser_tools = [name for name in names if name.startswith("browser_")]
print("トータルツール数:", len(names))
print("ブラウザツール数:", len(browser_tools))
print(", ".join(browser_tools))
asyncio.run(main())
サーバーは21のツールを報告し、そのうち16がブラウザコントロールです。
text
トータルツール数: 21
ブラウザツール数: 16
browser_click, browser_close, browser_create, browser_get_html, browser_get_text, browser_go_back, browser_go_forward, browser_goto, browser_press_key, browser_screenshot, browser_scroll, browser_scroll_to, browser_snapshot, browser_type, browser_wait, browser_wait_for
トランスポートとメッセージ層はモデルコンテキストプロトコル仕様に従い、JSON-RPC 2.0仕様に基づいています。
ブラウザセッションを駆動する
ブラウザツールはステートフルであるため、パターンは作成、実行、読み取り、終了です。browser_createはセッションIDをテキストで返します。それをキャプチャして、以降のすべての呼び出しに渡します。この例では、JavaScriptでレンダリングされた引用ページに移動し、レンダリングされたテキストを読み取ります。
python
import asyncio
import os
import re
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
def text_of(result) -> str:
return "\n".join(block.text for block in result.content if getattr(block, "type", None) == "text")
async def main() -> None:
async with streamablehttp_client(
"https://api.scrapeless.com/mcp", headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]}
) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
created = text_of(await session.call_tool("browser_create", {}))
session_id = re.search(r"ID:\s*([a-z0-9-]+)", created).group(1)
print("セッションが作成されました:", bool(session_id))
await session.call_tool("browser_goto", {"sessionId": session_id, "url": "https://quotes.toscrape.com/js/"})
text = text_of(await session.call_tool("browser_get_text", {"sessionId": session_id}))
print("レンダリングされた引用:", text.count("Tags:"))
print("引用を含む:", "The world as we have created it" in text)
await session.call_tool("browser_close", {"sessionId": session_id})
print("セッションが終了しました: True")
asyncio.run(main())
引用ページはJavaScriptでコンテンツを描画し、クラウドブラウザがそれを実行するので、browser_get_textはレンダリングされた引用を返し、空のシェルは返しません。
text
セッションが作成されました: True
レンダリングされた引用: 10
引用を含む: True
セッションが終了しました: True
10のレンダリングされた引用は、ブラウザがページのJavaScriptを実行した証拠です。同じURLを通常取得してもゼロが返ってきます。ここからは、browser_click、browser_type、およびbrowser_scrollがセッションを拡張し、コンテンツが表示される前に対話が必要なページに移動し、browser_closeが作業が完了したときにクラウドブラウザを解放します。
結論
Scrapeless MCPブラウザツールは、クラウドブラウザを任意のMCPクライアントが呼び出すことのできる高レベルなアクションのセットに変えます。接続し、16のブラウザツールのリストを取得し、セッションを作成し、移動し、レンダリングされたテキストを読み取って終了します。すべてローカルブラウザなしで、モデルもループ内にありません。ページがコンテンツを放出するためにセッションを必要とする場合は、scrape_markdownに手を伸ばし、必要なクリック、タイプ、スクロールを追加してください。
無料のScrapelessアカウントを作成してAPIキーを取得し、定期的なジョブを計画する際はScrapelessの料金を確認してください。
よくある質問
Q: Scrapeless MCPブラウザツールはローカルブラウザを必要としますか?
いいえ。browser_*ツールはScrapeless上のホストされたクラウドブラウザを操作するため、スクリプトが実際のブラウザを制御することができます。これがローカル自動化スタックとの違いです:ブラウザはリモートで実行され、MCPセッションを通じてアクションを発行します。
Q: ブラウザツールは呼び出し間でどのように状態を保持しますか?
browser_createはセッションIDを返し、その後のすべての呼び出しはそのIDをsessionId引数で渡します。そのIDはbrowser_goto、browser_get_text、およびインタラクションツールを同じブラウザに結びつけ、多段階フローが各呼び出しのたびに最初からやり直すのではなく、1ページ上で動作します。
Q: これはscrape_markdownとどう違うのですか?
scrape_markdownはページを1回の呼び出しで取得し、返します。これは、コンテンツが存在する場合に理想的です。ブラウザツールは、クリック、タイプ、スクロール、またはコンテンツが存在するまでの待機を必要とするページのためにステートフルなセッションを開き、コンテンツツールがそのページで到達できないレンダリング結果を返します。
Q: ブラウザツールはJavaScriptをレンダリングしますか?
はい。クラウドブラウザはページのスクリプトを実行するため、クライアントがレンダリングしたページに移動し、browser_get_textを呼び出すと、レンダリングされたコンテンツが返されます。この確認済みの実行では、JavaScript引用ページから10の引用がありました。同じページを通常取得すると、それらの引用は返されません。
Q: 利用可能なブラウザツールはどれですか?
サーバーは16を公開しています:browser_create、browser_close、browser_goto、browser_go_back、browser_go_forward、browser_get_text、browser_get_html、browser_click、browser_type、browser_press_key、browser_scroll、browser_scroll_to、browser_screenshot、browser_snapshot、browser_wait、およびbrowser_wait_for。これらは、ナビゲーション、対話、待機、読み取りをカバーしています。
Q: ブラウザツールを使用するにはモデルプロバイダキーが必要ですか?
いいえ。ブラウザツールはMCPセッションを介して直接呼び出され、Scrapeless APIキーのみが使用されます。どのツールを呼び出すかを決定するモデルがないためです。モデルプロバイダーキーは、これらのツールをエージェントフレームワークに渡し、モデルがそれらを操作させる場合にのみ重要です。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



