El raspado en lote permite raspar múltiples URL en un solo trabajo. Pasa una lista de URL y parámetros opcionales, y Firecrawl las procesa de forma concurrente y devuelve todos los resultados de una sola vez.
- Funciona como
/crawl pero para una lista explícita de URL
- Modos síncrono y asíncrono
- Compatible con todas las opciones de raspado, incluida la extracción estructurada
- Concurrencia configurable por trabajo
Puedes ejecutar un scrape por lotes de dos maneras:
| Modo | Método del SDK (JS / Python) | Comportamiento |
|---|
| Síncrono | batchScrape / batch_scrape | Inicia el lote y espera a que finalice, devolviendo todos los resultados |
| Asíncrono | startBatchScrape / start_batch_scrape | Inicia el lote y devuelve un ID de trabajo para polling o webhooks |
from firecrawl import Firecrawl
firecrawl = Firecrawl(api_key="fc-YOUR-API-KEY")
start = firecrawl.start_batch_scrape([
"https://firecrawl.dev",
"https://docs.firecrawl.dev",
], formats=["markdown"]) # devuelve el id
job = firecrawl.batch_scrape([
"https://firecrawl.dev",
"https://docs.firecrawl.dev",
], formats=["markdown"], poll_interval=2, wait_timeout=120)
print(job.status, job.completed, job.total)
Invocar batchScrape / batch_scrape devuelve los resultados completos cuando el lote finaliza.
{
"status": "completed",
"total": 36,
"completed": 36,
"creditsUsed": 36,
"expiresAt": "2024-00-00T00:00:00.000Z",
"next": "https://api.firecrawl.dev/v2/batch/scrape/123-456-789?skip=26",
"data": [
{
"markdown": "[Página principal de la documentación de Firecrawl!...",
"html": "<!DOCTYPE html><html lang=\"en\" class=\"js-focus-visible lg:[--scroll-mt:9.5rem]\" data-js-focus-visible=\"\">...",
"metadata": {
"title": "Crea un «chat con el sitio web» usando Groq Llama 3 | Firecrawl",
"language": "en",
"sourceURL": "https://docs.firecrawl.dev/learn/rag-llama3",
"description": "Aprende a usar Firecrawl, Groq Llama 3 y LangChain para crear un bot de «chat con tu sitio web»."
"ogLocaleAlternate": [],
"statusCode": 200
}
},
...
]
}
Invocar startBatchScrape / start_batch_scrape devuelve un ID de tarea que puedes monitorear mediante getBatchScrapeStatus / get_batch_scrape_status, el endpoint de la API /batch/scrape/{id} o webhooks. Los resultados de la tarea están disponibles a través de la API durante 24 horas después de su finalización. Después de este período, aún puedes ver el historial y los resultados de tus ejecuciones de batch scrape en los activity logs.
{
"success": true,
"id": "123-456-789",
"url": "https://api.firecrawl.dev/v2/batch/scrape/123-456-789"
}
De forma predeterminada, un trabajo de extracción por lotes usa todo el límite de navegadores concurrentes de tu equipo (consulta Rate Limits). Puedes reducir este valor por trabajo con el parámetro maxConcurrency.
Por ejemplo, maxConcurrency: 50 limita ese trabajo a 50 extracciones simultáneas. Establecer este valor demasiado bajo en lotes grandes ralentizará significativamente el procesamiento, así que solo redúcelo si necesitas dejar capacidad para otros trabajos concurrentes.
Puedes usar el raspado por lotes para extraer datos estructurados de cada página del lote. Esto es útil si quieres aplicar el mismo esquema a una lista de URL.
from firecrawl import Firecrawl
firecrawl = Firecrawl(api_key="fc-YOUR_API_KEY")
# Extrae varios sitios web:
batch_scrape_result = firecrawl.batch_scrape(
['https://docs.firecrawl.dev', 'https://docs.firecrawl.dev/sdks/overview'],
formats=[{
'type': 'json',
'prompt': 'Extrae el título y la descripción de la página.',
'schema': {
'type': 'object',
'properties': {
'title': {'type': 'string'},
'description': {'type': 'string'}
},
'required': ['title', 'description']
}
}]
)
print(batch_scrape_result)
# O puedes usar el método start:
batch_scrape_job = firecrawl.start_batch_scrape(
['https://docs.firecrawl.dev', 'https://docs.firecrawl.dev/sdks/overview'],
formats=[{
'type': 'json',
'prompt': 'Extrae el título y la descripción de la página.',
'schema': {
'type': 'object',
'properties': {
'title': {'type': 'string'},
'description': {'type': 'string'}
},
'required': ['title', 'description']
}
}]
)
print(batch_scrape_job)
# Luego puedes usar el ID del job para comprobar el estado de la extracción por lotes:
batch_scrape_status = firecrawl.get_batch_scrape_status(batch_scrape_job.id)
print(batch_scrape_status)
batchScrape / batch_scrape devuelve resultados completos:
{
"status": "completed",
"total": 36,
"completed": 36,
"creditsUsed": 36,
"expiresAt": "2024-00-00T00:00:00.000Z",
"next": "https://api.firecrawl.dev/v2/batch/scrape/123-456-789?skip=26",
"data": [
{
"json": {
"title": "Crea un ‘chat con el sitio web’ usando Groq Llama 3 | Firecrawl",
"description": "Aprende a usar Firecrawl, Groq Llama 3 y LangChain para crear un bot de ‘chat con tu sitio web’."
}
},
...
]
}
startBatchScrape / start_batch_scrape devuelve un ID de tarea:
{
"success": true,
"id": "123-456-789",
"url": "https://api.firecrawl.dev/v2/batch/scrape/123-456-789"
}
Puedes configurar webhooks para recibir notificaciones en tiempo real a medida que se rastrea cada URL de tu lote. Esto te permite procesar los resultados de inmediato en lugar de esperar a que finalice todo el lote.
curl -X POST https://api.firecrawl.dev/v2/batch/scrape \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-d '{
"urls": [
"https://example.com/page1",
"https://example.com/page2",
"https://example.com/page3"
],
"webhook": {
"url": "https://your-domain.com/webhook",
"metadata": {
"any_key": "any_value"
},
"events": ["started", "page", "completed"]
}
}'
| Evento | Descripción |
|---|
batch_scrape.started | El proceso de scraping por lotes ha comenzado |
batch_scrape.page | Se ha hecho scraping correctamente de una sola URL |
batch_scrape.completed | Se han procesado todas las URL |
batch_scrape.failed | Se produjo un error durante el scraping por lotes |
Cada entrega de webhook incluye un cuerpo JSON con la siguiente estructura:
{
"success": true,
"type": "batch_scrape.page",
"id": "batch-job-id",
"data": [...],
"metadata": {},
"error": null
}
Verificación de firmas de webhooks
Cada solicitud de webhook de Firecrawl incluye un encabezado X-Firecrawl-Signature que contiene una firma HMAC-SHA256. Verifica siempre esta firma para asegurarte de que el webhook sea auténtico y no haya sido manipulado.
- Obtén tu secreto de webhook en la pestaña Advanced de la configuración de tu cuenta
- Extrae la firma del encabezado
X-Firecrawl-Signature
- Calcula el HMAC-SHA256 del cuerpo sin procesar de la solicitud usando tu secreto
- Compáralo con el encabezado de firma utilizando una función segura frente a ataques de temporización
Nunca proceses un webhook sin verificar primero su firma. El encabezado X-Firecrawl-Signature contiene la firma en el formato: sha256=abc123def456...
Para ejemplos completos de implementación en JavaScript y Python, consulta la documentación de seguridad de webhooks.
Para obtener una documentación completa sobre webhooks, incluidas cargas útiles de eventos detalladas, configuración avanzada y solución de problemas, consulta la documentación de webhooks.