AI

Веб-скрапинг с помощью серверов MCP: Пошаговое руководство

Создайте MCP-сервер для соскабливания данных по требованию, подключения к инструментам разработчика и интеграции Bright Data для получения веб-данных с поддержкой искусственного интеллекта в режиме реального времени.
10 мин. чтения
Web Scraping With an MCP Server blog image

В этом руководстве мы рассмотрим создание локального MCP-сервера на Python для поиска данных о товарах Amazon по запросу. Вы узнаете об основах MCP, о том, как написать и запустить собственный сервер, а также как подключить его к таким инструментам разработчика, как Claude Desktop и Cursor IDE. В завершение мы продемонстрируем реальную интеграцию Bright Data с MCP для получения веб-данных в режиме реального времени, готовых к искусственному интеллекту.

Давайте погрузимся.

Узкое место: Почему магистранты испытывают трудности с взаимодействием с реальным миром (и как MCP решает эту проблему)

Большие языковые модели (LLM) невероятно мощно обрабатывают и генерируют текст из массивных обучающих наборов данных. Но у них есть одно ключевое ограничение – они не могут взаимодействовать с реальным миром. Это означает отсутствие доступа к локальным файлам, запуска пользовательских скриптов и получения данных из Интернета.

Возьмем простой пример: попросите Claude получить данные о продукте с живой страницы Amazon, и он не сможет этого сделать. Почему? Потому что у него нет встроенной возможности просматривать веб-страницы или запускать внешние действия.

claude-without-mcp

Без внешнего инструментария LLM не могут выполнять практические задачи, которые зависят от данных в реальном времени или интеграции с внешними системами.

Именно здесь на помощь приходит протокол контекста модели Anthropic (MCP). Он позволяет LLM общаться с внешними инструментами – скреперами, API или скриптами – безопасным и стандартизированным способом.

Вот разница в действии. После интеграции пользовательского MCP-сервера мы смогли извлекать структурированные данные о товарах Amazon непосредственно через Claude:

claude-amazon-product-data-extraction-results

Не беспокойтесь пока о том, как это работает – мы расскажем обо всем пошагово далее в руководстве.

Почему MCP имеет значение?

  • Стандартизация: MCP предоставляет стандартизированный интерфейс для подключения систем на базе LLM к внешним инструментам и данным – подобно тому, как API стандартизируют веб-интеграции. Это значительно сокращает потребность в пользовательских интеграциях и ускоряет разработку.
  • Гибкость и масштабируемость: Разработчики могут менять LLM или хостинговые платформы, не переписывая интеграцию инструментов. MCP поддерживает множество коммуникационных транспортов (например, stdio), что делает его адаптируемым к различным настройкам.
  • Расширенные возможности LLM: Подключая LLM к живым данным и внешним инструментам, MCP позволяет им выйти за рамки статичных ответов. Теперь они могут возвращать актуальную, релевантную информацию и запускать реальные действия, основанные на контексте.

Аналогия: Считайте, что MCP – это USB-интерфейс для LLM. Как USB позволяет подключать различные устройства (клавиатуры, принтеры, внешние накопители) к любой совместимой машине, не требуя специальных драйверов, так и MCP позволяет LLM подключаться к широкому спектру инструментов по стандартизированному протоколу – без необходимости каждый раз интегрировать их по своему усмотрению.

Что такое контекстный протокол модели (MCP)?

Model Context Protocol (MCP) – это открытый стандарт, разработанный компанией Anthropic, который позволяет большим языковым моделям (LLM) взаимодействовать с внешними инструментами, API и источниками данных согласованным и безопасным способом. Он выступает в качестве универсального коннектора, позволяющего LLM выполнять такие реальные задачи, как поиск веб-сайтов, запрос баз данных или запуск скриптов.

Стандарт MCP является открытым и расширяемым, то есть любой желающий может его внедрить или внести свой вклад в его развитие. Если вы работали с Retrieval-Augmented Generation (RAG), вы оцените эту концепцию. MCP опирается на эту идею, стандартизируя взаимодействие через легкий интерфейс JSON-RPC, чтобы модели могли получать доступ к живым данным и предпринимать действия.

Архитектура MCP: Как это работает

По своей сути MCP стандартизирует связь между моделью ИИ и внешними возможностями.

Основная идея: Стандартизированный интерфейс (обычно JSON-RPC 2.0 через транспорты типа stdio) позволяет LLM (через клиента) обнаруживать и вызывать инструменты, предоставляемые внешними серверами.

MCP работает по архитектуре клиент-сервер, состоящей из трех ключевых компонентов:

  1. MCP Host: Среда или приложение, которое инициирует и управляет взаимодействием между LLM и внешними инструментами. Примерами могут служить помощники ИИ, такие как Claude Desktop, или IDE, такие как Cursor.
  2. Клиент MCP: Компонент хоста, который устанавливает и поддерживает соединения с серверами MCP, обрабатывает протоколы связи и управляет обменом данными.
  3. MCP-сервер: Программа (которую создаем мы, разработчики), реализующая протокол MCP и предоставляющая определенный набор возможностей. MCP-сервер может взаимодействовать с базой данных, веб-сервисом или, как в нашем случае, с веб-сайтом (Amazon). Серверы раскрывают свою функциональность стандартными способами
    :Polylang placeholder do not modify

Вот схема архитектуры MCP:

mcp-architecture-diagram-host-client-server-connections

Источник изображения: Контекстный протокол модели

При такой настройке хост (Claude Desktop или Cursor IDE) порождает MCP-клиент, который затем подключается к внешнему MCP-серверу. Этот сервер открывает инструменты, ресурсы и подсказки, позволяя ИИ взаимодействовать с ними по мере необходимости.

Вкратце, рабочий процесс выглядит следующим образом:

  • Пользователь отправляет сообщение типа “Получить информацию о продукте по этой ссылке Amazon”.
  • Клиент MCP проверяет наличие зарегистрированного инструмента, который может справиться с этой задачей
  • Клиент отправляет структурированный запрос на сервер MCP
  • Сервер MCP выполняет соответствующее действие (например, запускает безголовый браузер).
  • Сервер возвращает структурированные результаты клиенту MCP
  • Клиент передает результаты в LLM, который представляет их пользователю.

Создание пользовательского сервера MCP

Давайте создадим MCP-сервер на Python, который будет скрести страницы товаров Amazon.

amazon-product-page-example

На этом сервере будут представлены два инструмента: один для загрузки HTML, а другой – для извлечения структурированной информации. Вы будете взаимодействовать с сервером через LLM-клиент в Cursor или Claude Desktop.

Шаг 1: Настройка среды

Во-первых, убедитесь, что у вас установлен Python 3. Затем создайте и активируйте виртуальную среду:

python -m venv mcp-amazon-scraper
# On macOS/Linux:
source mcp-amazon-scraper/bin/activate
# On Windows:
.\mcp-amazon-scraper\Scripts\activate

Установите необходимые библиотеки: MCP Python SDK, Playwright и LXML.

pip install mcp playwright lxml
# Install browser binaries for Playwright
python -m playwright install

Это устанавливает:

  • mcp: Python SDK для серверов и клиентов Model Context Protocol, который обрабатывает все детали взаимодействия JSON-RPC
  • playwright: Библиотека автоматизации браузера, предоставляющая возможности “безголового” браузера для рендеринга и создания веб-сайтов на JavaScript
  • lxml: Библиотека для быстрого разбора XML/HTML, которая позволяет легко извлекать определенные элементы данных из веб-страниц с помощью запросов XPath

Короче говоря, MCP Python SDK(mcp) обрабатывает все детали протокола, позволяя вам создавать инструменты, которые Claude или Cursor могут вызывать с помощью подсказок на естественном языке. Playwright позволяет нам полностью рендерить веб-страницы (включая содержимое JavaScript), а lxml дает нам мощные возможности разбора HTML.

Шаг 2: Инициализация сервера MCP

Создайте Python-файл с именем amazon_scraper_mcp.py. Начните с импорта необходимых модулей и инициализации сервера FastMCP:

import os
import asyncio
from lxml import html as lxml_html
from mcp.server.fastmcp import FastMCP
from playwright.async_api import async_playwright

# Define a temporary file path for the HTML content
HTML_FILE = os.path.join(os.getenv("TMPDIR", "/tmp"), "amazon_product_page.html")

# Initialize the MCP server with a descriptive name
mcp = FastMCP("Amazon Product Scraper")

print("MCP Server Initialized: Amazon Product Scraper")

Это создаст экземпляр сервера MCP. Теперь мы добавим на него инструменты.

Шаг 3: Реализация инструмента fetch_page

Этот инструмент принимает URL-адрес, использует Playwright для перехода на страницу, дожидается загрузки содержимого, загружает HTML и сохраняет его во временном файле.

@mcp.tool()
async def fetch_page(url: str) -> str:
    """
    Fetches the HTML content of the given Amazon product URL using Playwright
    and saves it to a temporary file. Returns a status message.
    """
    print(f"Executing fetch_page for URL: {url}")
    try:
        async with async_playwright() as p:
            # Launch headless Chromium browser
            browser = await p.chromium.launch(headless=True)
            page = await browser.new_page()
            # Navigate to the URL with a generous timeout
            await page.goto(url, timeout=90000, wait_until="domcontentloaded")
            # Wait for a key element (e.g., body) to ensure basic loading
            await page.wait_for_selector("body", timeout=30000)
            # Add a small delay for any dynamic content rendering via JavaScript
            await asyncio.sleep(5)

            html_content = await page.content()
            with open(HTML_FILE, "w", encoding="utf-8") as f:
                f.write(html_content)

            await browser.close()
            print(f"Successfully fetched and saved HTML to {HTML_FILE}")
            return f"HTML content for {url} downloaded and saved successfully to {HTML_FILE}."
    except Exception as e:
        error_message = f"Error fetching page {url}: {str(e)}"
        print(error_message)
        return error_message

Эта асинхронная функция использует Playwright для обработки потенциального рендеринга JavaScript на страницах Amazon. Декоратор @mcp.tool() регистрирует эту функцию как вызываемый инструмент на нашем сервере.

Шаг 4: Реализация инструмента extract_info

Этот инструмент считывает HTML-файл, сохраненный fetch_page, разбирает его с помощью селекторов LXML и XPath и возвращает словарь, содержащий извлеченные сведения о продукте.

def _extract_xpath(tree, xpath, default="N/A"):
    """Helper function to extract text using XPath, returning default if not found."""
    try:
        # Use text_content() to get text from node and children, strip whitespace
        result = tree.xpath(xpath)
        if result:
            return result[0].text_content().strip()
        return default
    except Exception:
        return default

def _extract_price(price_str):
    """Helper function to parse price string into a float."""
    if price_str == "N/A":
        return None
    try:
        # Remove currency symbols and commas, handle potential whitespace
        cleaned_price = "".join(filter(str.isdigit or str.__eq__("."), price_str))
        return float(cleaned_price)
    except (ValueError, TypeError):
        return None

@mcp.tool()
def extract_info() -> dict:
    """
    Parses the saved HTML file (downloaded by fetch_page) to extract
    Amazon product details like title, price, rating, features, etc.
    Returns a dictionary of the extracted data.
    """
    print(f"Executing extract_info from file: {HTML_FILE}")
    if not os.path.exists(HTML_FILE):
        return {
            "error": f"HTML file not found at {HTML_FILE}. Please run fetch_page first."
        }

    try:
        with open(HTML_FILE, "r", encoding="utf-8") as f:
            page_html = f.read()

        tree = lxml_html.fromstring(page_html)

        # --- XPath Selectors for Amazon Product Details ---
        title = _extract_xpath(tree, '//span[@id="productTitle"]')
        # Handle different price structures (main price, sale price)
        price_whole = _extract_xpath(tree, '//span[contains(@class, "a-price-whole")]')
        price_fraction = _extract_xpath(
            tree, '//span[contains(@class, "a-price-fraction")]'
        )
        price_str = (
            f"{price_whole}.{price_fraction}"
            if price_whole != "N/A"
            else _extract_xpath(tree, '//span[contains(@class,"a-offscreen")]')
        )  # Fallback to offscreen if needed

        price = _extract_price(price_str)

        # Original price (strike-through)
        original_price_str = _extract_xpath(
            tree, '//span[@class="a-price a-text-price"]//span[@class="a-offscreen"]'
        )
        original_price = _extract_price(original_price_str)

        # Rating
        rating_text = _extract_xpath(tree, '//span[@id="acrPopover"]/@title')
        rating = None
        if rating_text != "N/A":
            try:
                rating = float(rating_text.split()[0])
            except (ValueError, IndexError):
                rating = None

        # Review Count
        reviews_text = _extract_xpath(tree, '//span[@id="acrCustomerReviewText"]')
        review_count = None
        if reviews_text != "N/A":
            try:
                review_count = int(reviews_text.split()[0].replace(",", ""))
            except (ValueError, IndexError):
                review_count = None

        # Availability
        availability = _extract_xpath(
            tree,
            '//div[@id="availability"]//span/text()',
        )

        # Features (bullet points)
        feature_elements = tree.xpath(
            '//div[@id="feature-bullets"]//li//span[@class="a-list-item"]'
        )
        features = [
            elem.text_content().strip()
            for elem in feature_elements
            if elem.text_content().strip()
        ]

        # Calculate Discount
        discount = None
        if price and original_price and original_price > price:
            discount = round(((original_price - price) / original_price) * 100)

        extracted_data = {
            "title": title,
            "price": price,
            "original_price": original_price,
            "discount_percent": discount,
            "rating_stars": rating,
            "review_count": review_count,
            "features": features,
            "availability": availability.strip(),
        }
        print(f"Successfully extracted data: {extracted_data}")
        return extracted_data

    except Exception as e:
        error_message = f"Error parsing HTML: {str(e)}"
        print(error_message)  # Added for logging
        return {"error": error_message}

Эта функция использует функцию LXML fromstring для разбора HTML и надежные селекторы XPath для поиска нужных элементов.

Шаг 5: Запустите сервер

Наконец, добавьте следующие строки в конец сценария amazon_scraper_mcp.py, чтобы запустить сервер, используя транспортный механизм stdio, который является стандартным для локальных MCP-серверов, взаимодействующих с такими клиентами, как Claude Desktop или Cursor.

if __name__ == "__main__":
    print("Starting MCP Server with stdio transport...")
    # Run the server, listening via standard input/output
    mcp.run(transport="stdio")

Полный код(amazon_scraper_mcp.py)

import os
import asyncio
from lxml import html as lxml_html
from mcp.server.fastmcp import FastMCP
from playwright.async_api import async_playwright

# Define a temporary file path for the HTML content
HTML_FILE = os.path.join(os.getenv("TMPDIR", "/tmp"), "amazon_product_page.html")

# Initialize the MCP server with a descriptive name
mcp = FastMCP("Amazon Product Scraper")

print("MCP Server Initialized: Amazon Product Scraper")

@mcp.tool()
async def fetch_page(url: str) -> str:
    """
    Fetches the HTML content of the given Amazon product URL using Playwright
    and saves it to a temporary file. Returns a status message.
    """
    print(f"Executing fetch_page for URL: {url}")
    try:
        async with async_playwright() as p:
            # Launch headless Chromium browser
            browser = await p.chromium.launch(headless=True)
            page = await browser.new_page()
            # Navigate to the URL with a generous timeout
            await page.goto(url, timeout=90000, wait_until="domcontentloaded")
            # Wait for a key element (e.g., body) to ensure basic loading
            await page.wait_for_selector("body", timeout=30000)
            # Add a small delay for any dynamic content rendering via JavaScript
            await asyncio.sleep(5)

            html_content = await page.content()
            with open(HTML_FILE, "w", encoding="utf-8") as f:
                f.write(html_content)

            await browser.close()
            print(f"Successfully fetched and saved HTML to {HTML_FILE}")
            return f"HTML content for {url} downloaded and saved successfully to {HTML_FILE}."
    except Exception as e:
        error_message = f"Error fetching page {url}: {str(e)}"
        print(error_message)
        return error_message

def _extract_xpath(tree, xpath, default="N/A"):
    """Helper function to extract text using XPath, returning default if not found."""
    try:
        # Use text_content() to get text from node and children, strip whitespace
        result = tree.xpath(xpath)
        if result:
            return result[0].text_content().strip()
        return default
    except Exception:
        return default

def _extract_price(price_str):
    """Helper function to parse price string into a float."""
    if price_str == "N/A":
        return None
    try:
        # Remove currency symbols and commas, handle potential whitespace
        cleaned_price = "".join(filter(str.isdigit or str.__eq__("."), price_str))
        return float(cleaned_price)
    except (ValueError, TypeError):
        return None

@mcp.tool()
def extract_info() -> dict:
    """
    Parses the saved HTML file (downloaded by fetch_page) to extract
    Amazon product details like title, price, rating, features, etc.
    Returns a dictionary of the extracted data.
    """
    print(f"Executing extract_info from file: {HTML_FILE}")
    if not os.path.exists(HTML_FILE):
        return {
            "error": f"HTML file not found at {HTML_FILE}. Please run fetch_page first."
        }

    try:
        with open(HTML_FILE, "r", encoding="utf-8") as f:
            page_html = f.read()

        tree = lxml_html.fromstring(page_html)

        # --- XPath Selectors for Amazon Product Details ---
        title = _extract_xpath(tree, '//span[@id="productTitle"]')
        # Handle different price structures (main price, sale price)
        price_whole = _extract_xpath(tree, '//span[contains(@class, "a-price-whole")]')
        price_fraction = _extract_xpath(
            tree, '//span[contains(@class, "a-price-fraction")]'
        )
        price_str = (
            f"{price_whole}.{price_fraction}"
            if price_whole != "N/A"
            else _extract_xpath(tree, '//span[contains(@class,"a-offscreen")]')
        )  # Fallback to offscreen if needed

        price = _extract_price(price_str)

        # Original price (strike-through)
        original_price_str = _extract_xpath(
            tree, '//span[@class="a-price a-text-price"]//span[@class="a-offscreen"]'
        )
        original_price = _extract_price(original_price_str)

        # Rating
        rating_text = _extract_xpath(tree, '//span[@id="acrPopover"]/@title')
        rating = None
        if rating_text != "N/A":
            try:
                rating = float(rating_text.split()[0])
            except (ValueError, IndexError):
                rating = None

        # Review Count
        reviews_text = _extract_xpath(tree, '//span[@id="acrCustomerReviewText"]')
        review_count = None
        if reviews_text != "N/A":
            try:
                review_count = int(reviews_text.split()[0].replace(",", ""))
            except (ValueError, IndexError):
                review_count = None

        # Availability
        availability = _extract_xpath(
            tree,
            '//div[@id="availability"]//span/text()',
        )

        # Features (bullet points)
        feature_elements = tree.xpath(
            '//div[@id="feature-bullets"]//li//span[@class="a-list-item"]'
        )
        features = [
            elem.text_content().strip()
            for elem in feature_elements
            if elem.text_content().strip()
        ]

        # Calculate Discount
        discount = None
        if price and original_price and original_price > price:
            discount = round(((original_price - price) / original_price) * 100)

        extracted_data = {
            "title": title,
            "price": price,
            "original_price": original_price,
            "discount_percent": discount,
            "rating_stars": rating,
            "review_count": review_count,
            "features": features,
            "availability": availability.strip(),
        }
        print(f"Successfully extracted data: {extracted_data}")
        return extracted_data

    except Exception as e:
        error_message = f"Error parsing HTML: {str(e)}"
        print(error_message)  # Added for logging
        return {"error": error_message}

if __name__ == "__main__":
    print("Starting MCP Server with stdio transport...")
    # Run the server, listening via standard input/output
    mcp.run(transport="stdio")

Интеграция вашего пользовательского сервера MCP

Теперь, когда сценарий сервера готов, давайте подключим его к MCP-клиентам, таким как Claude Desktop и Cursor.

Подключение к рабочему столу Claude

Шаг 1: Откройте рабочий стол Claude Desktop.

Шаг 2: Перейдите в Настройки -> Разработчик -> Редактировать конфигурацию. Это откроет файл claude_desktop_config.json в вашем стандартном текстовом редакторе.

claude-desktop-settings-menu-navigation

Шаг 3: Добавьте запись для вашего сервера в ключе mcpServers. Убедитесь, что путь в args заменен на абсолютный путь к вашему файлу amazon_scraper_mcp.py.

{
  "mcpServers": {
    "amazon_product_scraper": {
      "command": "python",  // Or python3 if needed
      "args": ["/full/path/to/your/amazon_scraper_mcp.py"], // <-- IMPORTANT: Use the correct absolute path
    }
  }
}

Шаг 4: Сохраните файл claude_desktop_config.json, полностью закройте и снова откройте Claude Desktop, чтобы изменения вступили в силу.

Шаг 5: На рабочем столе Claude Desktop в области ввода чата должен появиться маленький значок инструментов (похожий на молоток 🔨).

claude-desktop-mcp-tools-icon-interface

Шаг 6: Нажав на нее, вы увидите список “Amazon Product Scraper” с его инструментами fetch_page и extract_info.

claude-available-mcp-tools-dialog-amazon-scraper

Шаг 7: Отправьте запрос, например: “Получите текущую цену, оригинальную цену и рейтинг для этого товара Amazon: https://www.amazon.com/dp/B09C13PZX7″.

Шаг 8: Claude обнаружит, что для этого требуются внешние инструменты, и запросит разрешение на запуск сначала fetch_page, а затем extract_info. Нажмите “Разрешить для этого чата” для каждого инструмента.

mcp-permission-dialog-fetch-page-amazon-tool

Шаг 9: После предоставления разрешений сервер MCP выполнит инструменты. Затем Клод получит структурированные данные и представит их в чате.

claude-amazon-product-data-extraction-results

🔥 Отлично, вы успешно создали и интегрировали свой первый MCP-сервер!

Подключение к курсору

Процесс создания Cursor (IDE, ориентированной на искусственный интеллект) аналогичен.

Шаг 1: Откройте курсор.

Шаг 2: Перейдите на страницу Настройки ⚙️ и перейдите в раздел MCP.

cursor-ide-add-new-global-mcp-server-settings

Шаг 3: Нажмите “+Добавить новый глобальный MCP-сервер”. Откроется файл конфигурации mcp.json. Добавьте запись для вашего сервера, снова используя абсолютный путь к вашему скрипту.

cursor-mcp-json-configuration-file-amazon-scraper

Шаг 4: Сохраните файл mcp.json, и вы должны увидеть в списке ваш “amazon_product_scraper”, надеюсь, с зеленой точкой, указывающей на то, что он запущен и подключен.

cursor-ide-configured-amazon-scraper-mcp-settings

Шаг 5: Воспользуйтесь функцией чата в Cursor(Cmd+l или Ctrl+l).

Шаг 6: Отправьте запрос, например: “Извлеките все доступные данные о товарах из этого URL Amazon: https://www.amazon.com/dp/B09C13PZX7. Оформите результат в виде структурированного объекта JSON”.

Шаг 7: Как и в случае с Claude Desktop, курсор запросит разрешение на запуск инструментов fetch_page и extract_info. Одобрите эти запросы (“Run Tool”).

Шаг 8: Курсор будет отображать поток взаимодействия, показывая вызовы ваших инструментов MCP и, наконец, представляя структурированные данные JSON, возвращаемые вашим инструментом extract_info.

cursor-ide-amazon-product-data-extraction-json-results

Вот пример вывода JSON из Cursor:

{
  "title": "Razer Basilisk V3 Customizable Ergonomic Gaming Mouse: Fastest Gaming Mouse Switch - Chroma RGB Lighting - 26K DPI Optical Sensor - 11 Programmable Buttons - HyperScroll Tilt Wheel - Classic Black",
  "price": 39.99,
  "original_price": 69.99,
  "discount_percent": 43,
  "rating_stars": 4.6,
  "review_count": 7782,
  "features": [
    "ICONIC ERGONOMIC DESIGN WITH THUMB REST — PC gaming mouse favored by millions worldwide with a form factor that perfectly supports the hand while its buttons are optimally positioned for quick and easy access",
    "11 PROGRAMMABLE BUTTONS — Assign macros and secondary functions across 11 programmable buttons to execute essential actions like push-to-talk, ping, and more",
    "HYPERSCROLL TILT WHEEL — Speed through content with a scroll wheel that free-spins until its stopped or switch to tactile mode for more precision and satisfying feedback that's ideal for cycling through weapons or skills",
    "11 RAZER CHROMA RGB LIGHTING ZONES — Customize each zone from over 16.8 million colors and countless lighting effects, all while it reacts dynamically with over 150 Chroma integrated games",
    "OPTICAL MOUSE SWITCHES GEN 2 — With zero unintended misclicks these switches provide crisp, responsive execution at a blistering 0.2ms actuation speed for up to 70 million clicks",
    "FOCUS+ 26K DPI OPTICAL SENSOR — Best-in-class mouse sensor with intelligent functions flawlessly tracks movement with zero smoothing, allowing for crisp response and pixel-precise accuracy",
    // ... (other features)
  ],
  "availability": "In Stock"
}

Это демонстрирует гибкость MCP – один и тот же сервер легко работает с различными клиентскими приложениями.

Интеграция MCP от Bright Data для извлечения веб-данных на основе искусственного интеллекта

Собственные MCP-серверы обеспечивают полный контроль, но сопряжены с такими проблемами, как управление прокси-инфраструктурой, работа со сложными механизмами защиты от ботов и обеспечение масштабируемости. Bright Data решает эти проблемы с помощью своего готового MCP-решения производственного класса, предназначенного для бесшовной интеграции с агентами искусственного интеллекта и LLM.

Интеграция Model Context Protocol (MCP) с Bright Data обеспечивает LLM и агентам ИИ беспрепятственный доступ в режиме реального времени к публичным веб-данным, специально разработанным для рабочих процессов ИИ. Подключившись к MCP Bright Data, ваши приложения и модели смогут получать результаты SERP из всех основных поисковых систем и без проблем открывать доступ к труднодоступным веб-сайтам.

Решение Model Context Protocol (MCP) от Bright Data соединяет ваше приложение с набором мощных инструментов для извлечения веб-данных, включая Web Unlocker, SERP API, Web Scraper API и Scraping Browser, обеспечиваякомплексную инфраструктуру, которая:

  • Предоставляет данные, готовые для искусственного интеллекта: Автоматическое извлечение и форматирование веб-контента, сокращение дополнительных этапов предварительной обработки.
  • Обеспечивает масштабируемость и надежность: Использование надежной инфраструктуры для обработки большого количества запросов без ущерба для производительности.
  • Обходит блокировки и CAPTCHA: Использует передовые стратегии защиты от ботов для навигации и получения содержимого даже самых защищенных веб-сайтов.
  • Предлагает глобальное IP-покрытие: Использует обширную сеть прокси-серверов, охватывающую 195 стран, для доступа к контенту с географическими ограничениями.
  • Упрощенная интеграция: Минимизация усилий по настройке благодаря бесшовной работе с любыми клиентами MCP.

Необходимые условия для Bright Data MCP

Прежде чем приступить к интеграции Bright Data MCP, убедитесь, что у вас есть следующее:

  1. Учетная запись Bright Data: Зарегистрируйтесь на сайте brightdata.com. Новые пользователи получают бесплатные кредиты для тестирования.
  2. API-токен: Получите токен API из настроек учетной записи Bright Data(страница настроек пользователя).
  3. Зона Web Unlocker: Создайте прокси-зону Web Unlocker в панели управления Bright Data. Назовите ее каким-нибудь запоминающимся именем, например mcp_unlocker (при необходимости вы можете изменить его позже с помощью переменных окружения).
  4. (Необязательно) Зона Scraping Browser: если вам нужны расширенные возможности автоматизации браузера (например, для сложных взаимодействий с JavaScript или создания скриншотов), создайте зону Scraping Browser. Обратите внимание на данные аутентификации (имя пользователя и пароль), указанные для этой зоны (на вкладке ” Обзор” ), обычно в формате brd-customer-ACCOUNT_ID-zone-ZONE_NAME:PASSWORD.

Быстрый старт: Настройка Bright Data MCP для Claude Desktop

Шаг 1: Сервер Bright Data MCP обычно запускается с помощью npx, который поставляется с Node.js. Установите Node.js, если вы еще этого не сделали, с официального сайта.

Шаг 2: Откройте Claude Desktop -> Настройки -> Разработчик -> Редактировать конфигурацию(claude_desktop_config.json).

Шаг 3: Добавьте конфигурацию сервера Bright Data в раздел mcpServers. Замените пропуски на реальные учетные данные.

{
  "mcpServers": {
    "Bright Data": { // Choose a name for the server
      "command": "npx",
      "args": ["@brightdata/mcp"],
      "env": {
        "API_TOKEN": "YOUR_BRIGHTDATA_API_TOKEN", // Paste your API token here
        "WEB_UNLOCKER_ZONE": "mcp_unlocker",     // Your Web Unlocker zone name
        // Optional: Add if using Scraping Browser tools
        "BROWSER_AUTH": "brd-customer-ACCOUNTID-zone-YOURZONE:PASSWORD"
      }
    }
  }
}

Шаг 4: Сохраните файл конфигурации и перезапустите Claude Desktop.

Шаг 5: Наведите курсор на значок молотка (🔨) на рабочем столе Claude. Теперь вы должны увидеть несколько инструментов MCP.

claude-desktop-interface-with-mcp-tools-available

Попробуем извлечь данные с сайта Zillow, который известен тем, что потенциально может блокировать скреперы. Отправьте запрос claude с текстом “Extract key property data in JSON format from this Zillow URL: https://www.zillow.com/apartments/arverne-ny/the-tides-at-arverne-by-the-sea/ChWHPZ/”.

bright-data-mcp-zillow-property-extraction-process

Позвольте Клоду использовать необходимые инструменты Bright Data MCP. MCP-сервер Bright Data справится с основными сложностями (ротация прокси, рендеринг JavaScript через Scraping Browser, если необходимо).

Сервер Bright Data выполняет извлечение и возвращает структурированные данные, которые представляет Клод.

zillow-property-data-json-structure-bright-data-mcp

Вот фрагмент потенциального результата:

{
  "propertyInfo": {
    "name": "The Tides At Arverne By The Sea",
    "address": "190 Beach 69th St, Arverne, NY 11692",
    "propertyType": "Apartment building",
    // ... more info
  },
  "rentPrices": {
    "studio": { "startingPrice": "$2,750", /* ... */ },
    "oneBed": { "startingPrice": "$2,900", /* ... */ },
    "twoBed": { "startingPrice": "$3,350", /* ... */ }
  },
  // ... amenities, policies, etc.
}

🔥 Это потрясающе!

Еще один пример: Заголовки новостей хакеров

Более простой запрос:“Дайте мне названия 5 последних новостных статей из Hacker News“.

hacker-news-latest-articles-mcp-extraction-results

Здесь показано, как MCP-сервер Bright Data упрощает доступ даже к динамическому или сильно защищенному веб-контенту непосредственно в рамках рабочего процесса AI.

Заключение

Как мы уже рассказывали в этом руководстве, контекстно-модельный протокол Anthropic представляет собой фундаментальный сдвиг в том, как системы искусственного интеллекта взаимодействуют с внешним миром. Как мы уже видели, вы можете создавать собственные MCP-серверы для выполнения конкретных задач, как, например, наш скребок Amazon. Интеграция с MCP от Bright Data еще больше улучшает эту задачу, предлагая возможности веб-скреппинга корпоративного уровня, которые обходят защиту от ботов и предоставляют структурированные данные, готовые для ИИ.

Мы также отобрали несколько лучших ресурсов по ИИ и большим языковым моделям (LLM). Обязательно ознакомьтесь с ними, чтобы получить более подробную информацию:

Кредитная карта не требуется

Вас также может заинтересовать

web scraping with claude blog image
Веб-данные

Веб-скрапинг с помощью Клода в 2025 году

Узнайте, как использовать Claude AI для автоматизации веб-скреппинга и извлечения структурированных данных без особых усилий с помощью Python.
18 мин. чтения
Building AI-Ready Vector Datasets for LLMs blog image
AI

Создание готовых для ИИ векторных данных для магистрантов: Руководство по использованию Bright Data, Google Gemini и Pinecone

Большие языковые модели (LLM) меняют способы доступа к информации и создания интеллектуальных приложений. Чтобы полностью использовать их потенциал, особенно при работе со специфическими знаниями или собственными данными, очень важно создавать высококачественные структурированные векторные наборы данных. Производительность и точность LLM напрямую зависят от качества исходных данных. Плохо подготовленные наборы данных могут привести к некачественным результатам, в […]
7 мин. чтения
AI

Что такое контролируемая тонкая настройка в LLM?

Освойте тонкую настройку супервизора для LLM с помощью этого руководства по Python, охватывающего концепции, инструменты, рабочий процесс и практические примеры для повышения эффективности ваших проектов по ИИ.
7 мин. чтения