API ВЕГА

MCP-сервер Web Scraping

Размещённый сервер Model Context Protocol (MCP), который предоставляет Claude, Cursor, Windsurf и любому другому MCP-клиенту один инструмент только для чтения — для получения содержимого любой общедоступной веб-страницы. Сервер использует управляемые прокси, при необходимости выполняет JavaScript и возвращает результат в формате Markdown, обычного текста, исходного HTML или структурированного JSON. Ничего не нужно размещать самостоятельно, а браузер не требуется включать в свой стек.

Это запасной вариант для сайтов без отдельного API. Если сайт есть в каталоге HasData, соответствующий инструмент возвращает разобранные данные, а этот — содержимое страницы.

1 000 бесплатных кредитов в месяц, банковская карта не нужна. Обычный запрос стоит 1 кредит, поэтому на бесплатном тарифе можно выполнить 1 000 таких запросов.

https://mcp.hasdata.com/mcp?apis=web_scraping

Содержание

  • Что понадобится

  • Быстрый старт

  • Примеры запросов

  • Инструменты

  • Форматы вывода

  • Ошибки и сбои

  • Стоимость, бесплатный тариф и ограничения

  • Сравнение

  • Часто задаваемые вопросы

  • Ссылки HasData

  • Разработка

  • Участие в проекте

  • Лицензия

Что понадобится

MCP-клиент и API-ключ HasData, который можно бесплатно создать в панели управления без банковской карты. Это удалённый сервер, поэтому проще всего подключиться по URL и передать заголовок x-api-key — запускать контейнер не нужно. Клиентам, которые поддерживают только stdio, поможет небольшой лаунчер: пакет @hasdata/web-scraping-mcp опубликован в npm, а hasdata-web-scraping-mcp — в PyPI. Примеры приведены ниже.

Быстрый старт

URL сервера одинаков для всех клиентов. Мы проверили подключение в Claude Code и Claude Desktop. Примеры для остальных клиентов соответствуют их собственному документированному формату подключения удалённого сервера.

ПолеЗначение
URLhttps://mcp.hasdata.com/mcp?apis=web_scraping
ТранспортHTTP, потоковый
Заголовок авторизацииx-api-key: HASDATA_API_KEY

Клиенты с поддержкой OAuth можно подключить по тому же URL и выполнить вход без указания ключа в файле конфигурации.

Claude Code

claude mcp add --transport http web-scraping "https://mcp.hasdata.com/mcp?apis=web_scraping" \
  --header "x-api-key: HASDATA_API_KEY"

Claude Desktop

Откройте Settings, затем Connectors и Add custom connector. Вставьте https://mcp.hasdata.com/mcp?apis=web_scraping и выполните вход.

Если вы используете файл конфигурации, учтите, что Claude Desktop загружает только локальные серверы (stdio). Поэтому для подключения к удалённому серверу нужен лаунчер stdio. Эту роль выполняет пакет @hasdata/web-scraping-mcp: он получает ключ из переменной окружения. Добавьте следующий блок в claude_desktop_config.json:

{
  "mcpServers": {
    "web-scraping": {
      "command": "npx",
      "args": ["-y", "@hasdata/web-scraping-mcp"],
      "env": { "HASDATA_API_KEY": "YOUR_KEY" }
    }
  }
}

Если вместо Node вы используете Python, замените лаунчер на пакет из PyPI. Его можно запустить через uvx без ручной установки:

{
  "mcpServers": {
    "web-scraping": {
      "command": "uvx",
      "args": ["hasdata-web-scraping-mcp"],
      "env": { "HASDATA_API_KEY": "YOUR_KEY" }
    }
  }
}

Cursor

Используйте ~/.cursor/mcp.json, чтобы подключить сервер во всех проектах, или .cursor/mcp.json — только в одном:

{
  "mcpServers": {
    "web-scraping": {
      "url": "https://mcp.hasdata.com/mcp?apis=web_scraping",
      "headers": { "x-api-key": "HASDATA_API_KEY" }
    }
  }
}

Windsurf

Файл конфигурации находится по пути ~/.codeium/windsurf/mcp_config.json. В Windsurf поле называется serverUrl, а не url:

{
  "mcpServers": {
    "web-scraping": {
      "serverUrl": "https://mcp.hasdata.com/mcp?apis=web_scraping",
      "headers": { "x-api-key": "HASDATA_API_KEY" }
    }
  }
}

VS Code

Добавьте конфигурацию в .vscode/mcp.json в рабочей области:

{
  "servers": {
    "web-scraping": {
      "type": "http",
      "url": "https://mcp.hasdata.com/mcp?apis=web_scraping",
      "headers": { "x-api-key": "HASDATA_API_KEY" }
    }
  }
}

Примеры запросов

  • Получи эту страницу в формате Markdown и кратко изложи её содержание.

  • Прочитай эту страницу документации и извлеки из неё все блоки кода.

  • Получи заголовки и ссылки с главной страницы этого сайта в формате JSON.

  • Эта страница загружает содержимое с помощью JavaScript. Выполни страницу в браузере и дождись появления списка результатов, прежде чем читать её.

  • Получи эту страницу через немецкий резидентный прокси и проверь, отличаются ли цены.

  • Сделай снимок экрана этой страницы.

Для каждого запроса достаточно одного вызова. Меняется только объём работы браузера, который вы запрашиваете, — от этого зависит стоимость вызова.

Инструменты

ИнструментЧто возвращает
hasdata_web_scraping_web_scraping_scrapeWebPageHTML, текст, Markdown и/или JSON, а также код состояния, извлечённые адреса электронной почты и ссылки, данные, полученные с помощью CSS-селекторов, и структурированные ИИ-данные по схеме. Обычный запрос стоит 1 кредит, запрос с рендерингом JS — 10

Доступен один инструмент. Стоимость зависит от выбранных параметров; таблица приведена в разделе «Стоимость».

Получение веб-страницы

hasdata_web_scraping_web_scraping_scrapeWebPage

Получает содержимое по одному URL.

ПараметрТипОбязательныйОписание
urlstringдаСтраница для получения
outputFormatarrayЛюбой из форматов: markdown, text, html, json. Подробнее в разделе Форматы вывода
jsRenderingbooleanВыполнять страницу в браузере. Включено по умолчанию; в основном именно этот параметр влияет на стоимость
proxyTypestringdatacenter или residential
proxyCountrystringUS, UK, DE, IE, FR, IT, SE, BR, CA, JP, SG, IN или ID
headersobjectПользовательские заголовки запроса
waitnumberВремя ожидания после загрузки в миллисекундах
waitForstringCSS-селектор элемента, появления которого нужно дождаться перед чтением страницы
jsScenarioarrayДействия, которые нужно выполнить на странице. См. ниже
extractRulesobjectCSS-селекторы для извлечения именованных полей
aiExtractRulesobjectТипизированная схема, которую языковая модель заполняет по содержимому страницы
extractLinksbooleanСобрать ссылки со страницы
extractEmailsbooleanСобрать адреса электронной почты со страницы
screenshotbooleanСделать снимок загруженной страницы
blockResourcesbooleanНе загружать изображения и таблицы стилей
blockAdsbooleanНе загружать рекламные ресурсы
blockUrlsarrayНе загружать указанные URL
includeOnlyTagsarrayОставить только элементы, соответствующие этим селекторам
excludeTagsarrayУдалить элементы, соответствующие этим селекторам
removeBase64ImagesbooleanУдалить из результата встроенные изображения в формате base64

В extractRules имя поля сопоставляется с CSS-селектором. Чтобы получить атрибут, а не текст элемента, добавьте @attr.

{ "title": "h1", "link_href": "a#link @href", "page_text": "body" }

jsScenario — это массив действий, которые выполняются на странице по порядку. Доступны действия click, wait, waitFor, waitForAndClick, scrollX, scrollY, fill и evaluate, позволяющее запускать произвольный JavaScript. Для работы этого параметра необходимо включить jsRendering.

В aiExtractRules задаётся нужная структура данных, которую модель заполняет на основе HTML. Для каждого выходного поля указывается тип: string, number, boolean, list или item для вложенного объекта.

Форматы вывода

Перед первым вызовом стоит разобраться в этом разделе: структура ответа зависит от значения outputFormat.

Если запросить только один из форматов — markdown, text или html, — содержимое будет возвращено обычной строкой в поле text верхнего уровня.

{
  "url": "https://api.hasdata.com/scrape/web/",
  "status": 200,
  "json": null,
  "text": "# Example Domain\n\nThis domain is for use in documentation examples without needing permission. Avoid use in operations.\n\n[Learn more](https://iana.org/domains/example)\n"
}

Если включить json — отдельно или вместе с другим форматом, — все данные будут помещены в поле json. Поле text верхнего уровня станет равным null, а запрошенные форматы будут размещены в json рядом с метаданными страницы.

{
  "json": {
    "requestMetadata": { "id": "7764031a-43f7-4102-8561-a7b7a6f1cbf5", "status": "ok" },
    "statusCode": 200,
    "statusText": "OK",
    "headers": { "server": "nginx", "content-type": "text/html; charset=utf-8" },
    "extractedData": { "title": "Hacker News", "firstStory": ["iPhone Duo", "apple.com", "Show HN: What if the speed of light was 5 km/h?"] }
  },
  "text": null
}

В extractedData содержатся результаты, полученные с помощью extractRules. Если селектор соответствует нескольким элементам, результатом будет массив со всеми совпадениями. Например, .titleline a на странице со списком вернёт все совпадения, а не только первое.

Ошибки и нестандартные сценарии

Учитывайте возможные сбои — не рассчитывайте, что всё всегда пойдёт по плану.

extractLinks и extractEmails работают только тогда, когда outputFormat включает json. Они добавляют links и emails в объект json, поскольку в обычном ответе в формате Markdown для них нет места. Если запросить их с outputFormat: ["text"], вы получите текст, но ссылки и адреса электронной почты не вернутся — без каких-либо предупреждений.

Ответы 404 и 403 от целевой страницы считаются успешными вызовами. Статус самой страницы возвращается в json в поле statusCode или на верхнем уровне в поле status. Запрос в любом случае оплачивается. Перед разбором тела ответа проверьте статус.

По умолчанию jsRendering включён — именно он влияет на стоимость вызова. Если отключить его, стоимость запроса снизится с 10 кредитов до 1. Большинству статических страниц, документации, статей и страниц, содержимое которых сформировано на сервере, рендеринг не нужен. Включайте его, если без него содержимое приходит пустым.

waitFor предпочтительнее wait. Фиксированная задержка — это лишь догадка: при медленной загрузке её может не хватить, а при быстрой она окажется лишней. CSS-селектор позволяет дождаться именно нужного элемента и вернуть результат сразу после его появления.

Запрос через residential proxy стоит в пять–пятнадцать раз дороже, чем через datacenter proxy. Используйте его, если запрос через datacenter proxy заблокирован, а не по умолчанию.

includeOnlyTags и excludeTags принимают селекторы querySelectorAll. Если селектор некорректен, он не сузит выборку, но ошибка не возникнет. Поэтому подозрительно полный ответ может указывать на опечатку.

aiExtractRules запускает модель для обработки HTML, поэтому эта функция не бесплатна и не гарантирует одинаковый результат. Формулировки в ответах на два запроса одной и той же страницы могут различаться. Если задачу можно решить с помощью CSS-селектора, используйте extractRules: это дешевле и даёт повторяемый результат.

Результаты, содержащие данные, также включают requestMetadata.id. Укажите этот идентификатор при обращении в службу поддержки.

Стоимость, бесплатный тариф и лимиты

Стоимость зависит от двух параметров. Другие настройки на неё не влияют.

Datacenter proxyResidential proxy
jsRendering: false1 кредит5 кредитов
jsRendering: true10 кредитов15 кредитов

Рендеринг включён по умолчанию, поэтому вызов без дополнительных настроек стоит 10 кредитов. Запрос статической страницы с jsRendering: false стоит 1 кредит. Если браузер не нужен, это самый дешёвый инструмент в каталоге.

Бесплатный тариф включает 1 000 кредитов в месяц, банковская карта не нужна. Этого хватит на 1 000 обычных запросов или 100 запросов с рендерингом. Кредиты обновляются в начале каждого платёжного периода.

Платные тарифы начинаются от $59 в месяц за 200 000 кредитов — этого хватит на 200 000 обычных запросов или 20 000 запросов с рендерингом. При увеличении объёма стоимость единицы снижается: подробности — в разделе тарифов для больших объёмов.

Тариф также определяет количество параллельных запросов. Бесплатный тариф позволяет выполнять 1 запрос за раз, Startup — 5, Basic — 15, а тарифы Growth — от 50 до 500. В автоматических сценариях повторяйте запросы после ответа 429 с постепенно увеличивающейся задержкой: агент, обходящий список URL, достигнет лимита раньше, чем вы успеете это заметить.

Кредиты списываются только за успешные запросы. Страница с ответом 404 всё равно считается успешно полученной страницей с кодом 404.

Сравнение с альтернативами

Сравнивать этот инструмент имеет смысл с самостоятельным получением страниц и другими инструментами из каталога.

fetch в собственном кодеСпециализированный инструмент HasDataЭтот сервер
Блокировка средствами защиты от ботовЧастоОбрабатываетсяОбрабатывается
Страницы с большим количеством JavaScriptНужен запущенный вами браузерОбрабатываютсяНастраивается параметром
ГеотаргетингСобственные проксиВстроенНастраивается параметром
РезультатИсходный HTMLРазобранные поля для этого сайтаMarkdown, текст, HTML или JSON
ОхватЛюбые сайтыСайты, для которых есть инструментЛюбые общедоступные сайты
СтоимостьСобственная инфраструктураЗа вызовОт 1 кредита за вызов

Главное преимущество перед специализированным инструментом — охват. Amazon, Zillow, Yelp и другие сайты возвращают типизированные поля, поскольку для каждого из них поддерживается отдельный парсер. Этот сервер получает страницу с любого сайта, а разбор оставляет вам. Такой компромисс оправдан, только если для нужного сайта нет специализированного инструмента.

При сравнении с собственным fetch важно понять, насколько целевой сайт затрудняет получение данных. Если сайт не создаёт проблем, собственный код ничего не стоит, и тратить кредит на этот инструмент нецелесообразно.

Часто задаваемые вопросы

Что такое MCP-сервер для веб-скрейпинга?

MCP-сервер предоставляет инструменты, которые может вызывать AI-клиент. Этот сервер позволяет агенту получать страницы по любым общедоступным URL через управляемые прокси и возвращает их в формате Markdown, текста, HTML или структурированного JSON. Браузер и пул прокси в вашей инфраструктуре не нужны.

Нужны ли собственные прокси или headless-браузер?

Нет. И то и другое работает на стороне сервера. Понадобится только ключ HasData.

Как снизить стоимость запросов?

Установите jsRendering: false. Это уменьшит стоимость с 10 кредитов до 1. Если рендеринг всё же нужен, добавьте blockResources, чтобы браузер пропускал изображения и таблицы стилей.

Как понять, нужен ли странице рендеринг?

Сначала получите страницу без рендеринга — такой запрос стоит 1 кредит. Если нужное содержимое присутствует, этого достаточно. Если тело ответа представляет собой пустую оболочку, включите рендеринг.

Можно ли заполнить форму или перейти на следующую страницу?

Да. Для этого используйте jsScenario: он последовательно выполняет на отрендеренной странице шаги click, fill, waitFor, scrollY и evaluate.

Чем отличаются extractRules и aiExtractRules?

extractRules использует CSS-селекторы. Это недорогой, быстрый и повторяемый способ извлечения данных. В aiExtractRules вы описываете нужные поля, а модель анализирует страницу. Такой подход подходит для страниц со структурой, которую сложно точно описать, но стоит дороже, а результаты могут различаться между запусками.

Можно ли получить снимок экрана?

Да. Для этого укажите screenshot: true в запросе с рендерингом.

Можно ли использовать этот сервер вместе с другими API HasData?

Да. Один ключ подходит для всех API, а для доступа к ним используется одна конечная точка и параметр apis. Укажите для клиента ?apis=web_scraping,google_serp, чтобы подключить оба набора инструментов в одном соединении, или используйте mcp.hasdata.com/api/mcp, чтобы получить доступ ко всему каталогу.

Связана ли HasData с сайтами, страницы которых я получаю?

Нет. HasData — независимый сервис. Инструмент получает страницы с указанных вами сайтов, поэтому возвращаемые данные определяются содержимым, которое публикуют эти сайты. Вы несёте ответственность за соблюдение условий использования сайтов и применимого к вам законодательства.

Соблюдение требований и персональные данные

Инструмент позволяет обращаться к любым указанным вами страницам, поэтому ответственность за его использование здесь выше, чем при работе со специализированным инструментом. Прежде чем создавать решение, учтите два момента. extractEmails собирает адреса электронной почты. В понимании GDPR такой адрес считается персональными данными, а его использование в маркетинговых целях отдельно регулируется законом CAN-SPAM, правилами ePrivacy и аналогичными нормами. Кроме того, страница, доступ к которой ограничен авторизацией, платной подпиской или запретом в robots.txt, не становится общедоступной только потому, что прокси может её открыть. Получайте только действительно общедоступные данные, сохраняйте лишь необходимое для вашей цели и проверяйте, какие требования применимы к вам.

Ссылки HasData

Другие MCP-серверы HasData: Google Search, Google Images, Google Scholar, Google Maps, Google Trends, Bing, DuckDuckGo, YouTube, TikTok, Instagram, Amazon, Walmart, Shopify, Yelp, Yellow Pages, Zillow, Redfin, Airbnb, Booking.com, Indeed, Glassdoor.

Разработка

Лаунчер — это простой мост stdio к удалённому серверу, поэтому сборка не требуется.

npm install
HASDATA_API_KEY=your_key_here npm test

Тесты в test/ проверяют контракт инструмента — то, что может измениться без коммита в этот репозиторий. Они проверяют, что ?apis=web_scraping возвращает единственный ожидаемый инструмент, его имя не изменилось, для работы ему по-прежнему требуется url и у него есть описание. Также тесты проверяют, что параметры, описанные в этом README, присутствуют в схеме, а используемый ключ действительно принимается.

Два теста фиксируют поведение при выборе формата вывода: именно здесь читатель README с наибольшей вероятностью может столкнуться с неожиданностью, а рефакторинг — внести изменения. Первый запрашивает только markdown и проверяет, что содержимое возвращается строкой на верхнем уровне. Второй запрашивает json с extractRules и проверяет, что результат извлечения находится в extractedData внутри json. Оба теста выполняются без рендеринга, поэтому вместе обходятся в 2 кредита.

Набор тестов контракта также запускается еженедельно по расписанию: список инструментов на стороне сервера может измениться, даже если в этом репозитории никто ничего не меняет.

Участие в разработке

Если таблица инструментов, пример ответа или описание поведения не соответствуют действительности, сообщите об этом в issue. Для таких сообщений предусмотрен специальный шаблон. Pull request с исправлениями также приветствуются — как по этим вопросам, так и по любой части лаунчера.

Лицензия

MIT. См. LICENSE.