Geplante Aufgaben
Wiederkehrendes Scraping, Crawling und Suchen mit Cron-Scheduling automatisieren.
Einführung
Geplante Aufgaben automatisieren wiederkehrendes Scraping, Crawling und Datensammlung mit Standard-Cron-Ausdrücken. Ideal für Monitoring, Preisverfolgung, Archivierung, Such-Aggregation oder periodische Datenabholung.
Kernpunkte: Cron mit Zeitzonen, Konkurrenzmodi (skip/queue), automatisches Pausieren bei Fehlern, Credits, Webhooks.
Kernfunktionen
- Cron-Scheduling: Standard-Cron-Syntax
- Zeitzonen: z. B.
Asia/Shanghai,Europe/Berlin - Parallelität:
skipoderqueue - Auto-Pause: nach aufeinanderfolgenden Fehlern
- Credits: Tageslimits und Schätzungen
- Ausführungsverlauf: Status und Metriken
- Webhooks: Ereignisbenachrichtigungen
API-Endpunkte
POST /v1/scheduled-tasks # Aufgabe anlegen
GET /v1/scheduled-tasks # Alle Aufgaben
GET /v1/scheduled-tasks/:taskId # Details
PUT /v1/scheduled-tasks/:taskId # Aktualisieren
PATCH /v1/scheduled-tasks/:taskId/pause # Pausieren
PATCH /v1/scheduled-tasks/:taskId/resume # Fortsetzen
DELETE /v1/scheduled-tasks/:taskId # Löschen
GET /v1/scheduled-tasks/:taskId/executions # Verlauf
DELETE /v1/scheduled-tasks/:taskId/executions/:executionId # Ausführung abbrechenSchnellstart
Tägliches Scraping anlegen
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
}'Antwort
{
"success": true,
"data": {
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"next_execution_at": "2026-01-28T01:00:00.000Z"
}
}Cron-Ausdrücke
Cron nutzt 5 Felder:
* * * * *
│ │ │ │ │
│ │ │ │ └─ Wochentag (0–7, 0 und 7 = Sonntag)
│ │ │ └─── Monat (1–12)
│ │ └───── Tag im Monat (1–31)
│ └─────── Stunde (0–23)
└───────── Minute (0–59)Häufige Beispiele
| Ausdruck | Bedeutung | Zeitpunkt |
|---|---|---|
0 9 * * * | Täglich 9:00 | 09:00 täglich |
*/15 * * * * | Alle 15 Min. | :00,:15,:30,:45 |
0 */6 * * * | Alle 6 Stunden | 0,6,12,18 Uhr |
0 9 * * 1 | Montags 9:00 | Mo 09:00 |
0 0 1 * * | Monatserster 0:00 | 1. des Monats |
30 2 * * 0 | Sonntags 2:30 | So 02:30 |
Hier Cron-Ausdrücke prüfen.
Anfrageparameter
Aufgabenkonfiguration
| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
name | string | Ja | - | Name (1–255 Zeichen) |
description | string | Nein | - | Beschreibung |
cron_expression | string | Ja | - | Cron (5 Felder) |
timezone | string | Nein | "UTC" | Zeitzone |
task_type | string | Ja | - | "scrape", "crawl", "search" oder "template" |
task_payload | object | Ja | - | Konfiguration (siehe unten) |
Parallelität
| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
concurrency_mode | string | Nein | "skip" | "skip" oder "queue" |
max_executions_per_day | number | Nein | - | Max. Ausführungen pro Tag |
Nur lesbar (Antwort)
Nicht in Create/Update-Bodies:
min_credits_required: geschätzte Mindest-Credits pro Laufconsecutive_failures: aufeinanderfolgende Fehler für Auto-Pause
Webhooks
| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
webhook_ids | string[] | Nein | - | UUIDs bestehender Webhook-Abos |
webhook_url | string | Nein | - | URL (legt implizites Abo an) |
Entweder webhook_ids oder webhook_url für diese Aufgabe.
Metadaten
| Parameter | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
tags | string[] | Nein | - | Tags |
metadata | object | Nein | - | Freie Metadaten |
Aufgaben-Payload
Scrape-Aufgabe
{
"url": "https://example.com/page",
"engine": "cheerio",
"formats": ["markdown"],
"timeout": 60000,
"wait_for": 2000,
"include_tags": ["article", "main"],
"exclude_tags": ["nav", "footer"]
}Crawl-Aufgabe
{
"url": "https://example.com",
"engine": "playwright",
"options": {
"max_depth": 3,
"limit": 50,
"strategy": "same-domain",
"exclude_paths": ["/admin/*", "/api/*"],
"scrape_options": {
"formats": ["markdown"]
}
}
}Search-Aufgabe
{
"query": "artificial intelligence news",
"engine": "google",
"limit": 20,
"country": "US",
"lang": "en",
"timeRange": "day"
}Template-Aufgabe
{
"template_id": "my-search-template",
"query": "machine learning tutorials",
"variables": {
"lang": "en"
}
}Bei task_type: "template" muss task_payload enthalten:
template_id(Pflicht)- typspezifische Felder (z. B.
urloderquery) - optional
variables
Konkurrenzmodi
skip (empfohlen)
Läuft die vorherige Ausführung noch, wird die aktuelle übersprungen.
Wann: Laufzeit kann länger als das Intervall sein.
Beispiel: Stündlicher Crawl, manchmal 90 Minuten.
queue
Neue Ausführung wartet, bis die vorherige fertig ist.
Wann: Kein Lauf darf ausfallen.
Beispiel: Kritische Datenerfassung.
Aufgaben verwalten
Alle Aufgaben listen
curl -X GET "https://api.anycrawl.dev/v1/scheduled-tasks" \
-H "Authorization: Bearer <your-api-key>"Antwort
{
"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"
}
]
}Aufgabe pausieren
Pausieren stoppt Ausführungen vorübergehend. reason wird als pause_reason gespeichert.
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"
}'Antwort
{
"success": true,
"message": "Task paused successfully",
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"is_paused": true,
"pause_reason": "Maintenance period"
}
}Aufgabe fortsetzen
curl -X PATCH "https://api.anycrawl.dev/v1/scheduled-tasks/:taskId/resume" \
-H "Authorization: Bearer <your-api-key>"Aufgabe aktualisieren
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"
}'Antwort
{
"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"
}
}Nur zu ändernde Felder senden; der Rest bleibt unverändert.
Aufgabe löschen
curl -X DELETE "https://api.anycrawl.dev/v1/scheduled-tasks/:taskId" \
-H "Authorization: Bearer <your-api-key>"Löschen entfernt auch den gesamten Ausführungsverlauf.
Ausführungsverlauf
Ausführungen abrufen
curl -X GET "https://api.anycrawl.dev/v1/scheduled-tasks/:taskId/executions?limit=20" \
-H "Authorization: Bearer <your-api-key>"Antwort
{
"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"
}
]
}Hinweis: credits_used, items_*, job_status, job_success stammen per JOIN vom zugehörigen Job. duration_ms aus started_at/completed_at.
Ausführung abbrechen
Bricht eine laufende oder wartende Einzelausführung ab (ohne die ganze Aufgabe zu pausieren).
curl -X DELETE "https://api.anycrawl.dev/v1/scheduled-tasks/:taskId/executions/:executionId" \
-H "Authorization: Bearer <your-api-key>"Antwort
{
"success": true,
"message": "Execution cancelled successfully"
}Nur pending oder running abbrechen. Abgeschlossene/fehlgeschlagene Läufe liefern Fehler.
Automatische Fehlerbehandlung
Auto-Pause bei Fehlern
Nach 5 aufeinanderfolgenden Fehlern wird die Aufgabe pausiert.
Fortsetzen: Nach Fix manuell resume.
curl -X PATCH "https://api.anycrawl.dev/v1/scheduled-tasks/:taskId/resume" \
-H "Authorization: Bearer <your-api-key>"Fehler beobachten
Feld consecutive_failures in der Aufgabe:
{
"consecutive_failures": 3,
"failed_executions": 5,
"successful_executions": 40
}Hohe consecutive_failures deuten auf wiederkehrende Probleme hin.
Integration mit Webhooks
Ereignisse per Webhook abonnieren:
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"
}'Siehe Webhooks.
Anwendungsfälle
Preisüberwachung
Stündlich:
{
"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"
}Wöchentliches Docs-Backup
Wöchentlich crawlen/archivieren:
{
"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
}Tägliche News
Täglich:
{
"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
}Wettbewerbs-/Trend-Monitoring
Stündlich suchen:
{
"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"
}Best Practices
1. Cron-Intervalle
- Nicht zu häufig (< 1 Min.) – Ratenlimits der Ziele
- An Aktualisierungsrate der Site anpassen
- Zeitzone für lokale Zeiten setzen
2. Konkurrenzmodus
- Meist
"skip"gegen überlappende Läufe "queue"nur wenn jeder Lauf zählt
3. Credits
max_executions_per_daybei teuren Jobsmin_credits_requiredbeachten- Verlauf prüfen
4. Aufgaben-Gesundheit
consecutive_failuresbeobachten- Muster im Verlauf
- Webhooks bei Fehlern
5. Namen und Tags
- Sprechende Namen, Tags, Metadaten
Grenzen
| Punkt | Limit |
|---|---|
| Name | 1–255 Zeichen |
| Mindestintervall | 1 Minute |
| Modi | skip, queue |
| Payload | 100 KB |
| Cron | 5 Felder |
Fehlerbehebung
Läuft nicht
is_active: true,is_paused: false- gültiger Cron
- genug Credits
Viele Fehler
- Ziel blockt Anfragen
- ungültige URLs/Timeouts
- Netzwerk
→ wait_for, andere Engine (Playwright), Timeouts, Verlauf lesen
Credits zu schnell weg
- seltener ausführen,
max_executions_per_day, leichtere Payloads