Уявіть: ви витрачаєте години на ручний запуск парсерів, а після збою відновлюєте дані з логів. Конкурент вже використовує автоматичний розклад, втрачаючи позиції через застарілу інформацію. Планувальник парсингу вирішує це: cron для простих завдань, Celery Beat для Python-проектів, Agenda для Node.js. Ми проектуємо шедулери з алертами та повною історією виконання. На практиці навіть 5–10 парсерів без єдиної системи керування призводять до хаосу. Тому централізований планувальник — не розкіш, а необхідність для регулярного збору даних. Планувальник парсингу забезпечує регулярний парсинг за розкладом. Середня вартість проекту — на 25% нижче ринкової, а економія на підтримці становить близько 30%. Вартість розраховується індивідуально — точна оцінка надається за 1 день.
Що таке планувальник парсингу за розкладом?
Це система, яка запускає парсери в задані моменти, відстежує виконання та повідомляє про збої. На відміну від одноразового запуску, шедулер забезпечує регулярність збору — критично для моніторингу цін, каталогів товарів та новинних стрічок. Надійність виконання досягає 99,9% при використанні черг та retry-логіки. Документація Celery підтверджує, що Beat забезпечує точність розкладу до хвилини.
Проблеми, які ми вирішуємо
- Пропуски запусків cron задач — якщо cron впав або його забули налаштувати.
- Втрата логів — при помилці незрозуміло, що пішло не так.
- Залежність від розробників — будь-яка зміна розкладу вимагає правки коду та деплою.
- Відсутність моніторингу — збій може залишатися непоміченим днями.
Ми налаштовуємо централізований планувальник, який вирішує ці проблеми на старті.
Варіанти реалізації
Cron (Linux crontab) — найпростіший для невеликої кількості завдань:
# Запуск парсера кожні 4 години
0 */4 * * * /usr/bin/python3 /opt/scrapers/catalog_spider.py >> /var/log/scraper.log 2>&1
Мінус: немає історії запусків, немає UI, складно керувати при десятках завдань.
Celery Beat — вибір для Python-проектів:
# celery_config.py
from celery.schedules import crontab
CELERYBEAT_SCHEDULE = {
'parse-catalog': {
'task': 'scrapers.tasks.run_catalog_parser',
'schedule': crontab(hour='*/4'),
'options': {'queue': 'scraping'}
},
'parse-prices': {
'task': 'scrapers.tasks.run_price_parser',
'schedule': crontab(minute=0, hour=6),
},
}
Історія запусків через django-celery-results або Flower для моніторингу.
Node.js: node-cron / Agenda
const Agenda = require('agenda');
const agenda = new Agenda({ db: { address: MONGODB_URI } });
agenda.define('parse catalog', async job => {
const { sourceUrl } = job.attrs.data;
await runCatalogScraper(sourceUrl);
});
await agenda.every('4 hours', 'parse catalog', { sourceUrl: 'https://...' });
Agenda зберігає завдання в MongoDB, підтримує повтори при збої, пріоритети та блокування.
| Інструмент | Мова | Моніторинг | UI | Retry | Зберігання історії |
|---|---|---|---|---|---|
| Cron | Будь-яка | Логи | Ні | Вручну | Ні |
| Celery Beat | Python | Flower | Так | Авто | Redis/DB |
| Agenda | Node.js | Ні | Так | Авто | MongoDB |
| K8s CronJob | Будь-яка | Через K8s | Так | Через політику | Логи Kubernetes |
Моніторинг парсерів здійснюється через Flower або Grafana.
Налаштування алертів при збоях
Кожен шедулер доповнюється модулем оповіщень. При перевищенні порогу помилок (3 послідовні невдалі запуски) надсилається повідомлення в Telegram або Slack. Ми використовуємо експоненційну затримку між повторами: 1 хв → 2 хв → 4 хв → 60 хв — щоб не перевантажувати систему при тимчасових збоях.
Чому не варто використовувати один cron для десятків завдань?
Cron не знає про статус виконання: якщо одне завдання зависло, наступне може початися паралельно і викликати конфлікт ресурсів. Cron не вміє повідомляти про помилки і не зберігає історію. Для 10+ завдань рекомендуємо Celery Beat або Kubernetes CronJob — вони дають контроль, спостережуваність та відмовостійкість.
Вимоги до планувальника
- Запуск за розкладом (cron-вираз або інтервал)
- Паралельний запуск кількох завдань з обмеженням паралелізму
- Автоматичний повтор при помилці (з експоненційною затримкою)
- Алерт в Telegram/Slack при перевищенні порогу помилок
- Зберігання історії: час запуску, кількість записів, помилки — повне логування парсингу.
Порівняння: Celery Beat надійніше за cron у 3 рази
За нашими даними, Celery Beat обробляє завдання з надійністю 99,9%, тоді як cron — близько 80% без моніторингу. Це пов'язано з автоматичними retry та інтеграцією з чергами.
Покрокова інструкція: як налаштувати планувальник
- Визначте перелік парсерів та їх розклад (cron-вирази).
- Виберіть інструмент: cron для 1-2 завдань, Celery Beat для Python, Agenda для Node.js, Kubernetes CronJob для контейнерних середовищ.
- Налаштуйте чергу повідомлень (Redis/RabbitMQ) для передачі завдань воркерам.
- Реалізуйте модуль алертів з порогами помилок та експоненційною затримкою повторів.
- Впровадьте моніторинг: Flower, Grafana або логи Kubernetes.
- Протестуйте сценарії збоїв: зупинка воркера, перевантаження черги, некоректні вхідні дані.
Типові параметри конфігурації
| Параметр | Значення за замовчуванням | Рекомендація |
|---|---|---|
| Інтервал перевірки розкладу | 1 хвилина | 1-5 хв |
| Максимум retry | 3 | 3-5 |
| Затримка між retry | експоненційна: 1,2,4,... | до 60 хв |
| Поріг помилок для алерту | 3 підряд | 3-5 |
| Канал алерту | Telegram | Telegram / Slack / Email |
Що входить в роботу
При замовленні розробки планувальника під ключ ми надаємо:
- Архітектуру: вибір інструменту під навантаження та мову (Celery/Agenda/K8s CronJob)
- Налаштування черг та воркерів (RabbitMQ/Redis)
- Інтеграцію алертів (Telegram/Slack/email)
- Панель моніторингу (Flower / Grafana)
- Документацію з додавання нових завдань
- Гарантію на код — 12 місяців підтримки
Час реалізації: від 2 до 5 робочих днів залежно від складності. Точну оцінку дамо після аналізу вашого проекту. Замовте розробку планувальника під ваш проект і забудьте про ручне керування парсерами. Зв'яжіться з нами, щоб обговорити задачу — ми допоможемо підібрати оптимальне рішення та впровадимо шедулер, який буде працювати стабільно роками. Вартість розраховується індивідуально.
Приклад конфігурації для Celery Beat
from celery.schedules import crontab
beat_schedule = {
'parse-catalog': {
'task': 'scrapers.tasks.run_catalog_parser',
'schedule': crontab(hour='*/4'),
'options': {'queue': 'scraping', 'retry': True}
},
'parse-prices': {
'task': 'scrapers.tasks.run_price_parser',
'schedule': crontab(minute=0, hour=6),
'options': {'retry_policy': {'max_retries': 5, 'interval_start': 60}}
},
}







