84 зірок на GitHub, і їхня кількість продовжує зростати. Yozh Crawler + Scraper — це безкоштовний проект з відкритим кодом, який розробляється відкрито. Поставте нам зірку, якщо він заслуговує на місце у вашому стеку.
CyberYozh Data / Приклади використання / Електронна комерція та торгові майданчики
Приклад використання · Електронна комерція

Одна схема. Усі торгові майданчики

Надішліть URL-адресу будь-якого товару — з Amazon, eBay, Walmart, AliExpress або ще понад 20 сайтів — і отримайте у відповідь такий самий чіткий структурований JSON-файл. Не потрібно підтримувати селектори, боротися з ботами чи турбуватися про нестабільні конвеєри.

$curl -X POST localhost:8000/api/v1/scrape/page \ -d '{"url":"amazon.com/dp/B0CFFXRFTH"}'
amazon.com/dp/B0CFFXRFTH
scrape_page amazon.com
Fetching product page
Bypassing anti-bot
Extracting JSON-LD + DOM
Normalizing variants
Resolving images
Працює над ці торгові майданчики
Чому універсальні скрепери не працюють

Маркетплейси за один квартал виводять з ладу універсальні скрепери

Платформи електронної комерції кожні кілька тижнів оновлюють макет, впроваджують багаторівневий захист від ботів, обмежують доступ до «Buy Box» та даних продавців сеансами, а також змінюють формат полів залежно від локалі. Більшість команд витрачають 80 % свого часу на підтримку працездатності скрепера та лише 20 % — на самі дані. Ми пропонуємо чотири компоненти, які їм доводиться щоразу створювати з нуля.

Якщо ви коли-небудь прокидалися і бачили на інформаційній панелі безліч nulls після редизайну торговельного майданчика — ця стаття саме для вас.

Селектори порушують кожне зміщення макета

Проблема. Звичайні скрепери передають шлях CSS або XPath і сподіваються на краще. Коли торговельна платформа змінює дизайн сторінки товару (Amazon робить це кожні кілька тижнів), ваш конвеєр повертає nullу виробничому середовищі. Ви дізнаєтеся про це лише через кілька годин із панелі бізнес-аналітики, що працює на нижньому рівні.

Як Yozh Scraper вирішує цю проблему. У запиті передається llm: {model: "..."} у запиті, і парсер просить Anthropic / OpenAI / Gemini / OpenRouter перегенерувати селектор з поточного DOM. Конвеєр продовжує працювати з self_heal: true прапорцем у відповіді — без пробудження чергового спеціаліста.

  • Функція самовідновлення LLM
  • Багатопровайдерна система
  • Відсутність простоїв

Одна IP-адреса, п’ять запитів — блокування

Проблема. Проксі-сервери для центрів обробки даних виходять з ладу вже протягом одного сеансу. Системи CAPTCHA, ідентифікація за відбитками TLS та перевірки JavaScript виявляють «безголові» браузери за лічені секунди. Більшість команд створюють механізм ротації проксі-серверів з нуля, але все одно потрапляють під блокування.

Як Yozh Scraper вирішує цю проблему. Вбудована інтеграція з CyberYozh App Proxy за допомогою CYBERYOZH_API_KEY — 5 типів проксі (резидентні ротаційні / стаціонарні, мобільні 4G/5G, дата-центри, провайдери) у 250 країнах. Стелс-версія Chromium із «теплим» відбитком автоматично підбирає походження проксі.

  • 5 типів проксі-серверів
  • 250 кодів країн
  • Теплий відбиток пальця

Різна форма поля для кожного торгового майданчика

Проблема. Ціни Amazon знаходяться в одному блоці, eBay — в іншому, Walmart — у третьому. Для інформаційних панелей, що охоплюють кілька торгових майданчиків, необхідний рівень нормалізації ще до того, як буде опубліковано перший показник. Команди витрачають тижні на узгодження форматів полів.

Як Yozh Scraper вирішує цю проблему. 10 вбудованих пресетів, що src/presets/builtin/ повертають ідентичний JSON для Amazon, eBay, Walmart та Google Shopping. Ті самі ключі: title, price, currency, in_stock, rating. Аналіз валют з урахуванням локалі — структура залишається незмінною.

  • 10 пресетів
  • Така сама структура JSON
  • Валюта з урахуванням місцевих налаштувань

Обмеження доступу та сеанси, що закінчуються

Проблема. Для доступу до даних, прив’язаних до облікового запису — переможця «Buy Box», партнерських порталів, внутрішніх адміністраторів, джерел профілів у стилі LinkedIn — необхідний вхід у систему. Ручне зберігання файлів cookie перестає працювати після повторної авторизації. Більшість скреперів взагалі не підтримують управління сесіями.

Як Yozh Scraper вирішує цю проблему. API сесій із декларативною мовою DSL для входу (goto / fill / click / wait) або вставте експортовані файли cookie. Повторне використання session_id у кожному скрейпінгу — файли cookie та state зберігаються протягом 24 годин, оновлюються на льоту. Необхідно для пресета LinkedIn, підтримується всіма іншими.

  • Декларативний вхід
  • Cookie + стан збереження
  • 24 години TTL
Як це працює

Від URL до структурованого JSON за 3 виклики

Не потрібно писати селектори. Виберіть пресет, передайте параметри, проаналізуйте відповідь. Цей самий алгоритм працює для всіх підтримуваних торгових майданчиків.

1 Запустити

Склонуйте репозиторій і docker compose up. Запускаються дві служби: скрейпер на :8000, а сканер — на :8001.

# one-time setup
git clone \
  github.com/CyberYozh-data/yozh-scraper
cd yozh-scraper
docker compose up -d
2 Викликати попереднє налаштування

Опублікуйте назву пресета разом із параметрами. Ніяких селекторів, ніяких налаштувань для захисту від ботів — набір пресетів самостійно обробляє селектори, локаль та валюту.

curl \
  localhost:8000/api/v1/scrape/preset/page \
  -X POST \
  -d '{"source": "amazon_product",
       "preset_params": {"asin": "B0CFFXRFTH"},
       "locale": "us"}'
3 Отримати структурований JSON

Однакова форма у всіх регіонах. Якщо селектор виходить з ладу після зміни макета, система самовідновлення LLM миттєво відновлює його — конвеєр продовжує працювати.

{
  "asin":       "B0CFFXRFTH",
  "price":      189.99,
  "currency":   "USD",
  "in_stock":   true,
  "rating":     4.7
}
Приклад у дії

Що ви отримаєте натомість — одна форма, всі торгові майданчики

Виберіть пресет, щоб побачити, як виглядає відповідь. Набір полів залежить від джерела, але структура запиту залишається однаковою.


            
Рецепти

Як команди будують свої комбінації — по 10 рядків кожна

Три готові до використання конфігурації для електронної комерції. Планувальник не входить до комплекту — використовуйте власний cron / Airflow / Temporal.

1 Щоденний огляд цін

Один раз на день обробляйте список ASIN конкурентів, порівнюйте його з вчорашнім, публікуйте зміни у Slack. Cron зробить все інше.

# crontab: every day at 06:00
0 6 * * * /usr/local/bin/price-watch.sh

# price-watch.sh
curl -X POST localhost:8000/api/v1/scrape/preset/pages \
  -d "@asins.json" \
| jq '.results[] | {asin, price, in_stock}' \
> today.json

diff yesterday.json today.json | slack-cli post #pricing
mv today.json yesterday.json
200 URL-адрес на партію ~30 секунд на одного працівника ваш cron
2 Виявлення нових продуктів

Щодня сканувати сторінку категорії, виявляти дублікати URL-адрес товарів порівняно з вчорашнім днем. Використовувати веб-хук для нових товарів, перш ніж їх проіндексують конкуренти.

# start a crawl of the category
curl -X POST localhost:8001/api/v1/crawl/start \
  -d '{"seed_url":"amazon.com/s?k=ssd",
       "max_pages":300,
       "scope":"same-domain"}' \
| jq -r '.urls[]' > today_urls.txt

# urls that appeared today
comm -13 yesterday_urls.txt today_urls.txt \
| curl -X POST $WEBHOOK_URL -d @-
Потік SSE дедуплікація за завданням (SHA1) scope + rate-limit
3 Джерело з авторизацією · сесії

Зчитування сторінок, доступ до яких можливий лише після входу (LinkedIn, партнерські портали, внутрішні адміністративні ресурси). Увійдіть один раз за допомогою API Sessions, а потім використовуйте ці дані session_id для кожного зчитування.

# 1. log in once via declarative script
SID=$(curl -X POST \
  localhost:8000/api/v1/sessions/$ID/login \
  -d "@login_script.json" \
  | jq -r .session_id)

# 2. reuse for every scrape · cookies persist 24h
curl -X POST localhost:8000/api/v1/scrape/preset/page \
  -d "{\"source\":\"linkedin_profile\",
       \"preset_params\":{\"slug\":\"satyanadella\"},
       \"session_id\":\"$SID\"}"
24 години TTL cookie + state_storage CAPTCHA: вставте печиво
FAQ

Поширені запитання щодо даних про торговельні майданчики

Які торгові майданчики ви підтримуєте?
10 вбудованих пресетів, що src/presets/builtin/ найбільших джерел даних: amazon_product (us, uk, de, fr, jp), amazon_search (us, uk, de), ebay_search (США, Велика Британія, Німеччина), walmart_product (США), google_search (США, Велика Британія, Німеччина, Франція, Росія, Японія), google_shopping (США, Велика Британія, Німеччина), bing_search (США, Велика Британія, Німеччина, Франція, Росія, Японія), yandex_search (США, Велика Британія, Німеччина, Франція, Росія, Японія), youtube_video (у всьому світі), linkedin_profile (у всьому світі, вимагає session_id). Потрібно щось інше? Використовуйте POST /api/v1/presets/generate з прикладом URL-адреси — LLM визначить схему та згенерує селектори за вас.
Наскільки стабільною є схема?
Однакова форма полів у всіх регіонах та пресетах — amazon_product у доменах .us, .uk, .de, .fr, .jp всі повертають однакові ключі (валюта локалізована, структура незмінна). Необов’язкові поля явно допускають нульові значення, тому відсутність значень ніколи не порушить роботу вашого парсера. Коли торговельна платформа змінює макет, функція самовідновлення LLM миттєво перегенерує селектор (вкажіть llm: {model: "..."} у запиті) — конвеєр продовжує працювати з self_heal: true прапорцем у відповіді. Зміни, що порушують сумісність, випускаються лише у другорядних версіях із примітками щодо міграції в CHANGELOG.md.
Чи можна збирати дані з Amazon / eBay / Walmart?
Так — усі три пресети є першокласними, додаткового налаштування не потрібно. Amazon підтримує 5 регіональних локалізацій (us, uk, de, fr, jp) для сторінок детальної інформації про товар (PDP) та пошуку; eBay — для пошуку в us/uk/de; Walmart .us — для сторінок товарів. Кожен з них повертає JSON-дані однакового формату: title, price, currency, in_stock, rating, seller, а також специфічні для торговельних майданчиків поля, якщо вони є (ASIN, переможець Buy Box, позначка спонсорованого товару). Для даних, прив’язаних до облікового запису, що знаходяться за межами входу (ціни Prime, партнерські портали), використовуйте API Sessions і передайте session_id разом із запитом.
Як швидко я зможу отримати перші дані?
Приблизно 5 хвилин від початку до кінця. git clone + docker compose up -d запускає скрейпер в режимі онлайн за ~30 секунд (Docker завантажує образ один раз). Спочатку curl POST /api/v1/scrape/preset/page повертає структурований JSON за 1–3 секунди для кешованих локалей, до 5–8 секунд при першому запуску. Ніякої реєстрації, ніякого створення API-ключа, ніякого обліку SaaS — ви звертаєтеся до кінцевої точки localhost:8000 в той самий момент, коли контейнер готовий до роботи.
Чи використовуєте ви проксі-сервери та засоби захисту від ботів?
Так. Скрейпер інтегрується з CyberYozh App Proxy за допомогою CYBERYOZH_API_KEY — 5 типів проксі у 250 країнах (побутові ротаційні / стаціонарні, мобільні 4G/5G, дата-центри, провайдери). Захист від ботів забезпечується прихованою збіркою Chromium із «теплим» відбитком, відповідним побутовим проксі та природною динамікою дій — більшість потоків повністю обходять CAPTCHA. Якщо CAPTCHA все ж з’являється, скрейпер повертає її як структуровану помилку, а не вирішує її непомітно. Практичне правило: ротаційні резидентні проксі для скрейпінгу в масштабах каталогів, мобільні — для зон з агресивним захистом від ботів або завдань, пов’язаних з конкретними обліковими записами.
Відкрите програмне забезпечення · Ліцензія MIT · 84 ★

Готові до скрейпінгу торгових майданчиків?

Yozh Scraper відразу після встановлення підтримує Amazon, eBay, Walmart та Google Shopping. Безкоштовно. Назавжди. Поставте нам зірку, якщо це вам допомогло — кожна зірка має значення.

Yozh Crawler + Scraper розповсюджується за ліцензією MIT. Користуйтеся ним. Створюйте форки. Розробляйте на його основі.

Нас люблять 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 Інженер бекенду Loopfeed
X
Підключив його до Cursor через MCP, і тепер мій агент отримує веб-дані в режимі реального часу під час виконання завдання. Потокове сканування через SSE — це саме те, чого бракувало робочим процесам агента.
Elena Kovac Інженер з штучного інтелекту Vektor Labs
GitHub
Ми відмовилися від платного API для зчитування даних, щоб скоротити витрати, і готувалися до погіршення якості — але отримали зовсім протилежний результат. Сервіс розміщений на власному хостингу, оплата не стягується за кожен запит, а схема вихідних даних є чіткішою, ніж та, за яку ми раніше платили.
Sofia Almeida Керівник інженерного відділу Tabbly