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. Примеры для остальных клиентов соответствуют их собственному документированному формату подключения удалённого сервера.
| Поле | Значение |
|---|---|
| URL | https://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_scrapeWebPage | HTML, текст, Markdown и/или JSON, а также код состояния, извлечённые адреса электронной почты и ссылки, данные, полученные с помощью CSS-селекторов, и структурированные ИИ-данные по схеме. Обычный запрос стоит 1 кредит, запрос с рендерингом JS — 10 |
Доступен один инструмент. Стоимость зависит от выбранных параметров; таблица приведена в разделе «Стоимость».
Получение веб-страницы
hasdata_web_scraping_web_scraping_scrapeWebPage
Получает содержимое по одному URL.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
url | string | да | Страница для получения |
outputFormat | array | Любой из форматов: markdown, text, html, json. Подробнее в разделе Форматы вывода | |
jsRendering | boolean | Выполнять страницу в браузере. Включено по умолчанию; в основном именно этот параметр влияет на стоимость | |
proxyType | string | datacenter или residential | |
proxyCountry | string | US, UK, DE, IE, FR, IT, SE, BR, CA, JP, SG, IN или ID | |
headers | object | Пользовательские заголовки запроса | |
wait | number | Время ожидания после загрузки в миллисекундах | |
waitFor | string | CSS-селектор элемента, появления которого нужно дождаться перед чтением страницы | |
jsScenario | array | Действия, которые нужно выполнить на странице. См. ниже | |
extractRules | object | CSS-селекторы для извлечения именованных полей | |
aiExtractRules | object | Типизированная схема, которую языковая модель заполняет по содержимому страницы | |
extractLinks | boolean | Собрать ссылки со страницы | |
extractEmails | boolean | Собрать адреса электронной почты со страницы | |
screenshot | boolean | Сделать снимок загруженной страницы | |
blockResources | boolean | Не загружать изображения и таблицы стилей | |
blockAds | boolean | Не загружать рекламные ресурсы | |
blockUrls | array | Не загружать указанные URL | |
includeOnlyTags | array | Оставить только элементы, соответствующие этим селекторам | |
excludeTags | array | Удалить элементы, соответствующие этим селекторам | |
removeBase64Images | boolean | Удалить из результата встроенные изображения в формате 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 proxy | Residential proxy | |
|---|---|---|
jsRendering: false | 1 кредит | 5 кредитов |
jsRendering: true | 10 кредитов | 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
-
Web Scraping API — REST endpoint, на котором работает этот инструмент
Другие 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.