Скрейпінг
Yozh Scraper відображає будь-яку URL-адресу в реальному браузері Playwright і повертає саме те, що ви просите — витягнуті поля, необроблений HTML або знімок екрана всієї сторінки. Кожен скрейп — це асинхронне завдання: вкажіть URL-адресу, перевірте стан завдання, отримайте результат. Проксі, прихований режим, пресети та сесії з автентифікацією — все це працює на найвищому рівні.
- Реальне відтворення у браузері — Playwright відтворює сторінки, створені за допомогою JavaScript; переключіть
renderдля статичного HTML. - Структуроване вилучення — правила для полів на основі CSS або XPath повертають очищений
dataоб’єкт, що набагато ефективніше, ніж самостійне завантаження та аналіз необробленого HTML-коду. - Вбудовані проксі-сервери — CyberYozh (побутові / мобільні LTE / центри обробки даних) з геотаргетингом та без виявлення ідентифікаторів пулів.
- Режим «Stealth» за замовчуванням — патчі playwright-stealth (
navigator.webdriver, відбитки WebGL / Canvas, середовище виконання Chrome) для зменшення ймовірності виявлення ботів. - Пресети — збір даних з 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_type для будь-якого запиту.
| proxy_type | Що це таке |
|---|---|
res_rotating | Почергове використання житлових приміщень — рекомендований варіант за замовчуванням. |
res_static | Статична IP-адреса для домашнього використання (виділена IP-адреса). |
mobile | Мобільний зв'язок / LTE, виділений канал. |
mobile_shared | Мобільний зв'язок / LTE, спільний пул. |
dc_static | Статична інформація про центр обробки даних. |
none | Пряме підключення, без проксі. |
Виберіть місце розташування за допомогою proxy_geo (country_code / region / city). Дізнайтеся, що ви придбали, не шукаючи ідентифікатори пулів:
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 для будь-якого скрейпу, щоб сторінки завантажувалися із збереженими файлами cookie та станом сховища. Необхідно для цілей, що вимагають входу, таких як linkedin_profile пресет.
POST /api/v1/sessions— create. Pinsdevice/proxy_type/proxy_geoта TTL. Повертає{ session_id, expires_at }.POST /api/v1/sessions/{id}/login— запустити декларативний скрипт входу зcredsу тілі:{ script, creds }.POST /api/v1/scrape/pageзsession_idset — скрейпінг з авторизацією.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-скрипт для входу не може вирішити, пропустіть скрипт і замість цього вставте файли cookie в сесію.Пакетне вилучення даних
Надішліть багато сторінок одним завданням за допомогою 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, так і з вузла n8n MCP Client Tool.
Довідник з налаштування
Запит — ScrapeRequest (вибрано)
| Поле | Тип | За замовчуванням | Опис |
|---|---|---|---|
url | рядок (URL) | обов’язкове | Сторінка, яку потрібно відобразити та зібрати дані. |
render | bool | true | Відобразити у браузері (необхідно для сторінок, створених за допомогою JS). |
wait_until | domcontentloaded · networkidle | domcontentloaded | Коли сторінка вважається готовою. |
wait_for_selector | рядок · null | null | Перед зйомкою дочекайтеся появи певного елемента. |
device | desktop · mobile | desktop | Вікно перегляду / профіль UA. |
proxy_type | див. «Проксі» | none | Пул проксі-серверів, через які здійснюється завантаження маршрутів. |
proxy_geo | ProxyGeo · null | null | Орієнтація на країну / регіон / місто. |
session_id | рядок · 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} | Статус завдання (у черзі/виконується/завершено/…). |
| 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 — які клієнт ніколи не надсилає.