CrawlForge
Guía avanzada

Técnicas de Scraping Avanzado

Domine escenarios de scraping complejos que incluyen contenido dinámico, páginas protegidas por autenticación, renderizado de JavaScript y gestión de AJAX con CrawlForge MCP.

Contenido dinámico y JavaScript
Autenticación y sesiones
AJAX y scroll infinito
Gestión de límites de tasa

1. Contenido dinámico y JavaScript

Muchos sitios web modernos renderizan el contenido con JavaScript después de la carga inicial de la página. Use scrape_with_actions para esperar a los elementos dinámicos.

Cuándo usar la automatización del navegador
Aplicaciones de página única (SPA): aplicaciones de React, Vue o Angular que cargan datos de forma asíncrona
Carga diferida
Imágenes, videos o contenido que se carga al desplazarse
Elementos interactivos
Menús desplegables, ventanas modales o pestañas que revelan contenido
HTML estático
Use fetch_url en su lugar (5 veces más económico)

Ejemplo: scraping de una SPA de React

5 credits

Bash
curl -X POST https://crawlforge.dev/api/v1/tools/scrape_with_actions \
  -H "X-API-Key: cf_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://spa-example.com/products",
    "actions": [
      {
        "type": "wait",
        "selector": ".product-card",
        "timeout": 5000
      },
      {
        "type": "scroll",
        "direction": "down",
        "amount": 1000
      },
      {
        "type": "wait",
        "duration": 2000
      },
      {
        "type": "extract",
        "selectors": {
          "title": "h1.product-title",
          "price": "span.price",
          "description": "div.product-description"
        }
      }
    ]
  }'
Consejo profesional: Pruebe siempre fetch_url primero. Muchas SPA prerrenderizan el contenido en el HTML inicial o exponen endpoints de API que puede llamar directamente.

2. Autenticación y sesiones

Haga scraping de páginas detrás de formularios de inicio de sesión o de autenticación de API usando cookies, encabezados o el envío automatizado de formularios.

Estrategia 1: autenticación con cookies

Ideal para sitios en los que puede obtener las cookies de sesión manualmente

Bash
curl -X POST https://crawlforge.dev/api/v1/tools/fetch_url \
  -H "X-API-Key: cf_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/dashboard",
    "headers": {
      "Cookie": "session_id=abc123; user_token=xyz789"
    }
  }'

Estrategia 2: inicio de sesión automatizado con formularios

Automatice todo el proceso de inicio de sesión con form_submit

Bash
curl -X POST https://crawlforge.dev/api/v1/tools/form_submit \
  -H "X-API-Key: cf_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/login",
    "fields": {
      "email": "user@example.com",
      "password": "secure_password"
    },
    "submitButton": "button[type=submit]",
    "waitForNavigation": true
  }'
Nota de seguridad: Nunca incluya credenciales directamente en el código. Use variables de entorno y rótelas con regularidad. Considere usar OAuth o tokens de API cuando estén disponibles.

3. AJAX y scroll infinito

Capture contenido que se carga al desplazarse o al hacer clic en los botones de "Cargar más".

Ejemplo de scroll infinito

5 credits

Typescript
const response = await fetch('https://crawlforge.dev/api/v1/tools/scrape_with_actions', {
  method: 'POST',
  headers: {
    'X-API-Key': process.env.CRAWLFORGE_API_KEY!,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    url: 'https://social-media.com/feed',
    actions: [
      // Scroll to load more content (repeat 5 times)
      { type: 'scroll', direction: 'down', amount: 1000 },
      { type: 'wait', duration: 1000 },
      { type: 'scroll', direction: 'down', amount: 1000 },
      { type: 'wait', duration: 1000 },
      { type: 'scroll', direction: 'down', amount: 1000 },
      { type: 'wait', duration: 1000 },
      { type: 'scroll', direction: 'down', amount: 1000 },
      { type: 'wait', duration: 1000 },
      { type: 'scroll', direction: 'down', amount: 1000 },
      { type: 'wait', duration: 1000 },
      // Extract all posts
      {
        type: 'extract',
        selectors: {
          posts: {
            selector: 'article.post',
            multiple: true,
            fields: {
              text: '.post-content',
              author: '.author-name',
              timestamp: 'time'
            }
          }
        }
      }
    ]
  }),
});

const data = await response.json();
console.log(`Loaded ${data.data.extracted.posts.length} posts`);

4. Gestión de límites de tasa

Implemente retroceso exponencial y lógica de reintentos cuando reciba respuestas 429.

Ejemplo de lógica de reintentos

Typescript
async function scrapeWithRetry(url: string, maxRetries = 3) {
  let retries = 0;
  let delay = 1000; // Start with 1 second

  while (retries < maxRetries) {
    try {
      const response = await fetch('https://crawlforge.dev/api/v1/tools/fetch_url', {
        method: 'POST',
        headers: {
          'X-API-Key': process.env.CRAWLFORGE_API_KEY!,
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({ url }),
      });

      if (response.status === 429) {
        // Rate limited - wait and retry
        console.log(`Rate limited. Waiting ${delay}ms before retry...`);
        await new Promise(resolve => setTimeout(resolve, delay));
        delay *= 2; // Exponential backoff
        retries++;
        continue;
      }

      if (!response.ok) {
        throw new Error(`HTTP ${response.status}: ${response.statusText}`);
      }

      return await response.json();
    } catch (error) {
      if (retries === maxRetries - 1) throw error;
      retries++;
      await new Promise(resolve => setTimeout(resolve, delay));
      delay *= 2;
    }
  }

  throw new Error('Max retries exceeded');
}

// Usage
const data = await scrapeWithRetry('https://example.com');
Próximos pasos
Continúe su recorrido de aprendizaje con más guías avanzadas
Procesamiento por lotes →
Escale a miles de URL
Técnicas de sigilo →
Evada los sistemas anti-bots