MiniMaxによるマルチモーダルウェブスクレイピング

Bright Data Web UnlockerとMiniMax M3ビジョンを組み合わせて、画像やウェブページのスクリーンショットから構造化データを抽出します。
1 分読
Multimodal Web Scraping with MiniMax

この記事では、以下の内容を解説します:

  • マルチモーダルウェブスクレイピングが難しい理由と、Bright DataとMiniMaxがその課題にどう対処するか。
  • MiniMaxウェブスクレイパーを構築する前に必要な準備。
  • マルチモーダルウェブソースの取得方法。
  • 自動データ抽出のためにMiniMax M3でこれらのソースを処理する方法。
  • 最終的なMiniMaxウェブスクレイピングスクリプト。

さっそく始めましょう!

マルチモーダルウェブスクレイピングの主な課題

マルチモーダルウェブスクレイピングとは、画像・音声・動画などのビジュアルまたはメディアベースのウェブコンテンツからデータを抽出することです。このプロセスには主に2つの課題があります:

  1. 対象ウェブサイトからブロックされずにマルチモーダルコンテンツを取得すること。
  2. そのコンテンツを正確に解釈し、構造化データに変換すること。

両方の解決策を学びましょう!

Bright Dataによる効果的なソース取得

自動リクエストでマルチモーダルコンテンツにアクセスするのは簡単ではありません。多くのウェブサイトがCAPTCHA、IPバン、レート制限などのアンチボットシステムを採用しているためです。

Bright DataのWeb Unlocker APIは、ウェブコンテンツへの安定したアクセスを提供することでこれらの障壁に対処します。CAPTCHAの解決やIPのローテーションなどにより、アンチボット・アクセス制限を処理します。JavaScriptが多用されたページをレンダリングし、AI処理に適した形式でコンテンツを返すことができます。

Web Unlocker APIはウェブページのスクリーンショットを撮影できます。これにより、ページのHTMLからは取得できないビジュアルコンテンツを取得できます。APIはPDFファイル、スライド、音声、動画など、ウェブサーバーでホストされているマルチモーダルリソースを直接ダウンロードすることもできます。

Web Unlocker APIが優れているのは、Bright Dataのエンタープライズ対応インフラ上で動作している点です。4億以上のIP、99.99%の稼働率、99.95%の成功率を誇ります。このアーキテクチャにより、あらゆるウェブサイトから大規模にウェブソースを取得するための堅固な基盤が提供されます。

MiniMaxモデルによるインテリジェントなデータパース

必要なマルチモーダルソースを取得したら、それを構造化データに変換する信頼性の高い方法が必要です。ここでMiniMax M3などのマルチモーダルAIモデルが役立ちます。

MiniMax M3は、ビジュアル情報とテキスト情報を理解するために設計されたネイティブマルチモーダルLLMです。ソースと簡単な抽出プロンプトを提供するだけで、MiniMax M3は関連情報を特定し、JSONなどの構造化フォーマットで返すことができます。

開始前の共通手順

MiniMaxによる効果的なマルチモーダルウェブスクレイピングは、大きく分けて2つのステップで構成されます:

  1. Bright Data Web Unlocker APIを使用してウェブからマルチモーダルソースを取得する。
  2. MiniMax M3(または他のMiniMaxマルチモーダルモデル)でソースを処理し、必要な構造化データを自動抽出する。

以降の2つの章で、これらの操作の実行方法を学びます。まずは、開始に必要な前提条件に集中しましょう。

ステップ #1:Pythonプロジェクトの初期化

Python 3.10以降がマシンにインストールされていることを確認してください。MiniMaxウェブスクレイピングプロジェクト用の新しいフォルダを作成します:

mkdir minimax-scraping

フォルダに移動し、Python仮想環境を追加します:

cd minimax-scraping
python -m venv .venv

プロジェクトフォルダ内にscript.pyファイルを作成します。ここにMiniMaxを使ったウェブデータ抽出のPythonロジックを記述します。また、2つのフォルダも追加します:

  • input/:Bright Data Web Unlocker APIで取得したウェブコンテンツを保管します。これらのファイルはMiniMaxへの入力として使用されます。
  • output/:MiniMaxが生成した構造化JSONデータを保存します。

プロジェクトの構造は次のようになります:

minimax-scraping/
├── .venv/
├── input/
├── output/
└── script.py

Visual Studio CodePyCharmなど、お好みのPython IDEでプロジェクトを開きます。

次に、ターミナルで仮想環境を有効化します。LinuxまたはmacOSの場合は以下を実行します:

source .venv/bin/activate

Windowsの場合は以下を実行します:

.venv\Scripts\activate

仮想環境が有効な状態で、必要な依存関係をインストールします:

pip install python-dotenv requests openai pydantic

主なパッケージは以下の通りです:

  • python-dotenv.envファイルからAPIシークレットを読み込みます。
  • requests:Bright Data Web Unlocker APIにリクエストを送信します。
  • openai:OpenAI互換のMiniMax APIに接続します。

お疲れ様です!MiniMax搭載のウェブスクレイピングワークフローを構築するための基本的なPython環境が整いました。

ステップ #2:環境変数の読み込み設定

スクレイパーはBright DataとMiniMaxを含むサードパーティサービスに接続します。どちらも認証にAPIキーを使用します。これらの認証情報をソースコードにハードコードしないでください。代わりに、python-dotenvパッケージで読み込める.envファイルに保存することを検討してください。

script.pyload_dotenv()をインポートして呼び出します:

from dotenv import load_dotenv

# Load the environment variables from the .env file
load_dotenv()

次に、プロジェクトフォルダに.envファイルを追加します:

minimax-scraper/
├── .venv/
├── .env # <-----
├── input/
├── output/
└── script.py

これで準備完了です!コードに直接公開することなく、環境からAPIキーを読み込めるようになりました。

ヒント:プロジェクトのバージョン管理にGitを使用する場合は、.env.gitignoreファイルに追加してください。これにより、誤ってAPIキーをコミットするのを防げます。

Bright Dataでマルチモーダルウェブソースを取得する方法

このセクションでは、Bright Data Web Unlocker APIを使用してウェブからマルチモーダルソースを取得する方法を説明します。取得したソースは、自動データ抽出のためにMiniMaxに渡します。

前提条件

以下の2つのセクションに進む前に、以下が準備できていることを確認してください:

この例では、Web Unlocker APIの名前がweb_unlockerであると仮定します:

Note the

Bright Data APIキーを以下のように.envファイルに追加することを忘れないでください:

BRIGHT_DATA_API_KEY="<YOUR_BRIGHT_DATA_API_KEY>"

シナリオ #1:画像のダウンロード

このStatistaのインフォグラフィックのような画像から構造化データを抽出したいとします:

The target infographic from Statista to extract data from

ブラウザで画像を開き、アドレスバーのURLを確認してください。以下のように表示されるはずです:

https://media.brightdata.com/2026/09/36569.jpeg

これがWeb Unlocker APIに渡すURLです。

まず、ウェブサーバーが使用する可能性のあるアンチボットの課題を回避しながら、画像を正常にダウンロードする必要があります。以下のロジックをscript.pyに追加することで、Web Unlocker APIを通じて実現できます:

import os
import requests

# Loading the Bright Data API key from the envs
BRIGHT_DATA_API_KEY = os.environ.get("BRIGHT_DATA_API_KEY")

# Set up the authentication headers for the Web Unlocker API
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {BRIGHT_DATA_API_KEY}"
}

# The target URL of the infographic resource
target_url = "https://media.brightdata.com/2026/09/36569.jpeg"
# Define the request payload for the Web Unlocker API call
payload = {
    "zone": "web_unlocker", # Replace with your Web Unlocker zone name
    "url": target_url,
    "format": "raw",
    "country": "us",
}

# Fetch the unlocked content of the infographic 
web_unlocker_response = requests.post(
    "https://api.brightdata.com/request",
    json=payload,
    headers=headers
)
infographic_image = web_unlocker_response.content

# Export the infographic image to a PNG file
with open("input/infographic.png", "wb") as f:
    f.write(infographic_image)

このコードスニペットは以下を行います:

  1. 環境(この場合は.envファイル)からBright Data APIキーを読み込みます。
  2. インフォグラフィックのURLをターゲットとしてWeb Unlocker APIにリクエストを送信します。raw引数は、処理済みのテキストやHTMLではなく、レスポンスボディに直接宛先リソースを返すようWeb Unlocker APIに指示します。
  3. web_unlocker_response.contentを使用してレスポンスボディにバイトとしてアクセスします。画像は生のバイトとして返されるため、直接ファイルに書き込むことができます。
  4. ダウンロードした画像をinputs/フォルダ内にinfographic.pngとして保存します。

スクリプトを実行してください。inputs/フォルダにダウンロードされた画像が表示されるはずです:

minimax-scraping/
├── .venv/
├── input/
│   └── infographic.png # <-----
├── output/
├── .env
└── script.py

infographic.pngを開いて、上記のインフォグラフィックと一致することを確認してください。素晴らしい!Web Unlocker APIを使用してウェブから画像を正常に取得できました。

注意:結果をファイルに保存すると、デバッグ、繰り返しテスト、ダウンストリームワークフローでの出力処理に役立ちます。

シナリオ #2:ウェブページのスクリーンショット撮影

抽出したいデータがウェブページ上の1つ以上の画像に埋め込まれている場合があります。良い例はレストランのメニューで、ページ上に直接表示される複数の画像で構成されることがあります。以下のメニューを考えてみましょう:

The image-based menu from a real-world restaurant

このシナリオでは、ウェブページのスクリーンショットがMiniMaxによるさらなる処理のためのソースデータになります。Web Unlocker APIは、アンチボット対策で保護されたページを含む任意のウェブサイトのスクリーンショットを撮影できます。以下のようにして実現できます:

import os
import requests

# Loading the Bright Data API key from the envs
BRIGHT_DATA_API_KEY = os.environ.get("BRIGHT_DATA_API_KEY")

# Set up the authentication headers for the Web Unlocker API
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {BRIGHT_DATA_API_KEY}"
}

# The target URL of the page you want to capture
target_url = "https://www.impostospizza.com/menu"
# Define the request payload for the Web Unlocker API call
payload = {
    "zone": "web_unlocker", # Replace with your Web Unlocker zone name
    "url": target_url,
    "format": "raw",
    "country": "us",
    "data_format": "screenshot" # To get the full screenshot of the web page
}

# Fetch the screenshot from the unlocked target page
web_unlocker_response = requests.post(
    "https://api.brightdata.com/request",
    json=payload,
    headers=headers
)
page_screenshot = web_unlocker_response.content

# Export the screenshot to a PNG file
with open("input/screenshot.png", "wb") as f:
    f.write(page_screenshot)

data_format="screenshot"パラメータに注目してください。これはWeb Unlocker APIに対象ウェブページのスクリーンショットを返すよう指示します。

スクリプトを実行すると、input/フォルダ内にscreenshot.pngファイルが作成されます:

minimax-scraping/
├── .venv/
├── input/
│   └── screenshot.png # <-----
├── output/
├── .env
└── script.py

開くと、以下が表示されます:

Notice that the full restaurant menu is captured in the page screenshot

素晴らしい!スクリーンショットにはターゲットページ全体(ビューポート外の情報も含む)が含まれており、MiniMaxによるデータ抽出のために渡す準備が整っています。

MiniMax M3でビジュアルベースのスクレイピングを実行する方法

以下では、MiniMax M3を使用してマルチモーダルウェブソースからデータを抽出する方法を学びます。

前提条件

このセクションを進めるには、MiniMaxアカウントを作成し、TokenPlanによる従量課金制のクレジットをチャージしてください:

Retrieve your MiniMax API key by clicking the

これにより、OpenAI互換エンドポイントを使用してAPIキーでMiniMaxモデルにアクセスできるようになります。

MiniMax APIキーをプロジェクトの.envファイルに以下のように保存します:

MINIMAX_API_KEY="<YOUR_MINIMAX_API_KEY>"

ステップ #1:ソースファイルの読み込み

まず、AIによるデータ抽出のためにMiniMaxに渡すソースファイルを読み込みます:

import base64

with open("input/<file_name>.<file_extension>", "rb") as screenshot_file:
  screenshot_base64 = base64.b64encode(screenshot_file.read()).decode("utf-8")

ファイルはBase64に変換されます。これはOpenAI互換エンドポイントで画像入力としてサポートされているフォーマットです。

インフォグラフィックのシナリオでは、以下を使用します:

with open("input/infographic.png", "rb") as infographic_file:
  infographics_base64 = base64.b64encode(infographic_file.read()).decode("utf-8")

Instead, for the web page screenshot, write:

with open("input/screenshot.png", "rb") as screenshot_file:
  screenshot_base64 = base64.b64encode(screenshot_file.read()).decode("utf-8")

完了です!MiniMaxが必要とするフォーマットでソース画像が読み込まれ、エンコードされました。

ステップ #2:LLM搭載ウェブスクレイピングのためにMiniMax M3にソースファイルを渡す

OpenAI SDKを使用して、エンコードされた画像と抽出したいデータを説明するプロンプトをMiniMax M3に送信します:

from openai import OpenAI

# Load the MiniMax API key from the envs
MINIMAX_API_KEY = os.environ.get("MINIMAX_API_KEY")

# Initialize the OpenAI client for MiniMax
minimax_client = OpenAI(
    api_key=MINIMAX_API_KEY,
    base_url="https://api.minimax.io/v1",
)

# The data extraction prompt
prompt = """
<YOUR_PROMPT_FOR_DATA_EXTRACTION>
"""

# Perform visual data parsing with MiniMax
response = minimax_client.responses.create(
    model="MiniMax-M3",
    input=[
        {
            "role": "user",
            "content": [
                {
                    "type": "input_image",
                    "image_url": {
                        "url": f"data:image/png;base64,{screenshot_base64}",
                    },
                },
                {
                    "type": "input_text",
                    "text": prompt,
                },
            ],
        }
    ],
)

上記のコードは以下を行います:

  1. 環境からMiniMax APIキーを読み込みます。
  2. M3モデルでMiniMaxのOpenAI互換エンドポイントを使用してOpenAIクライアントを初期化します。
  3. Responses APIを通じて、ソース画像と抽出プロンプトをMiniMax M3に送信します。

注意:MiniMaxが構造化データを返すようにするには、プロンプトで出力をJSON形式にするよう明示的に指示してください。

インフォグラフィックのシナリオでは、シンプルなプロンプトを使用できます:

prompt = "Analyze the attached infographics and return a JSON object containing all visible metadata and data points."

レストランのメニュースクリーンショットには、より具体的なプロンプトを使用することをお勧めします:

prompt = """
Analyze the provided screenshot and return the menu data in a clean, structured JSON format.

**Guidelines**:
- Ignore all non-menu elements such as navigation bars, header logos, contact details, social media icons, addresses, phone numbers, and website footers.
- Group items under their respective category headers as seen on the menu.
- Capture item variations or sizes accurately.
"""

完璧です!これでMiniMax M3のデータ抽出ステップが完了しました。モデルのレスポンスを読み取り、生成された構造化データをJSONとしてエクスポートする時が来ました。

ステップ #3:構造化レスポンスの取得

以下でモデルのレスポンスにアクセスします:

minimax_response_text = response.output_text

執筆時点では、MiniMax M2.5とM3はOpenAIのJSONモードや構造化レスポンス機能をサポートしていません。使用方法の詳細については、GPT Visionによるビジュアルウェブスクレイピングのガイドを参照してください。

つまり、モデルは結果を直接パース可能なJSONオブジェクトではなく、プレーンテキストとして返します。minimax_response_textを出力することで確認できます。以下のようなものが表示されます:

A partial view of the text in

ご覧の通り、レスポンスには以下が含まれています:

  • モデルの<think>コンテキスト。
  • テキスト。
  • プロンプトで要求したJSON構造を含むコードブロック。

JSONデータを抽出するには、正規表現を使用してコードブロックを検索します。次に、PythonのビルトインのJSONモジュールで抽出した文字列を検証します:

import re
import json

# Extract JSON string inside ```json ... ``` or ``` ... ``` code blocks
match = re.search(r"```(?:json)?\s*([\s\S]*?)\s*```", minimax_response_text)

if match:
    json_string = match.group(1).strip()
else:
    # Fallback to the raw response text if no code blocks are found
    json_string = minimax_response_text

try:
    # Parse the extracted string to ensure it is valid JSON
    parsed_json = json.loads(json_string)

    # Save the formatted JSON to a file
    with open("output/<file_name>.json", "w", encoding="utf-8") as f:
        json.dump(parsed_json, f, indent=2, ensure_ascii=False)

except json.JSONDecodeError as e:
    print(f"Error: Extracted text is not valid JSON - {e}")

インフォグラフィックのシナリオでは、エクスポートセクションを以下に置き換えます:

with open("output/infographic_data.json", "w", encoding="utf-8") as f:
    json.dump(parsed_json, f, indent=2, ensure_ascii=False)

レストランメニューの場合は、以下を記述します:

with open("output/menu.json", "w", encoding="utf-8") as f:
    json.dump(parsed_json, f, indent=2, ensure_ascii=False)

素晴らしい!これによりoutput/フォルダにJSONファイルが生成されます。マルチモーダル機能を通じてMiniMax M3がソース画像から抽出した構造化データが含まれます。

ステップ #4:出力の確認

インフォグラフィックのユースケースでMiniMaxスクレイピングスクリプトを実行します。output/フォルダにinfographic_data.jsonファイルが表示されます:

minimax-scraping/
├── .venv/
├── input/
│   └── infographic.png
├── output/
│    └── infographic_data.json # <-----
├── .env
└── script.py

開くと、以下が表示されます:

The

MiniMax M3が抽出したデータが、Web Unlocker APIを通じて取得したStatisticaのインフォグラフィックに表示されている情報と一致していることがわかります。違いは、構造化されたJSON形式で利用できるようになった点です。ミッション完了!

最終スクリプト:MiniMaxによるスクレイピング

これはスクリーンショットシナリオ向けのMiniMax搭載最終抽出スクリプトです。ソースはBright Data Web Unlocker APIを通じて取得されます:

# pip install python-dotenv openai requests

from dotenv import load_dotenv
import os
import requests
import base64
from openai import OpenAI
import re
import json

# Load the environment variables from the .env file
load_dotenv()

# Loading the required secrets from the envs
BRIGHT_DATA_API_KEY = os.environ.get("BRIGHT_DATA_API_KEY")
MINIMAX_API_KEY = os.environ.get("MINIMAX_API_KEY")

# Set up the authentication headers for the Web Unlocker API
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {BRIGHT_DATA_API_KEY}"
}

# The target URL of the page you want to capture
target_url = "https://www.impostospizza.com/menu"
# Define the request payload for the Web Unlocker API call
payload = {
    "zone": "web_unlocker", # Replace with your Web Unlocker zone name
    "url": target_url,
    "format": "raw",
    "country": "us",
    "data_format": "screenshot" # To get the full screenshot of the web page
}

# Fetch the screenshot from the unlocked target page
web_unlocker_response = requests.post(
    "https://api.brightdata.com/request",
    json=payload,
    headers=headers
)
page_screenshot = web_unlocker_response.content

# Export the screenshot to a PNG file
with open("input/screenshot.png", "wb") as f:
    f.write(page_screenshot)

# Convert the screenshot to base64 for MiniMax processing
with open("input/screenshot.png", "rb") as screenshot_file:
  screenshot_base64 = base64.b64encode(screenshot_file.read()).decode("utf-8")

# Initialize the OpenAI client for MiniMax
minimax_client = OpenAI(
    api_key=MINIMAX_API_KEY,
    base_url="https://api.minimax.io/v1",
)

# The data extraction prompt
prompt = """
Analyze the provided screenshot and return the menu data in a clean, structured JSON format.

**Guidelines**:
- Ignore all non-menu elements such as navigation bars, header logos, contact details, social media icons, addresses, phone numbers, and website footers.
- Group items under their respective category headers as seen on the menu.
- Capture item variations or sizes (e.g., Small/Large prices, slice vs. whole pie) accurately.
"""

# Perform visual data parsing with MiniMax
response = minimax_client.responses.create(
    model="MiniMax-M3",
    input=[
        {
            "role": "user",
            "content": [
                {
                    "type": "input_image",
                    "image_url": {
                        "url": f"data:image/png;base64,{screenshot_base64}",
                    },
                },
                {
                    "type": "input_text",
                    "text": prompt,
                },
            ],
        }
    ],
)

# Get the parsed data
minimax_response_text = response.output_text

# Extract JSON string inside ```json ... ``` or ``` ... ``` code blocks
match = re.search(r"```(?:json)?\s*([\s\S]*?)\s*```", minimax_response_text)

if match:
    json_string = match.group(1).strip()
else:
    # Fallback to the raw response text if no code blocks are found
    json_string = minimax_response_text

try:
    # Parse the extracted string to ensure it is valid JSON
    parsed_json = json.loads(json_string)

    # Save the formatted JSON to a file
    with open("output/menu.json", "w", encoding="utf-8") as f:
        json.dump(parsed_json, f, indent=2, ensure_ascii=False)

except json.JSONDecodeError as e:
    print(f"Error: Extracted text is not valid JSON - {e}")

注意:コードをインフォグラフィックのユースケースに合わせて簡単に適応できます。

仮想環境を有効化した状態で、以下のコマンドでスクリプトを実行します:

python script.py

これによりoutput/フォルダにmenu.jsonファイルが作成されます:

Note how the produced "menu.json" file contains structured info extracted from the visual menu

ウェブサイトに埋め込まれた画像から抽出されたレストランのメニュー情報が含まれていることがわかります。

これで完成です!このシンプルな例は、MiniMax M3がマルチモーダルデータ抽出を実行でき、Bright DataがWeb Unlocker APIを通じてビジュアルソースの取得を処理する方法を示しています。

参考資料

他のLLMを使ったウェブスクレイピングに興味がある方は、以下のブログ記事をご覧ください:

まとめ

このチュートリアルでは、MiniMax M3を使用してマルチモーダルコンテンツ向けのAI搭載ウェブスクレイパーを構築する方法を理解しました。最大の課題の1つは、ブロックを回避しながらウェブソースを取得することです。Bright DataのWeb Unlocker APIがこのワークフローの部分を処理できます。

MiniMax M3とWeb Unlocker APIを組み合わせることで、シンプルなプロンプトを使用して画像やページスクリーンショットから構造化データを抽出できます。これはBright DataのAI対応サービスがサポートする多くのユースケースの1つに過ぎません。

Bright Dataアカウントを作成して、ウェブスクレイピングAPIを無料で試してみましょう!