Scrape (извлечение данных)
Извлечение структурированного JSON из полностью отрендеренных веб-страниц через CSS-селекторы. Запросы выполняются с российских серверов (российские IP-адреса, российский DNS) — сайты отдают локализованный контент, корректные цены в рублях и российскую выдачу. 100% совместимость с Browserless.io Scrape API — drop-in замена для существующих интеграций.
Эндпоинты
Заголовок раздела «Эндпоинты»| Метод | Эндпоинт | Описание |
|---|---|---|
POST | /v1/browser/scrape | Browserless-совместимый API |
Базовое использование
Заголовок раздела «Базовое использование»API принимает URL и массив CSS-селекторов, загружает страницу через headless Chromium, выполняет querySelectorAll для каждого селектора и возвращает структурированный JSON с текстом, HTML, атрибутами и координатами каждого найденного элемента.
# Извлечение заголовков и параграфовcurl -X POST "https://proxy.unoapi.ru/v1/browser/scrape" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://example.com", "elements": [ {"selector": "h1"}, {"selector": "p"} ] }'
# С ожиданием загрузки контентаcurl -X POST "https://proxy.unoapi.ru/v1/browser/scrape" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://example.com", "elements": [{"selector": ".product-card"}], "gotoOptions": {"waitUntil": "networkidle"}, "viewport": {"width": 1920, "height": 1080} }'const response = await fetch('https://proxy.unoapi.ru/v1/browser/scrape', { method: 'POST', headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' }, body: JSON.stringify({ url: 'https://example.com', elements: [ { selector: 'h1' }, { selector: '.product-card' } ], gotoOptions: { waitUntil: 'networkidle' } })});
const { data } = await response.json();
// Каждый элемент массива — результат по одному селекторуfor (const element of data) { console.log(`Селектор: ${element.selector}`); for (const result of element.results) { console.log(` Текст: ${result.text}`); console.log(` HTML: ${result.html}`); console.log(` Размер: ${result.width}x${result.height}`); }}import requests
response = requests.post( 'https://proxy.unoapi.ru/v1/browser/scrape', headers={ 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' }, json={ 'url': 'https://example.com', 'elements': [ {'selector': 'h1'}, {'selector': '.product-card'} ], 'gotoOptions': {'waitUntil': 'networkidle'} })
data = response.json()['data']for element in data: print(f"Селектор: {element['selector']}") for result in element['results']: print(f" Текст: {result['text']}") print(f" Размер: {result['width']}x{result['height']}")body, _ := json.Marshal(map[string]interface{}{ "url": "https://example.com", "elements": []map[string]string{ {"selector": "h1"}, {"selector": ".product-card"}, }, "gotoOptions": map[string]interface{}{ "waitUntil": "networkidle", },})
req, _ := http.NewRequest("POST", "https://proxy.unoapi.ru/v1/browser/scrape", bytes.NewBuffer(body))req.Header.Set("Authorization", "Bearer YOUR_API_KEY")req.Header.Set("Content-Type", "application/json")
resp, _ := client.Do(req)var result struct { Data []struct { Selector string `json:"selector"` Results []struct { Text string `json:"text"` HTML string `json:"html"` Width float64 `json:"width"` Height float64 `json:"height"` } `json:"results"` } `json:"data"`}json.NewDecoder(resp.Body).Decode(&result)Формат ответа
Заголовок раздела «Формат ответа»API возвращает JSON с массивом data, где каждый элемент соответствует одному селектору из запроса:
{ "data": [ { "selector": "h1", "results": [ { "html": "Добро пожаловать", "text": "Добро пожаловать", "attributes": [ { "name": "class", "value": "title" } ], "width": 800, "height": 42, "top": 10, "left": 0 } ] }, { "selector": ".product-card", "results": [ { "html": "<img src=\"...\"><h3>Товар 1</h3><span>1 500 ₽</span>", "text": "Товар 1 1 500 ₽", "attributes": [ { "name": "class", "value": "product-card" } ], "width": 300, "height": 200, "top": 100, "left": 0 } ] } ]}Поля каждого результата:
| Поле | Тип | Описание |
|---|---|---|
html | string | Внутренний HTML элемента (innerHTML) |
text | string | Текстовое содержимое (textContent) |
attributes | array | Массив атрибутов: {name, value} |
width | number | Ширина элемента в пикселях |
height | number | Высота элемента в пикселях |
top | number | Координата Y элемента на странице |
left | number | Координата X элемента на странице |
Параметр elements
Заголовок раздела «Параметр elements»Массив elements — обязательный параметр. Каждый элемент содержит CSS-селектор:
{ "url": "https://example.com", "elements": [ { "selector": "h1" }, { "selector": ".price" }, { "selector": "table.specs td" }, { "selector": "a[href^='/product']" } ]}Поддерживаются любые валидные CSS-селекторы — API использует document.querySelectorAll под капотом. Чем более специфичный селектор, тем точнее результат.
Ключевые параметры
Заголовок раздела «Ключевые параметры»Основные параметры запроса:
url— URL страницы для извлечения данныхhtml— или HTML-контент для рендеринга (вместо URL)elements— массив объектов{selector: string}(обязательный, минимум 1)viewport.width/height— размер окна браузера (по умолчанию 1280×800)waitForSelector— ожидание CSS-селектора перед извлечениемgotoOptions.waitUntil—load,domcontentloaded,networkidlewaitForTimeout— дополнительная задержка в миллисекундахwaitForFunction— ожидание выполнения JavaScript-функции
Заголовки ответа
Заголовок раздела «Заголовки ответа»API возвращает информацию о целевой странице через заголовки:
X-Response-Code— HTTP-код ответа целевой страницыX-Response-Status— текстовый статус ответаX-Response-URL— финальный URL после редиректов
Рендеринг HTML
Заголовок раздела «Рендеринг HTML»Вместо URL можно передать HTML-контент напрямую для парсинга:
# Извлечение данных из HTML-контента (без URL)curl -X POST "https://proxy.unoapi.ru/v1/browser/scrape" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "html": "<div><h1>Тест</h1><p class=\"info\">Текст</p></div>", "elements": [{"selector": "h1"}, {"selector": ".info"}] }'Это полезно для парсинга HTML-фрагментов, полученных из других источников.
Ожидание контента
Заголовок раздела «Ожидание контента»Для динамических страниц (SPA, React, Vue) используйте waitForSelector или gotoOptions.waitUntil: "networkidle":
# Ожидание загрузки товаров перед извлечениемcurl -X POST "https://proxy.unoapi.ru/v1/browser/scrape" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://shop.example.com/catalog", "elements": [{"selector": ".product-card"}], "waitForSelector": {"selector": ".product-card", "timeout": 10000}, "gotoOptions": {"waitUntil": "networkidle"} }'Параметр bestAttempt: true позволяет продолжить даже если селектор не найден в заданное время.
Сценарии использования
Заголовок раздела «Сценарии использования»- Мониторинг цен — извлечение цен с карточек товаров по CSS-селекторам
- Агрегация контента — сбор заголовков, описаний и метаданных со страниц
- Мониторинг изменений — отслеживание конкретных элементов на страницах
- SEO-аудит — извлечение
<title>,<meta>, заголовков и ссылок - Парсинг таблиц — извлечение структурированных данных из HTML-таблиц
- Тестирование — проверка наличия и содержимого элементов на странице
Продвинутые возможности
Заголовок раздела «Продвинутые возможности»API поддерживает все параметры Browserless.io:
- Cookies и авторизация —
cookies,authenticate - Внедрение скриптов —
addScriptTag,addStyleTag - Блокировка ресурсов —
rejectResourceTypes,rejectRequestPattern - Эмуляция —
emulateMediaType(screen/print) - JavaScript —
setJavaScriptEnabled: false - HTTP-заголовки —
setExtraHTTPHeaders - User-Agent —
userAgent
SSRF-защита
Заголовок раздела «SSRF-защита»API блокирует небезопасные URL: localhost, приватные IP, .local домены.
Миграция с Browserless
Заголовок раздела «Миграция с Browserless»https://chrome.browserless.io/scrapehttps://proxy.unoapi.ru/v1/browser/scrapeФормат запроса и ответа полностью совместим.