Запланированные задачи
Периодический скрейпинг, обход и поиск по расписанию cron.
Введение
Запланированные задачи автоматизируют повторяющийся скрейпинг, обход и сбор данных по стандартным cron-выражениям. Подходит для мониторинга сайтов, цен, архивации, агрегации поиска и любых периодических задач.
Ключевые возможности: расписание cron с часовым поясом, режимы параллельности, автопауза при сбоях, учёт кредитов и вебхуки для событий.
Основные возможности
- Cron: стандартный синтаксис расписания
- Часовой пояс: выполнение в любой TZ (напр. Asia/Shanghai, America/New_York)
- Параллельность: два режима —
skipилиqueue - Автопауза: после серии ошибок подряд
- Кредиты: лимиты запусков в день и оценка расхода
- История: все запуски со статусом и метриками
- Вебхуки: уведомления о событиях задач
Конечные точки API
POST /v1/scheduled-tasks # Create a scheduled task
GET /v1/scheduled-tasks # List all tasks
GET /v1/scheduled-tasks/:taskId # Get task details
PUT /v1/scheduled-tasks/:taskId # Update task
PATCH /v1/scheduled-tasks/:taskId/pause # Pause task
PATCH /v1/scheduled-tasks/:taskId/resume # Resume task
DELETE /v1/scheduled-tasks/:taskId # Delete task
GET /v1/scheduled-tasks/:taskId/executions # Get execution history
DELETE /v1/scheduled-tasks/:taskId/executions/:executionId # Cancel an executionБыстрый старт
Ежедневная задача скрейпинга
curl -X POST "https://api.anycrawl.dev/v1/scheduled-tasks" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
-d '{
"name": "Daily Tech News",
"description": "Scrape Hacker News daily at 9 AM",
"cron_expression": "0 9 * * *",
"timezone": "Asia/Shanghai",
"task_type": "scrape",
"task_payload": {
"url": "https://news.ycombinator.com",
"engine": "cheerio",
"formats": ["markdown"]
},
"concurrency_mode": "skip",
"max_executions_per_day": 1
}'Ответ
{
"success": true,
"data": {
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"next_execution_at": "2026-01-28T01:00:00.000Z"
}
}Справка по cron
Cron использует 5 полей:
* * * * *
│ │ │ │ │
│ │ │ │ └─ День недели (0–7, 0 и 7 = воскресенье)
│ │ │ └─── Месяц (1–12)
│ │ └───── День месяца (1–31)
│ └─────── Час (0–23)
└───────── Минута (0–59)Типичные примеры
| Expression | Description | Execution Time |
|---|---|---|
0 9 * * * | Every day at 9:00 AM | 09:00:00 daily |
*/15 * * * * | Every 15 minutes | :00, :15, :30, :45 |
0 */6 * * * | Every 6 hours | 00:00, 06:00, 12:00, 18:00 |
0 9 * * 1 | Every Monday at 9 AM | Monday 09:00:00 |
0 0 1 * * | First day of month | 1st day, 00:00:00 |
30 2 * * 0 | Every Sunday at 2:30 AM | Sunday 02:30:00 |
Проверка и подсказки по cron: crontab.guru.
Параметры запроса
Конфигурация задачи
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
name | string | Yes | - | Имя задачи (1–255 символов) |
description | string | No | - | Описание |
cron_expression | string | Yes | - | Стандартное cron-выражение (5 полей) |
timezone | string | No | "UTC" | Часовой пояс (напр. "Asia/Shanghai") |
task_type | string | Yes | - | Тип: "scrape", "crawl", "search" или "template" |
task_payload | object | Yes | - | Конфигурация задачи (см. ниже) |
Параллельность
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
concurrency_mode | string | No | "skip" | Режим: "skip" или "queue" |
max_executions_per_day | number | No | - | Лимит запусков в сутки |
Метаданные выполнения (только чтение)
Эти поля возвращаются в ответах по задаче и не принимаются в теле create/update:
min_credits_required: оценка минимальных кредитов за один запуск (считает сервер)consecutive_failures: число подряд идущих сбоев для автопаузы
Вебхуки
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
webhook_ids | string[] | No | - | UUID подписок вебхуков |
webhook_url | string | No | - | URL вебхука (неявная подписка) |
Можно указать webhook_ids на существующие подписки или webhook_url для неявной подписки на эту задачу.
Метаданные
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
tags | string[] | No | - | Теги для группировки |
metadata | object | No | - | Произвольные метаданные |
Полезная нагрузка (task_payload)
Задача scrape
{
"url": "https://example.com/page",
"engine": "cheerio",
"formats": ["markdown"],
"timeout": 60000,
"wait_for": 2000,
"include_tags": ["article", "main"],
"exclude_tags": ["nav", "footer"]
}Задача crawl
{
"url": "https://example.com",
"engine": "playwright",
"options": {
"max_depth": 3,
"limit": 50,
"strategy": "same-domain",
"exclude_paths": ["/admin/*", "/api/*"],
"scrape_options": {
"formats": ["markdown"]
}
}
}Задача search
{
"query": "artificial intelligence news",
"engine": "google",
"limit": 20,
"country": "US",
"lang": "en",
"timeRange": "day"
}Задача template
{
"template_id": "my-search-template",
"query": "machine learning tutorials",
"variables": {
"lang": "en"
}
}Для task_type: "template" в task_payload должны быть:
template_id(обязательно): выполняемый шаблон- поля ввода для типа шаблона (например
urlдля scrape/crawl,queryдля search) - опционально
variablesдля динамических входов шаблона
Режимы параллельности
skip (рекомендуется)
Если предыдущий запуск ещё идёт, текущий пропускается.
Когда: задача может длиться дольше интервала между запусками.
Пример: crawl раз в час, иногда выполняется 90 минут.
queue
Новый запуск ставится в очередь и ждёт завершения предыдущего.
Когда: нельзя пропускать ни один запуск по расписанию.
Пример: критичный сбор данных без пропусков.
Управление задачами
Список задач
curl -X GET "https://api.anycrawl.dev/v1/scheduled-tasks" \
-H "Authorization: Bearer <your-api-key>"Ответ
{
"success": true,
"data": [
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Daily Tech News",
"task_type": "scrape",
"cron_expression": "0 9 * * *",
"timezone": "Asia/Shanghai",
"is_active": true,
"is_paused": false,
"next_execution_at": "2026-01-28T01:00:00.000Z",
"total_executions": 45,
"successful_executions": 43,
"failed_executions": 2,
"consecutive_failures": 0,
"last_execution_at": "2026-01-27T01:00:00.000Z",
"created_at": "2026-01-01T00:00:00.000Z"
}
]
}Пауза задачи
Временная остановка. Параметр reason сохраняется как pause_reason.
curl -X PATCH "https://api.anycrawl.dev/v1/scheduled-tasks/:taskId/pause" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
-d '{
"reason": "Maintenance period"
}'Ответ
{
"success": true,
"message": "Task paused successfully",
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"is_paused": true,
"pause_reason": "Maintenance period"
}
}Возобновление задачи
curl -X PATCH "https://api.anycrawl.dev/v1/scheduled-tasks/:taskId/resume" \
-H "Authorization: Bearer <your-api-key>"Обновление задачи
curl -X PUT "https://api.anycrawl.dev/v1/scheduled-tasks/:taskId" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
-d '{
"cron_expression": "0 10 * * *",
"description": "Updated description"
}'Ответ
{
"success": true,
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Daily Tech News",
"description": "Updated description",
"task_type": "scrape",
"cron_expression": "0 10 * * *",
"timezone": "Asia/Shanghai",
"task_payload": {
"url": "https://news.ycombinator.com",
"engine": "cheerio",
"formats": ["markdown"]
},
"concurrency_mode": "skip",
"is_active": true,
"is_paused": false,
"next_execution_at": "2026-01-28T02:00:00.000Z",
"total_executions": 45,
"successful_executions": 43,
"failed_executions": 2,
"consecutive_failures": 0,
"last_execution_at": "2026-01-27T01:00:00.000Z",
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-27T12:00:00.000Z",
"icon": "FileText"
}
}Указывайте только изменяемые поля; остальные не трогаются.
Удаление задачи
curl -X DELETE "https://api.anycrawl.dev/v1/scheduled-tasks/:taskId" \
-H "Authorization: Bearer <your-api-key>"Удаление задачи удаляет и всю историю запусков.
История выполнений
Получить запуски
curl -X GET "https://api.anycrawl.dev/v1/scheduled-tasks/:taskId/executions?limit=20" \
-H "Authorization: Bearer <your-api-key>"Ответ
{
"success": true,
"data": [
{
"uuid": "exec-uuid-1",
"scheduled_task_uuid": "task-uuid",
"execution_number": 45,
"status": "completed",
"started_at": "2026-01-27T01:00:00.000Z",
"completed_at": "2026-01-27T01:02:15.000Z",
"duration_ms": 135000,
"job_uuid": "job-uuid-1",
"triggered_by": "scheduler",
"scheduled_for": "2026-01-27T01:00:00.000Z",
"error_message": null,
"credits_used": 5,
"items_processed": 1,
"items_succeeded": 1,
"items_failed": 0,
"job_status": "completed",
"job_success": true,
"icon": "CircleCheck"
}
]
}Примечание: поля credits_used, items_processed, items_succeeded, items_failed, job_status, job_success приходят из связанной записи job (JOIN). duration_ms считается из started_at и completed_at.
Отмена одного запуска
Отмена конкретного запуска в статусе ожидания или выполнения — без паузы всей задачи.
curl -X DELETE "https://api.anycrawl.dev/v1/scheduled-tasks/:taskId/executions/:executionId" \
-H "Authorization: Bearer <your-api-key>"Ответ
{
"success": true,
"message": "Execution cancelled successfully"
}Отменить можно только запуски со статусом pending или running. Завершённые, с ошибкой или уже отменённые вернут ошибку.
Обработка сбоев
Автопауза при серии ошибок
Задача автоматически ставится на паузу после 5 сбоев подряд, чтобы не тратить ресурсы зря.
Возобновление: вручную после устранения причины.
curl -X PATCH "https://api.anycrawl.dev/v1/scheduled-tasks/:taskId/resume" \
-H "Authorization: Bearer <your-api-key>"Мониторинг сбоев
Следите за полем consecutive_failures в статусе задачи:
{
"consecutive_failures": 3,
"failed_executions": 5,
"successful_executions": 40
}Следите за consecutive_failures: высокие значения указывают на повторяющиеся проблемы.
Интеграция с вебхуками
Подписка на события задач через вебхуки:
curl -X POST "https://api.anycrawl.dev/v1/webhooks" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
-d '{
"name": "Task Notifications",
"webhook_url": "https://your-domain.com/webhook",
"event_types": ["task.executed", "task.failed", "task.paused"],
"scope": "all"
}'Подробнее — Webhooks.
Типичные сценарии
Мониторинг цен
Проверка цены товара каждый час:
{
"name": "Hourly Price Tracker",
"cron_expression": "0 * * * *",
"task_type": "scrape",
"task_payload": {
"url": "https://shop.example.com/product/12345",
"engine": "cheerio",
"formats": ["markdown"]
},
"concurrency_mode": "skip"
}Еженедельный бэкап документации
Обход и архивация документации раз в неделю:
{
"name": "Weekly Docs Backup",
"cron_expression": "0 3 * * 0",
"timezone": "UTC",
"task_type": "crawl",
"task_payload": {
"url": "https://docs.example.com",
"engine": "playwright",
"options": {
"max_depth": 10,
"limit": 500
}
},
"max_executions_per_day": 1
}Ежедневная агрегация новостей
Скрейпинг новостных источников раз в день:
{
"name": "Morning News Digest",
"cron_expression": "0 6 * * *",
"timezone": "America/New_York",
"task_type": "scrape",
"task_payload": {
"url": "https://news.example.com",
"engine": "cheerio",
"formats": ["markdown"]
},
"max_executions_per_day": 1
}Конкурентная разведка
Упоминания конкурентов и тренды отрасли каждый час:
{
"name": "Competitor Monitoring",
"cron_expression": "0 * * * *",
"task_type": "search",
"task_payload": {
"query": "YourCompany OR CompetitorA OR CompetitorB",
"engine": "google",
"limit": 50,
"timeRange": "day"
},
"concurrency_mode": "skip"
}Рекомендации
1. Интервалы cron
- Не чаще 1 минуты — избегайте лишней нагрузки
- Учитывайте частоту обновления целевого сайта
- Используйте
timezoneдля локального времени
2. Режим параллельности
"skip"— для большинства задач, чтобы не перекрывать запуски"queue"— только когда каждый запуск обязателен
3. Кредиты
max_executions_per_dayдля дорогих задач- смотрите
min_credits_requiredв деталях задачи - отслеживайте расход в истории запусков
4. Здоровье задач
- регулярно проверяйте
consecutive_failures - анализируйте историю на паттерны
- настройте вебхуки на сбои
5. Имена и теги
- понятные имена задач
- теги для фильтрации
- метаданные для учёта
Ограничения
| Item | Limit |
|---|---|
| Task name length | 1-255 characters |
| Minimum interval | 1 minute |
| Concurrency modes | skip, queue |
| Task payload size | 100KB |
| Cron expression format | Standard 5-field format |
Устранение неполадок
Задача не выполняется
Проверьте:
- активна ли задача (
is_active: true) - не на паузе ли (
is_paused: false) - корректно ли cron-выражение
- достаточно ли кредитов
Высокий процент ошибок
Возможные причины:
- сайт блокирует запросы
- неверные URL в
task_payload - мало таймаута
- сеть
Что сделать:
- задержки через
wait_for - другой движок (Playwright для динамики)
- увеличить таймаут
- смотреть ошибки в истории
Кредиты заканчиваются быстро
- реже запускать
max_executions_per_day- облегчить payload (меньше страниц/форматов)
- найти дорогие запуски в истории
См. также
- Webhooks — уведомления о событиях
- Scrape API — конфигурация скрейпинга
- Crawl API — конфигурация обхода