84 звёзд на GitHub и продолжает расти. Yozh Crawler + Scraper — бесплатный, опенсорсный и создаётся публично — поставьте нам звезду, если он заслужил место в вашем стеке.
CyberYozh Data / Yozh Scraper
Софт · Yozh Scraper

Один URL на входе — чистые структурированные данные на выходе

Yozh Scraper рендерит любой URL в настоящем браузере Playwright и возвращает ровно то, что вы просите — извлечённые поля, сырой HTML или скриншот всей страницы. Встроенные прокси CyberYozh, stealth по умолчанию, пресеты для крупных сайтов и авторизованные сессии. Никакого SaaS, работает на :8000.

$curl -X POST :8000/api/v1/scrape/page -d '{"url":"https://site.com", "proxy_type":"res_rotating","extract":{"type":"css","fields":{...}}}'

Скрейпинг

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-самовосстановлением.
  • Сессии — управляемые сервером авторизованные сессии для целей под логином, переиспользуемые между скрейпами.
Базовый URLhttp://localhost:8000
Документация OpenAPIhttp://localhost:8000/docs
Эндпоинт MCPhttp://localhost:8000/mcp
Работает в паре с Yozh Crawler. Краулер (:8001) обходит сайт с одного стартового URL и загружает каждую страницу через этот скрейпер — те же возможности рендера, прокси и сессий действуют для обойдённых страниц.

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

Скрейпер поднимается из корневого docker-compose.yml (вместе с краулером):

bash
cp .env.example .env          # set CYBERYOZH_API_KEY if using proxies
docker compose up --build
# scraper → http://localhost:8000
# crawler → http://localhost:8001

Проверьте, что он поднялся:

bash
curl http://localhost:8000/api/v1/health
# {"status":"ok","workers":2}
Прокси требуют API-ключ — задайте CYBERYOZH_API_KEY в .env (получить можно на app.cyberyozh.com/api-access). Без него работает только proxy_type: none.

Базовое использование

Каждый скрейп-эндпоинт создаёт фоновую задачу и возвращает job_id. Опросите задачу, затем заберите её результаты.

cURL
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):

JSON
{
  "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 проходит queuedrunningdone (или failed / cancelled). Результаты доступны для задач done, failed и cancelled.

Извлечение данных

Передайте правило extract — и ответ будет содержать объект data с ключами по именам ваших полей, куда дешевле, чем качать raw_html и парсить его самому. Правила бывают css или xpath.

cURL
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" } }

Каждое поле — это правило:

Ключ поляТипПо умолчаниюОписание
selectorstringобязательноCSS-селектор или XPath-выражение для поля.
attrstringtextЧто читать — text или имя атрибута (например, href, src).
allboolfalseВозвращать все совпадения списком вместо первого.
requiredboolfalseПомечает отсутствие — запускает LLM-самовосстановление пресета.

Используйте "type": "xpath" с XPath-селекторами (например, //h1) для той же структуры.

Скриншоты & сырой HTML

Задайте screenshot: true для PNG всей страницы (base64 в screenshot_base64) или raw_html: true, чтобы получить полный HTML после рендера в raw_html.

cURL
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
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
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.

  1. POST /api/v1/sessions — создать. Фиксирует device / proxy_type / proxy_geo и TTL. Возвращает { session_id, expires_at }.
  2. POST /api/v1/sessions/{id}/login — проиграть декларативный сценарий входа с creds в теле: { script, creds }.
  3. POST /api/v1/scrape/page с заданным session_id — скрейпинг под авторизацией.
  4. DELETE /api/v1/sessions/{id} — очистка.
cURL
# 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
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_page
  • run_scrape_pages
  • get_job_status
  • get_job_result
  • cancel_scrape_job
  • health
~/.claude/settings.json
"yozh-scraper": {
  "type": "http",
  "url": "http://localhost:8000/mcp"
}

Дальше просто попросите: «Скрейпни https://example.com и расскажи, что на странице.» Тот же эндпоинт работает из агента LangChain или ноды MCP Client Tool в n8n.

Справочник по конфигурации

Запрос — ScrapeRequest (выборочно)

ПолеТипПо умолчаниюОписание
urlstring (URL)обязательноСтраница для рендера и скрейпинга.
renderbooltrueРендерить в браузере (нужно для страниц, построенных на JS).
wait_untildomcontentloaded · networkidledomcontentloadedКогда страница считается готовой.
wait_for_selectorstring · nullnullЖдать конкретный элемент перед захватом.
devicedesktop · mobiledesktopПрофиль viewport / UA.
proxy_typeсм. ПроксиnoneПул прокси, через который идёт загрузка.
proxy_geoProxyGeo · nullnullТаргетинг по стране / региону / городу.
session_idstring · nullnullИспользовать авторизованную сессию — см. Сессии.
stealthbooltrueПрименять анти-детект защиту.
block_assetsbool · nullenvБлокировать изображения/шрифты/медиа для скорости (по умолчанию берётся из BLOCK_ASSETS).
extractExtractRule · nullnullПравила полей CSS/XPath → структурированные data.
raw_htmlboolfalseВключить полный HTML после рендера.
screenshotboolfalseСделать 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Здоровье + число воркеров.

Важные детали

Прокси требуют API-ключ. Задайте CYBERYOZH_API_KEY в .env скрейпера. Без него работает только proxy_type: none (прямое соединение).
Асинхронные задачи в памяти. Каждый скрейп — фоновая задача; хранилище в памяти и сбрасывается при перезапуске контейнера. Забирайте результаты, пока они доступны, или сохраняйте их сами.
Сессии несовместимы с cookies. Передача одновременно session_id и cookies возвращает 422, а скрейп должен совпадать с зафиксированными в сессии device / proxy_type / proxy_geo.
LLM-самовосстановление на стороне сервера. Самовосстановление пресетов использует ключи провайдеров (OPENAI / ANTHROPIC / GEMINI / OPENROUTER) из .env — клиент их никогда не отправляет.

Нас любят data-команды и AI-разработчики

Что говорят те, кто строит на Yozh

5,0 / 5 · Отзывов: 5
GitHub
Заменили наш собственный кластер Playwright на Yozh за полдня. MCP-эндпоинт встал прямо в нашего Claude-агента — ноль связующего кода, краулер и скрейпер просто заработали.
Marcus Reinhardt Ведущий дата-инженер Northwind Analytics
X
Система пресетов — киллер-фича. Передаём имя источника и получаем чистый JSON; самовосстановление даже поймало два изменения вёрстки Amazon раньше нас.
Priya Nair Основатель ScrapeStack
Reddit
Наконец-то опенсорсный скрейпер, для которого прокси и сессии — первоклассные сущности. Гоняем его за логин-стенами партнёрских порталов — сессии живут, результаты стабильны в разных регионах.
Daniel Osei Backend-инженер Loopfeed
X
Подключил к Cursor через MCP, и теперь мой агент тянет живые веб-данные прямо посреди задачи. Стриминговый обход по SSE — именно то, чего не хватало агентным сценариям.
Elena Kovac ИИ-инженер Vektor Labs
GitHub
Ушли с платного API скрейпинга ради экономии и готовились к откату по качеству — получили обратное. Self-hosted, без оплаты за запрос, а схема вывода чище, чем та, за которую мы платили.
Sofia Almeida Инженерный менеджер Tabbly
Открытый код · Лицензия MIT · 84 ★

Отрендерьте URL. Получите чистые данные

Yozh Scraper — движок рендеринга всего стека: один docker compose up, и у вас есть прокси, stealth, пресеты, сессии и извлечение, готовые к MCP, на вашей собственной инфраструктуре. Бесплатно. Навсегда.

Yozh Scraper + Crawler распространяются под лицензией MIT. Используйте. Форкайте. Создавайте на их основе.