~/utility/rag-web-crawler

RAG Web Crawler — Páginas web a Markdown y fragmentos de texto

Rastrea páginas web públicas y obtén Markdown limpio, texto plano y fragmentos solapados con URL de origen y posiciones de caracteres, listos para RAG.

datos para RAG TypeScriptMozilla ReadabilityjsdomTurndown Global
proooxy/rag-web-crawler — spec
categoríautility / datos para RAG
lenguajeTypeScript
stackTypeScript, Mozilla Readability, jsdom, Turndown
mercadosGlobal
salidaJSON limpio y listo para RAG

características clave

Markdown limpio y texto plano de cada página, con encabezados, listas, enlaces, bloques de código y tablas sencillas

Fragmentos listos para embeddings que se solapan y terminan en saltos de párrafo o de oración, cada uno con un id estable, su URL y título de origen y posiciones exactas de caracteres para citar

Primero el contenido principal: se omiten menús, cabeceras, pies de página y barras laterales, y los selectores CSS quitan cualquier otra cosa que indiques

Sigue enlaces dentro de cada sitio, hasta cinco niveles, y descarga cada página una sola vez

Búsqueda en lugar de URL: cada página de resultados de una consulta se rastrea como una URL inicial (requiere un plan de pago de Apify)

Respeta robots.txt por defecto, con pausas prudentes entre solicitudes al mismo sitio

Las páginas conservan su idioma — inglés, chino y otros — sin traducción

Un estado y un código de error para cada página, y un resumen de cada ejecución con recuentos y el motivo de parada

casos de uso

  • Crear la base de conocimiento de un chatbot RAG a partir de documentación y páginas de ayuda
  • Dar a agentes de IA páginas web actuales que puedan citar
  • Convertir una lista de artículos en embeddings para búsqueda semántica
  • Reunir las páginas que encuentra una búsqueda sobre un tema, en su idioma original
  • Actualizar una base vectorial de forma programada, con ids de fragmento que no cambian mientras la página no cambie
  • Dar a agentes de IA páginas web en Markdown a través del servidor MCP de Apify

parámetros de entrada

ParámetroTipoObligatorioDescripción
startUrlsarrayopcionalURL de páginas públicas para rastrear, hasta 1.000
querystringopcionalConsulta de búsqueda cuyas páginas de resultados se rastrean (requiere un plan de pago de Apify)
queriesarrayopcionalMás consultas de búsqueda, combinadas con query
maxResultsPerQuerynumberopcionalResultados de búsqueda que se rastrean por consulta (por defecto 5, como máximo 50)
maxPagesnumberopcionalMáximo de páginas distintas que programa una ejecución (por defecto 20, como máximo 1.000)
maxDepthnumberopcionalCuántos niveles de enlaces seguir dentro de cada sitio (por defecto 0 = solo las URL iniciales, como máximo 5)
maxConcurrencynumberopcionalPáginas procesadas a la vez (por defecto 3)
maxSearchRequestsnumberopcionalSolicitudes de búsqueda por ejecución, reintentos incluidos (por defecto 10, 0 = sin búsqueda)
maxFetchRequestsnumberopcionalTodos los intentos de red por ejecución, robots.txt y reintentos incluidos (por defecto 100)
requestTimeoutSecsnumberopcionalTiempo de espera de cada solicitud, en segundos (por defecto 30)
maxResponseBytesnumberopcionalRespuesta de página más grande que se acepta (por defecto 2 MiB)
maxContentCharsnumberopcionalTexto más largo que se conserva por página, en caracteres (por defecto 50.000)
maxOutputBytesnumberopcionalSalida total por ejecución (por defecto 20 MiB)
respectRobotsTxtbooleanopcionalConsultar antes el robots.txt de cada sitio (activado por defecto)
onlyMainContentbooleanopcionalConservar solo el contenido principal de la página (activado por defecto)
removeSelectorsarrayopcionalSelectores CSS de los elementos que se quitan antes de extraer
chunkSizenumberopcionalLongitud del fragmento en caracteres, no en tokens (por defecto 1.000)
chunkOverlapnumberopcionalCaracteres que comparten fragmentos consecutivos (por defecto 150)

Ejemplo de salida

Una página guardada en una ejecución real, con el texto acortado y uno de sus cinco fragmentos:

 1{
 2  "schemaVersion": "1.0",
 3  "url": "https://www.w3.org/WAI/tutorials/tables/one-header/",
 4  "title": "Tables with One Header",
 5  "description": "Accessibility resources free online from the international standards organization: W3C Web Accessibility Initiative (WAI).",
 6  "languageCode": "en",
 7  "canonicalUrl": "https://www.w3.org/WAI/tutorials/tables/one-header/",
 8  "markdown": "# Tables with One Header\n\nin [Tables Tutorial](https://www.w3.org/WAI/tutorials/tables/)\n\n## Overview\n\n…",
 9  "text": "Tables with One Header\n\nin Tables Tutorial\n\nOverview\n\nThis page covers tables that have one simple header for rows or one simple header for columns. …",
10  "chunks": [
11    {
12      "id": "495cb4e58e13bbf9b5cdbe922f7ea652973ca4dfda61b952aaa021db045a450c",
13      "index": 0,
14      "text": "Tables with One Header\n\nin Tables Tutorial\n\nOverview\n\nThis page covers tables that have one simple header for rows or one simple header for columns. …",
15      "startChar": 0,
16      "endChar": 988,
17      "sourceUrl": "https://www.w3.org/WAI/tutorials/tables/one-header/",
18      "title": "Tables with One Header"
19    }
20  ],
21  "contentTruncated": false,
22  "sources": [],
23  "crawl": {
24    "depth": 0,
25    "httpStatusCode": 200,
26    "loadedAt": "2026-10-19T07:03:53.643Z",
27    "contentType": "text/html",
28    "renderingMode": "http",
29    "extractionMethod": "main"
30  }
31}

Las posiciones de los fragmentos cuentan puntos de código Unicode en text. Cada ejecución escribe además REQUESTS, un resultado por página con su estado y código de error, y OUTPUT, el resumen de la ejecución con recuentos, el motivo de parada y los eventos cobrados.

Consejos

  • Usa id como ID de registro en tu base vectorial. No cambia entre ejecuciones mientras la página y tu configuración de fragmentos no cambien, así que al escribir los fragmentos por id en una ejecución programada se reemplazan en lugar de duplicarse.
  • Empieza con pocas páginas. Revisa el Markdown de tus páginas antes de subir maxPages o maxDepth, y quita restos como cajas de enlaces relacionados con removeSelectors.
  • Lee REQUESTS junto con el Dataset. Una ejecución puede terminar bien aunque algunas páginas se hayan omitido o hayan fallado, y cada una indica por qué.

faq

¿En qué se diferencia de un scraper web genérico?
Le das URL o una consulta de búsqueda, no selectores. Guarda el contenido principal de cada página como Markdown y texto plano y corta el texto en fragmentos listos para embeddings, cada uno con la URL, el título y las posiciones exactas de caracteres de la página, para que una respuesta pueda citar de dónde viene.
¿Necesito una clave de API?
Ninguna clave de API externa, ni para rastrear ni para buscar. Necesitas una cuenta de Apify; para llamar al Actor mediante la API de Apify se usa tu token de Apify.
¿Renderiza JavaScript?
No. Lee las páginas por HTTP, así que una página que necesita JavaScript para mostrar su texto puede fallar con NO_CONTENT o llegar incompleta. Prueba antes con algunas de tus páginas.
¿Qué páginas puede leer?
Páginas públicas en HTML, Markdown y texto plano. Inicios de sesión, cookies, muros de pago, CAPTCHA, proxies, PDF e imágenes quedan fuera de su alcance, y se rechazan las direcciones de redes privadas y las URL que llevan credenciales.
¿Está permitido rastrear sitios web?
Rastrear datos públicos y no personales suele ser legal, pero el contenido de las páginas a menudo tiene derechos de autor y algunos sitios restringen el rastreo en sus condiciones. El crawler respeta robots.txt por defecto; tú eres responsable del uso que hagas de lo que recopiles.

relacionado en ~/utility

Ejecuta RAG Web Crawler — Páginas web a Markdown y fragmentos de texto, o consigue un desarrollo a medida

Empieza a extraer datos en Apify en minutos, o contrátame para construir un scraper a medida y un pipeline de datos RAG para tu fuente y esquema exactos.

ejecutar en Apify obtener datos a medida