使用 MiniMax 进行多模态网页爬虫

将 Bright Data 网络解锁器与 MiniMax M3 视觉模型配合使用,从图片和网页截图中提取结构化数据。
1 分钟阅读
使用 MiniMax 进行多模态网页抓取

在本文中,你将看到:

  • 多模态网页爬虫为何困难,以及 Bright Data 和 MiniMax 如何帮助你应对这些挑战。
  • 在构建 MiniMax 网页爬虫工具之前需要完成哪些设置。
  • 如何获取多模态网页来源。
  • 如何使用 MiniMax M3 处理这些来源,以实现自动化数据提取。
  • 最终的 MiniMax 网页爬虫脚本。

开始吧!

多模态网页爬虫的主要挑战

多模态网页爬虫涉及从图像、音频、视频以及其他基于视觉或媒体的网页内容中提取数据。这个过程包含两个主要挑战:

  1. 从目标网站获取多模态内容,同时避免被封锁。
  2. 准确解读这些内容,并将其转换为结构化数据。

来了解如何同时解决这两个问题!

使用 Bright Data 高效获取来源

通过自动化请求访问目标多模态内容可能并不容易。这是因为大多数网站都依赖反机器人系统,例如验证码、IP 封禁、速率限制以及其他机制。

Bright Data 的网络解锁器 API通过提供对网页内容的稳定访问来解决这些障碍。它可以通过解决验证码、轮换 IP 等方式处理反机器人和访问限制。它能渲染 JavaScript 密集型页面,并能以适合 AI 处理的格式返回内容。

网络解锁器 API 可以截取网页截图。这样,你就能获取可能无法通过页面 HTML 获得的视觉内容。该 API 还可以直接下载多模态资源,例如托管在 Web 服务器上的 PDF 文件、幻灯片、音频和视频。

网络解锁器 API 的特别之处在于,它运行在 Bright Data 面向企业的基础设施之上。这包括 4 亿多个 IP、99.99% 正常运行时间以及 99.95% 成功率。这样的架构为大规模从任何网站获取网页来源提供了坚实基础。

使用 MiniMax 模型进行智能数据解析

获取所需的多模态来源后,你需要一种可靠方式将其转换为结构化数据。这正是 多模态 AI 模型(如 MiniMax M3)发挥作用的地方。

MiniMax M3 是一个原生多模态 LLM,旨在理解视觉和文本信息。你可以将来源与一个简单的提取提示一起提供。随后,MiniMax M3 可以识别相关信息,并以结构化格式返回,例如 JSON。

开始之前的通用步骤

从较高层面看,使用 MiniMax 进行有效的多模态网页爬虫包含两个步骤:

  1. 使用 Bright Data 网络解锁器 API 从网页获取多模态来源。
  2. 使用 MiniMax M3(或任何其他 MiniMax 多模态模型)处理该来源,以自动提取所需的结构化数据。

在接下来的两章中,你将了解如何执行这些操作。现在,先关注开始前需要满足的先决条件。

步骤 #1:初始化你的 Python 项目

确保你的机器上已安装 Python 3.10+。为你的 MiniMax 网页爬虫项目创建一个新文件夹:

mkdir minimax-scraping

进入该文件夹并添加一个 Python 虚拟环境:

cd minimax-scraping
python -m venv .venv

在项目文件夹中,创建一个 script.py 文件。你将在这里添加使用 MiniMax 进行网页数据提取的 Python 逻辑。另外,再添加两个文件夹:

  • input/:用于记录通过 Bright Data 网络解锁器 API 获取的网页内容。这些文件将作为 MiniMax 的输入。
  • output/:用于存储 MiniMax 生成的结构化 JSON 数据。

你的项目现在应具有这个结构:

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

用你偏好的 Python IDE 打开项目,例如 Visual Studio Code 或 PyCharm。

接下来,在终端中激活虚拟环境。在 Linux 或 macOS 上运行:

source .venv/bin/activate

在 Windows 上运行:

.venv\Scripts\activate

激活虚拟环境后,安装所需依赖:

pip install python-dotenv requests openai pydantic

主要包包括:

  • python-dotenv:用于从 .env 文件读取 API 密钥。
  • requests:用于向 Bright Data 网络解锁器 API 发送请求。
  • openai:用于连接到 OpenAI 兼容的 MiniMax API。

做得好!你现在已经具备用于构建 MiniMax 驱动网页抓取工作流的基础 Python 环境。

步骤 #2:设置环境变量读取

该抓取工具会连接到第三方服务,包括 Bright Data 和 MiniMax。两者都使用 API 密钥进行身份验证。切勿在源代码中硬编码这些凭据。相反,可以考虑将它们存储在 .env 文件中,然后通过 python-dotenv 包加载。

在 script.py 中,导入 load_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 网络解锁器 API 从网页获取多模态来源。随后,你会将这些来源传递给 MiniMax 进行自动化数据提取。

先决条件

在阅读下面两个部分之前,请确保你拥有:

在此示例中,我们将假设你的网络解锁器 API 名为 web_unlocker:

注意类型为“网络解锁器 API”的“web_unlocker” API

请记得按如下方式将你的 Bright Data API 密钥添加到 .env 文件中:

BRIGHT_DATA_API_KEY="<YOUR_BRIGHT_DATA_API_KEY>"

场景 #1:下载图像

假设你想从图像中提取结构化数据,例如这张 Statista 信息图:

用于从中提取数据的 Statista 目标信息图

在浏览器中打开该图像,并查看地址栏中的 URL。你应该会看到:

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

这对应于要提供给网络解锁器 API 的 URL。

首先,你需要在绕过 Web 服务器可能使用的任何反机器人挑战的同时,成功下载该图像。通过向 script.py 添加以下逻辑,使用网络解锁器 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. 从环境加载你的 Bright Data API 密钥(在本例中是 .env 文件)。
  2. 以信息图 URL 作为目标向网络解锁器 API 发送请求。raw 参数会告诉网络解锁器 API 将目标资源直接作为响应正文返回,而不是作为处理后的文本或 HTML 返回。
  3. 使用 web_unlocker_response.content 以字节形式访问响应正文。由于图像以原始字节返回,你可以直接将其写入文件。
  4. 将下载的图像保存为 inputs/ 文件夹中的 infographic.png。

运行脚本。inputs/ 文件夹现在应包含下载的图像:

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

打开 infographic.png验证它是否与上面显示的信息图一致。太棒了!你已经成功使用网络解锁器 API 从网页获取了一张图像。

注意:将结果存储到文件中有助于调试、反复运行测试,以及在下游工作流中处理输出。

场景 #2:截取网页截图

你想提取的数据可能嵌入在网页上的一张或多张图片中。一个很好的例子是餐厅菜单,它可能由直接显示在页面上的多张图片组成。请看下面的菜单:

来自真实餐厅的基于图片的菜单

在这个场景中,网页截图会成为供 MiniMax 进一步处理的源数据。网络解锁器 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" 参数。它会告诉网络解锁器 API 返回目标网页的截图。

运行脚本,你将在 input/ 文件夹中得到一个 screenshot.png 文件:

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

打开它,你会看到:

请注意,完整的餐厅菜单已被捕获到页面截图中

太好了!截图包含完整的目标页面,包括视口之外的信息,并且已准备好传递给 MiniMax 进行数据提取。

如何使用 MiniMax M3 执行基于视觉的爬虫

下面,你将学习如何使用 MiniMax M3 从多模态网页来源中提取数据。

前提条件

要跟随本节操作,请创建一个 MiniMax 账户并为其充值一些额度,以便通过 TokenPlan 按量付费使用:

点击“Get API Key”按钮获取你的 MiniMax API 密钥

这样,你就可以使用 API 密钥通过其 OpenAI 兼容端点访问 MiniMax 模型。

按如下方式将你的 MiniMax API 密钥存储在项目的 .env 文件中:

MINIMAX_API_KEY="<YOUR_MINIMAX_API_KEY>"

步骤 #1:加载源文件

首先加载你想传递给 MiniMax 进行 AI 驱动数据提取的源文件:

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:将源文件传递给 MiniMax M3,进行由 LLM 驱动的网页爬虫

使用 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. 使用 MiniMax 的 OpenAI 兼容端点初始化 OpenAI 客户端,并使用 M3 模型。
  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 Mode 或结构化响应功能。有关如何使用它们的更多信息,请参阅我们的使用 GPT Vision 进行视觉网页抓取指南。

换句话说,模型会以纯文本形式返回结果,而不是直接可解析的 JSON 对象。你可以通过打印 minimax_response_text 来验证这一点。你会看到类似如下内容:

“minimax_response_text" 变量中文本的局部视图

可以看出,响应包含:

  • 模型的 <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

打开它,你会看到:

MiniMax M3 生成的“infographic_data.json”文件

注意,MiniMax M3 提取的数据与通过网络解锁器 API 获取的 Statista 信息图中呈现的信息相匹配。不同之处在于,它现在以结构化 JSON 格式提供。任务完成!

最终脚本:使用 MiniMax 进行爬虫

这是截图场景的最终 MiniMax 驱动提取脚本。源内容通过 Bright Data 网络解锁器 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 文件:

注意生成的 "menu.json" 文件如何包含从视觉菜单中提取的结构化信息

注意,它包含从网站中嵌入的图片里提取出的餐厅菜单信息。

Et voilà!这个简单示例展示了 MiniMax M3 如何执行多模态数据提取,同时由 Bright Data 通过网络解锁器 API 处理视觉源内容的获取。

延伸阅读

如果你对使用其他 LLM 进行网页爬虫感兴趣,请查看这些博客文章:

结论

在本教程中,你了解了如何使用 MiniMax M3 为多模态内容构建 AI 驱动的网页爬虫工具。其中一个最大的挑战是在避免被封锁的同时获取网页来源。Bright Data 的网络解锁器 API 可以处理工作流中的这一部分。

通过将 MiniMax M3 与网络解锁器 API 结合使用,你可以用简单的提示词从图片和页面截图中提取结构化数据。这只是 Bright Data 的 AI-ready 服务支持的众多用例之一。

创建 Bright Data 账户,开始免费试用我们的爬虫 API!

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

Antonello Zanini

技术写作

5.5 years experience

Antonello是一名软件工程师,但他更喜欢称自己为技术传教士。通过写作传播知识是他的使命。

Expertise
Web 开发 网页抓取 AI 集成