Scraping de una web
Le da una URL y un mapa de selectores CSS, y le devuelve exactamente los campos que pidió en JSON estructurado, sin navegador headless que vigilar ni HTML que parsear por su cuenta. Es el endpoint de trabajo para equipos que ya saben con precisión en qué div, span o celda de tabla vive el dato que necesitan.
Ejecútela online
Ejecute esto en nuestros servidores con su cuenta. Las herramientas gratuitas corren en su navegador; esta cobra de su saldo del KIT según el precio de arriba.
Pensado para quien ya conoce sus selectores
Si sabe abrir las herramientas de desarrollador, hacer clic derecho sobre un elemento y copiar su selector, este endpoint es para usted. Sirve para monitores de precios, seguimiento de inventario, extracción de anuncios inmobiliarios, vigilancia de bolsas de empleo y cualquier tarea recurrente donde el diseño de la página objetivo sea conocido y razonablemente estable. Define un mapa de selectores una sola vez, nombre de campo a selector CSS, y cada solicitud contra ese mismo tipo de página lo reutiliza.
Qué ocurre después de enviar una solicitud
La llamada a POST /web/scrape-selector devuelve un task_id de inmediato; la descarga y extracción reales corren de forma asíncrona sobre nuestro edge global, incluyendo páginas renderizadas con JavaScript cuando el selector apunta a contenido inyectado del lado del cliente. Al terminar la tarea, el resultado llega a su webhook firmado o queda disponible en un enlace firmado válido durante 24 horas, después de lo cual el dato se elimina y nunca se usa para entrenar modelos.
Selectores CSS: una idea vieja que sigue ganando
Los selectores describen la estructura de un documento desde CSS1 en 1996, y los navegadores estandarizaron la coincidencia tipo querySelector hace décadas, lo cual explica por qué siguen siendo la forma más rápida y barata de extraer un campo conocido de un diseño conocido. A diferencia de un modelo de visión o de lenguaje, un selector coincide o no coincide: cero ambigüedad, cero campos inventados y un resultado que puede probar con un test unitario.
Qué recibe de vuelta y qué pasa cuando un selector falla
La respuesta refleja su mapa de selectores campo por campo, con arreglos para elementos repetidos como filas de tabla o ítems de lista, y null para un selector que no encontró nada en esa página en particular. Como los intentos de extracción fallidos se reintentan automáticamente hasta tres veces antes de devolver un error claro, un timeout pasajero o un widget que carga lento no le cuesta un cargo silencioso: solo se factura una tarea que realmente se completa.
Dónde encaja dentro de un flujo mayor
La mayoría de los equipos encadenan este endpoint detrás de un programador de tareas: disparan un lote de URLs por cron, dejan que cada tarea llegue a un webhook y alimentan el JSON directo a una base de datos, hoja de cálculo o regla de alerta sin que nadie abra la página de origen. Como el precio es una base fija por solicitud más una pequeña tarifa por URL, escala de forma predecible ya sea que vigile cinco precios de la competencia o cinco mil referencias de producto.
Qué puede hacer con ella
Monitoreo de precios de la competencia
Rastree los selectores .price y .stock-status en un conjunto de páginas de producto rivales cada día y alimente el JSON a un panel de precios.
Agregación de anuncios inmobiliarios
Extraiga dirección, precio, metros cuadrados y número de fotos de un sitio de listados usando un único mapa de selectores reutilizado en miles de páginas.
Vigilancia de bolsas de empleo
Extraiga los selectores de título, empresa y fecha de publicación de una página de vacantes cada mañana para detectar nuevas ofertas antes de que exista un feed público.
Recolección de datos en tablas
Apunte a un selector de fila de tabla para convertir una tabla HTML de tipos de cambio o especificaciones en un arreglo JSON que su aplicación puede indexar directamente.
Preguntas frecuentes
¿La api de web scraping es gratis para probar?
No hay capa gratuita: las capas gratis se abusan y ralentizan a todos. El acceso funciona con un saldo prepago de ForHosting KIT: se recarga desde $10.00 (no caduca) y cada solicitud se cobra a su precio publicado, así que una llamada sin saldo devuelve HTTP 402. Sin suscripción, sin tokens ni créditos inventados, y una tarea fallida no se cobra.
¿Cuánto cuesta web.scrape_selector?
$0.040 por solicitud más $0.001 por URL procesada, y solo se cobra cuando la tarea realmente se completa.
¿Funciona con páginas renderizadas en JavaScript?
Sí, la capa de descarga renderiza la página antes de aplicar sus selectores CSS, así que el contenido inyectado por scripts del cliente se puede seleccionar igual que el HTML estático.
¿Qué pasa si mi selector no coincide con nada?
Ese campo vuelve como null en la respuesta en lugar de hacer fallar toda la tarea, así que un selector roto dentro del mapa no bloquea el resto de sus datos.
¿Puedo extraer varias URLs con un solo mapa de selectores?
Sí, envíe una lista de URLs junto con un único mapa de selectores cuando las páginas comparten el mismo diseño, que es la forma más eficiente de usar este endpoint.
¿Cómo recibo los resultados?
Por envío a su webhook firmado cuando la tarea termina, o mediante un enlace firmado válido por 24 horas si prefiere consultarlo usted mismo.
¿Qué pasa si un scraping falla?
Los intentos fallidos se reintentan automáticamente hasta tres veces; si aun así falla recibe un error claro y nunca se le cobra esa tarea.
¿En qué se diferencia de los endpoints de scraping con IA o con esquema?
El scraping por selectores es la opción más rápida y económica cuando ya conoce la ruta CSS exacta de cada campo; los endpoints con IA y con esquema existen para cuando el diseño varía o necesita tipos de dato garantizados.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, y pronto desde nuestra app, el email y Telegram.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/web/scrape-selector \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://ejemplo.com","selectors":{"titulo":"h1","precio":".price"}}'const res = await fetch("https://api.kit.forhosting.com/web/scrape-selector", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"url": "https://ejemplo.com",
"selectors": {
"titulo": "h1",
"precio": ".price"
}
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/scrape-selector",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"url": "https://ejemplo.com",
"selectors": {
"titulo": "h1",
"precio": ".price"
}
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/scrape-selector", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"url":"https://ejemplo.com","selectors":{"titulo":"h1","precio":".price"}}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"url":"https://ejemplo.com","selectors":{"titulo":"h1","precio":".price"}}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/scrape-selector", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"url": "https://ejemplo.com",
"selectors": {
"titulo": "h1",
"precio": ".price"
}
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.scrape_selector",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
timeout_sec | 30 |
max_crawl_pages | 25 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |
422 | task_failed | La tarea falló tras 3 reintentos. No se cobra. |