AnyCrawl

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: skip oder queue
  • 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 abbrechen

Schnellstart

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

AusdruckBedeutungZeitpunkt
0 9 * * *Täglich 9:0009:00 täglich
*/15 * * * *Alle 15 Min.:00,:15,:30,:45
0 */6 * * *Alle 6 Stunden0,6,12,18 Uhr
0 9 * * 1Montags 9:00Mo 09:00
0 0 1 * *Monatserster 0:001. des Monats
30 2 * * 0Sonntags 2:30So 02:30

Hier Cron-Ausdrücke prüfen.

Anfrageparameter

Aufgabenkonfiguration

ParameterTypErforderlichStandardBeschreibung
namestringJa-Name (1–255 Zeichen)
descriptionstringNein-Beschreibung
cron_expressionstringJa-Cron (5 Felder)
timezonestringNein"UTC"Zeitzone
task_typestringJa-"scrape", "crawl", "search" oder "template"
task_payloadobjectJa-Konfiguration (siehe unten)

Parallelität

ParameterTypErforderlichStandardBeschreibung
concurrency_modestringNein"skip""skip" oder "queue"
max_executions_per_daynumberNein-Max. Ausführungen pro Tag

Nur lesbar (Antwort)

Nicht in Create/Update-Bodies:

  • min_credits_required: geschätzte Mindest-Credits pro Lauf
  • consecutive_failures: aufeinanderfolgende Fehler für Auto-Pause

Webhooks

ParameterTypErforderlichStandardBeschreibung
webhook_idsstring[]Nein-UUIDs bestehender Webhook-Abos
webhook_urlstringNein-URL (legt implizites Abo an)

Entweder webhook_ids oder webhook_url für diese Aufgabe.

Metadaten

ParameterTypErforderlichStandardBeschreibung
tagsstring[]Nein-Tags
metadataobjectNein-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. url oder query)
  • 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_day bei teuren Jobs
  • min_credits_required beachten
  • Verlauf prüfen

4. Aufgaben-Gesundheit

  • consecutive_failures beobachten
  • Muster im Verlauf
  • Webhooks bei Fehlern

5. Namen und Tags

  • Sprechende Namen, Tags, Metadaten

Grenzen

PunktLimit
Name1–255 Zeichen
Mindestintervall1 Minute
Modiskip, queue
Payload100 KB
Cron5 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

Verwandte Dokumentation