Cloudflare Crawl API: Tutorial Avanzado de Web Scraping

Angela Sofía Osorio

SofiDev Angela Sofía

Tiempo de lectura 3 minutes

Fecha de publicación

Manejar clústeres de Puppeteer es el castigo moderno para los desarrolladores. Consumes toda la RAM del servidor, te bloquean los firewalls y terminas frustrado frente a un CAPTCHA insoluble.

Cloudflare ha decidido que ya sufrimos suficiente. Su nuevo endpoint /crawl, parte de la suite Browser Rendering, permite delegar todo ese infierno a su infraestructura global. Pasas una URL y recibes datos limpios, sin lidiar con navegadores fantasma.

Requisitos Previos para el Despliegue

Antes de lanzar peticiones al vacío, necesitas configurar el terreno. Olvida las dependencias pesadas; aquí solo necesitamos un entorno moderno de ejecución.

Asegúrate de tener una cuenta activa de Cloudflare y un token de API con permisos específicos de Cloudflare Workers y Browser Rendering. Sí, la comodidad industrial requiere configuración inicial.

Construyendo el Scraper Paso a Paso

Vamos a implementar una solución en TypeScript. Aquí te dejo la documentación de dónde nos basamos: https://developers.cloudflare.com/browser-rendering/rest-api/crawl-endpoint/

El objetivo es crear un cliente robusto que se comunique con la API, maneje la autenticación y extraiga exactamente los nodos de información que nos interesan.

Paso 1: Configuración de Tipos y Entorno

Primero definimos las interfaces. Esto asegura que sabemos exactamente qué esperar de la respuesta de Cloudflare y evita caídas silenciosas en producción.

// Tipado estricto para la respuesta de Cloudflare
interface CrawlResponse {
  success: boolean;
  errors: string[];
  result: {
    url: string;
    text?: string;
    links?: string[];
  };
}

const ACCOUNT_ID = process.env.CLOUDFLARE_ACCOUNT_ID;
const API_TOKEN = process.env.CLOUDFLARE_API_TOKEN;
TypeScript

Paso 2: El Motor de Extracción

Aquí ocurre el milagro de la delegación. La API renderiza el JavaScript del lado del cliente, espera la actividad de red y empaqueta el resultado final. Todo esto ocurre en el borde de la red (edge).

Creamos una función asíncrona que configura las cabeceras de autorización y define los parámetros del rastreo.

async function extractSiteData(targetUrl: string, depthLevel = 0): Promise<void> {
  const endpoint = `https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/browser-rendering/crawl`;

  const payload = {
    url: targetUrl,
    scrapers: ["text", "links"], // Solo pedimos el texto puro y los enlaces
    depth: depthLevel // 0 = solo la página actual. Cuidado con subir este número.
  };

  try {
    const response = await fetch(endpoint, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${API_TOKEN}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(payload)
    });

    const data: CrawlResponse = await response.json();
    processResult(data);

  } catch (error) {
    console.error('Fallo crítico en la red:', error);
  }
}
TypeScript

Paso 3: Procesamiento de la Respuesta

El endpoint devuelve la información estructurada. Solo queda extraer los datos y enviarlos a tu base de datos o sistema de análisis.

function processResult(data: CrawlResponse): void {
  if (!data.success) {
    console.error('Cloudflare rechazó la petición. Motivos:', data.errors);
    return;
  }

  console.log(`Extracción exitosa para: ${data.result.url}`);
  console.log(`Total de enlaces encontrados: ${data.result.links?.length || 0}`);
  
  // Aquí enviarías el data.result.text a tu base de datos vectorial o LLM
}

// Ejecución del script
extractSiteData('https://blog.cloudflare.com');
TypeScript

Optimizando el Costo y Rendimiento

El parámetro depth es tu mejor amigo y tu peor enemigo. Si lo dejas en cero, extraes la vista actual. Si lo subes a dos o tres sin control, terminarás intentando descargar medio internet y arruinando la cuota de tu API.

Además, especifica siempre el array scrapers. No pidas imágenes si solo vas a alimentar un modelo de lenguaje de texto. La eficiencia en la petición reduce el tiempo de cómputo en los servidores de Cloudflare y acelera tu respuesta.

Automatizar la extracción de datos nunca fue tan aséptico. Atrás quedaron los días de lidiar con Chromium en contenedores Docker inestables. ¿Qué infraestructura de scraping planeas reemplazar con este nuevo endpoint? Deja tu análisis en los comentarios o comparte tus métricas de rendimiento.