Скрейпинг
Yozh Scraper рендерит любой URL в настоящем браузере Playwright и возвращает ровно то, что вы просите — извлечённые поля, сырой HTML или скриншот всей страницы. Каждый скрейп — это асинхронная задача: отправьте URL, опросите задачу, заберите результат. Прокси, stealth, пресеты и авторизованные сессии — всё это полноценные возможности.
- Рендер в настоящем браузере — Playwright рендерит страницы, построенные на JS; выключите
renderдля статического HTML. - Структурированное извлечение — правила полей на CSS или XPath возвращают чистый объект
data, куда дешевле, чем самому качать и парсить сырой HTML. - Встроенные прокси — CyberYozh residential / mobile LTE / datacenter, с GEO-таргетингом и без поиска pool-id.
- Stealth по умолчанию — патчи playwright-stealth (
navigator.webdriver, отпечаток WebGL / Canvas, chrome runtime) снижают детект ботов. - Пресеты — скрейпьте Amazon / Google / eBay / Walmart / YouTube / LinkedIn по имени, с опциональным LLM-самовосстановлением.
- Сессии — управляемые сервером авторизованные сессии для целей под логином, переиспользуемые между скрейпами.
:8001) обходит сайт с одного стартового URL и загружает каждую страницу через этот скрейпер — те же возможности рендера, прокси и сессий действуют для обойдённых страниц.Быстрый старт
Скрейпер поднимается из корневого docker-compose.yml (вместе с краулером):
cp .env.example .env # set CYBERYOZH_API_KEY if using proxies docker compose up --build # scraper → http://localhost:8000 # crawler → http://localhost:8001
Проверьте, что он поднялся:
curl http://localhost:8000/api/v1/health
# {"status":"ok","workers":2}
CYBERYOZH_API_KEY в .env (получить можно на app.cyberyozh.com/api-access). Без него работает только proxy_type: none.Базовое использование
Каждый скрейп-эндпоинт создаёт фоновую задачу и возвращает job_id. Опросите задачу, затем заберите её результаты.
curl -X POST http://localhost:8000/api/v1/scrape/page
-H "Content-Type: application/json"
-d '{ "url": "https://example.com", "proxy_type": "none" }'
# → { "job_id": "req_abc123" }
curl http://localhost:8000/api/v1/scrape/req_abc123 # status
curl http://localhost:8000/api/v1/scrape/req_abc123/results # results
Готовый результат несёт метаданные плюс то, что вы запросили (data, raw_html, screenshot_base64):
{
"job_id": "req_abc123",
"status": "done",
"total": 1, "done": 1,
"results": [
{
"request_id": "req_abc123",
"took_ms": 1234,
"meta": { "url": "https://example.com", "final_url": "https://example.com/",
"status_code": 200, "device": "desktop", "proxy_type": "none", "retries": 0 },
"data": null, "raw_html": null, "screenshot_base64": null, "warnings": []
}
]
}
status проходит queued → running → done (или failed / cancelled). Результаты доступны для задач done, failed и cancelled.Извлечение данных
Передайте правило extract — и ответ будет содержать объект data с ключами по именам ваших полей, куда дешевле, чем качать raw_html и парсить его самому. Правила бывают css или xpath.
curl -X POST http://localhost:8000/api/v1/scrape/page
-H "Content-Type: application/json"
-d '{
"url": "https://example.com",
"extract": {
"type": "css",
"fields": {
"title": { "selector": "h1", "attr": "text", "required": true }
}
}
}'
# result → { "data": { "title": "Example Domain" } }
Каждое поле — это правило:
| Ключ поля | Тип | По умолчанию | Описание |
|---|---|---|---|
selector | string | обязательно | CSS-селектор или XPath-выражение для поля. |
attr | string | text | Что читать — text или имя атрибута (например, href, src). |
all | bool | false | Возвращать все совпадения списком вместо первого. |
required | bool | false | Помечает отсутствие — запускает LLM-самовосстановление пресета. |
Используйте "type": "xpath" с XPath-селекторами (например, //h1) для той же структуры.
Скриншоты & сырой HTML
Задайте screenshot: true для PNG всей страницы (base64 в screenshot_base64) или raw_html: true, чтобы получить полный HTML после рендера в raw_html.
curl -X POST http://localhost:8000/api/v1/scrape/page
-H "Content-Type: application/json"
-d '{ "url": "https://example.com", "screenshot": true, "raw_html": true }'
block_assets, отключите его для скриншотов, чтобы картинки отрендерились.Прокси
Для надёжного скрейпинга прокси необходимы — большинство современных сайтов блокируют прямые запросы. Yozh интегрирован с CyberYozh Proxy Service; задайте proxy_type в любом запросе.
| proxy_type | Что это |
|---|---|
res_rotating | Резидентские ротационные — рекомендуемый вариант по умолчанию. |
res_static | Резидентские статические (выделенный IP). |
mobile | Мобильные / LTE, выделенные. |
mobile_shared | Мобильные / LTE, общий пул. |
dc_static | Датацентр, статические. |
none | Прямое соединение, без прокси. |
Нацельтесь на локацию через proxy_geo (country_code / region / city). Узнайте, что вы купили, без поиска pool id:
curl "http://localhost:8000/api/v1/proxies/available?proxy_type=res_rotating" curl "http://localhost:8000/api/v1/proxies/countries"
CYBERYOZH_API_KEY в .env скрейпера. Получите ключ на app.cyberyozh.com/api-access, затем перезапустите контейнер.Пресеты
Пресет объединяет профиль запроса + шаблон URL + рецепт парсинга, так что вы скрейпите сайт по имени, а не собираете запрос вручную. Встроенные идут для Amazon, Google, eBay, Walmart, YouTube и LinkedIn; можно создать и свой (детерминированный CSS/XPath или сгенерированный ИИ).
curl -X POST http://localhost:8000/api/v1/scrape/preset/page
-H "Content-Type: application/json"
-d '{
"source": "amazon_product",
"preset_params": { "asin": "B08N5WRWNW" },
"locale": "us",
"llm": { "model": "openai/gpt-5.4-mini" }
}'
# → { "job_id": "..." } then GET /api/v1/scrape/<job_id>/results
llm опционален. Без него работает только детерминированный парсер; с ним селекторы самовосстанавливаются, когда required-поле возвращается пустым. Ключи провайдеров (OPENAI_API_KEY / ANTHROPIC_API_KEY / GEMINI_API_KEY / OPENROUTER_API_KEY) хранятся на сервере в .env.Управляйте пресетами через GET /api/v1/presets, GET /api/v1/presets/{name} и POST /api/v1/presets (имена пользовательских пресетов должны начинаться с user_).
Сессии
Управляемые сервером авторизованные сессии: создайте одну, войдите один раз, затем передавайте её session_id в любой скрейп — страницы будут загружаться с сохранёнными cookies + storage state. Обязательно для целей под логином, таких как пресет linkedin_profile.
POST /api/v1/sessions— создать. Фиксируетdevice/proxy_type/proxy_geoи TTL. Возвращает{ session_id, expires_at }.POST /api/v1/sessions/{id}/login— проиграть декларативный сценарий входа сcredsв теле:{ script, creds }.POST /api/v1/scrape/pageс заданнымsession_id— скрейпинг под авторизацией.DELETE /api/v1/sessions/{id}— очистка.
# 1. create → {"session_id":"sess_...","expires_at":...}
curl -X POST http://localhost:8000/api/v1/sessions
-H "Content-Type: application/json"
-d '{ "device": "desktop", "proxy_type": "res_rotating" }'
# 2. log in (declarative DSL + creds)
curl -X POST http://localhost:8000/api/v1/sessions/sess_.../login
-H "Content-Type: application/json"
-d '{ "script": { "steps": [ {"op":"goto","url":"https://site/login"} ] },
"creds": { "username": "...", "password": "..." } }'
# 3. scrape with the session
curl -X POST http://localhost:8000/api/v1/scrape/page
-H "Content-Type: application/json"
-d '{ "url": "https://site/secure", "session_id": "sess_...", "raw_html": true }'
session_id и cookies вместе → 422. Значения device / proxy_type / proxy_pool_id / proxy_geo у скрейпа должны совпадать с зафиксированными в сессии. Для CAPTCHA / 2FA, которые DSL входа не решает, пропустите сценарий и вместо него внедрите cookies в сессию.Пакетный скрейпинг
Отправьте много страниц одной задачей через POST /api/v1/scrape/pages — каждый элемент это полноценный скрейп-запрос. Опрашивайте статус и забирайте результаты через те же эндпоинты задач.
curl -X POST http://localhost:8000/api/v1/scrape/pages
-H "Content-Type: application/json"
-d '{
"pages": [
{ "url": "https://example.com", "proxy_type": "none" },
{ "url": "https://example.org", "proxy_type": "none" }
]
}'
session_id верхнего уровня применяется к каждой странице в пакете (отклоняется с 422, если страница уже фиксирует другой).MCP
Скрейпер монтирует эндпоинт Model Context Protocol по адресу /mcp (Streamable HTTP). Укажите на него Claude или Cursor — и инструменты появятся автоматически:
run_scrape_pagerun_scrape_pagesget_job_statusget_job_resultcancel_scrape_jobhealth
"yozh-scraper": {
"type": "http",
"url": "http://localhost:8000/mcp"
}
Дальше просто попросите: «Скрейпни https://example.com и расскажи, что на странице.» Тот же эндпоинт работает из агента LangChain или ноды MCP Client Tool в n8n.
Справочник по конфигурации
Запрос — ScrapeRequest (выборочно)
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
url | string (URL) | обязательно | Страница для рендера и скрейпинга. |
render | bool | true | Рендерить в браузере (нужно для страниц, построенных на JS). |
wait_until | domcontentloaded · networkidle | domcontentloaded | Когда страница считается готовой. |
wait_for_selector | string · null | null | Ждать конкретный элемент перед захватом. |
device | desktop · mobile | desktop | Профиль viewport / UA. |
proxy_type | см. Прокси | none | Пул прокси, через который идёт загрузка. |
proxy_geo | ProxyGeo · null | null | Таргетинг по стране / региону / городу. |
session_id | string · null | null | Использовать авторизованную сессию — см. Сессии. |
stealth | bool | true | Применять анти-детект защиту. |
block_assets | bool · null | env | Блокировать изображения/шрифты/медиа для скорости (по умолчанию берётся из BLOCK_ASSETS). |
extract | ExtractRule · null | null | Правила полей CSS/XPath → структурированные data. |
raw_html | bool | false | Включить полный HTML после рендера. |
screenshot | bool | false | Сделать PNG всей страницы (base64). |
Справочник API
| Метод | Путь | Назначение |
|---|---|---|
| POST | /api/v1/scrape/page | Скрейпить одну страницу. Возвращает {"job_id":"…"}. |
| POST | /api/v1/scrape/pages | Пакетный скрейпинг нескольких страниц одной задачей. |
| POST | /api/v1/scrape/preset/page | Скрейпинг по имени пресета (Amazon, Google, …). |
| GET | /api/v1/scrape/{id} | Статус задачи (queued/running/done/…). |
| GET | /api/v1/scrape/{id}/results | Результаты задачи (страницы + ScrapeResponse). |
| DELETE | /api/v1/scrape/{id} | Мягкая отмена — текущие страницы дорабатывают. |
| POST | /api/v1/sessions | Создать авторизованную сессию. |
| POST | /api/v1/sessions/{id}/login | Запустить декларативный сценарий входа. |
| DELETE | /api/v1/sessions/{id} | Удалить сессию. |
| GET | /api/v1/proxies/available | Список купленных прокси заданного типа. |
| GET | /api/v1/presets | Список встроенных + пользовательских пресетов. |
| GET | /api/v1/health | Здоровье + число воркеров. |
Важные детали
CYBERYOZH_API_KEY в .env скрейпера. Без него работает только proxy_type: none (прямое соединение).session_id и cookies возвращает 422, а скрейп должен совпадать с зафиксированными в сессии device / proxy_type / proxy_geo.OPENAI / ANTHROPIC / GEMINI / OPENROUTER) из .env — клиент их никогда не отправляет.