> ## Documentation Index
> Fetch the complete documentation index at: https://student-213fb9fc.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Modo avanzado

> Usa proxies mejorados para realizar scraping fiable en sitios complejos manteniendo la privacidad

Firecrawl ofrece distintos tipos de proxy para ayudarte a hacer scraping de sitios web con diferentes niveles de complejidad. El tipo de proxy se puede especificar mediante el parámetro `proxy`.

<div id="proxy-types">
  ### Tipos de proxy
</div>

Firecrawl admite tres tipos de proxies:

* **basic**: Proxies para hacer scraping de la mayoría de los sitios web. Rápidos y que suelen funcionar.
* **enhanced**: Proxies avanzados para hacer scraping de sitios web complejos manteniendo la privacidad. Más lentos, pero más fiables en ciertos sitios.
* **auto**: Firecrawl reintentará automáticamente el scraping con proxies enhanced si el proxy basic falla. Si el reintento con enhanced tiene éxito, se cobrarán 5 créditos por el scraping. Si el primer intento con basic tiene éxito, solo se cobrará el coste estándar.

Si no especificas un proxy, Firecrawl usará auto de forma predeterminada.

<div id="using-enhanced-mode">
  ### Uso del modo mejorado
</div>

Al extraer datos de sitios web complejos, puedes usar el modo mejorado para mejorar tu tasa de éxito mientras mantienes la privacidad.

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

  firecrawl = Firecrawl(api_key='fc-YOUR-API-KEY')

  # Elige la estrategia de proxy: 'basic' | 'enhanced' | 'auto'
  doc = firecrawl.scrape('https://example.com', formats=['markdown'], proxy='auto')

  print(doc.warning or 'ok')
  ```

  ```js Node theme={null}
  import Firecrawl from '@mendable/firecrawl-js';

  const firecrawl = new Firecrawl({ apiKey: "fc-TU-API-KEY" });

  // Choose proxy strategy: 'basic' | 'enhanced' | 'auto'
  const doc = await firecrawl.scrape('https://example.com', {
    formats: ['markdown'],
    proxy: 'auto'
  });

  console.log(doc.warning || 'ok');
  ```

  ```bash cURL theme={null}

  // Elige la estrategia de proxy: 'basic' | 'enhanced' | 'auto'
  curl -X POST https://api.firecrawl.dev/v2/scrape \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer fc-YOUR-API-KEY' \
      -d '{
        "url": "https://example.com",
        "proxy": "auto"
      }'

  ```
</CodeGroup>

**Nota:** Las solicitudes con proxy mejorado cuestan 5 créditos por solicitud cuando se usan.

<div id="using-enhanced-as-a-retry-mechanism">
  ## Usar Enhanced como mecanismo de reintento
</div>

Un patrón común es intentar primero el scraping con la configuración de proxy predeterminada y luego reintentar con el modo enhanced si encuentras códigos de estado de error específicos (401, 403 o 500) en el campo `metadata.statusCode` de la respuesta. Estos códigos de estado pueden indicar que el sitio web está bloqueando tu solicitud.

<CodeGroup>
  ```python Python theme={null}
  # pip install firecrawl-py

  from firecrawl import Firecrawl

  firecrawl = Firecrawl(api_key="YOUR_API_KEY")

  # First try with basic proxy
  try:
      content = firecrawl.scrape("https://example.com")
      
      # Check if we got an error status code
      status_code = content.get("metadata", {}).get("statusCode")
      if status_code in [401, 403, 500]:
          print(f"Se obtuvo el código de estado {status_code}, reintentando con proxy enhanced")
          # Retry with enhanced proxy
          content = firecrawl.scrape("https://example.com", proxy="enhanced")
      
      print(content["markdown"])
  except Exception as e:
      print(f"Error: {e}")
      # Retry with enhanced proxy on exception
      try:
          content = firecrawl.scrape("https://example.com", proxy="enhanced")
          print(content["markdown"])
      except Exception as e:
          print(f"Enhanced proxy also failed: {e}")
  ```

  ```js Node theme={null}
  // npm install @mendable/firecrawl-js

  import { Firecrawl } from '@mendable/firecrawl-js';

  const firecrawl = new Firecrawl({ apiKey: 'YOUR_API_KEY' });

  // Function to scrape with retry logic
  async function scrapeWithRetry(url) {
    try {
      // First try with default proxy
      const content = await firecrawl.scrape(url);
      
      // Check if we got an error status code
      const statusCode = content?.metadata?.statusCode;
      if ([401, 403, 500].includes(statusCode)) {
        console.log(`Se obtuvo el código de estado ${statusCode}; reintentando con el proxy enhanced`);
        // Retry with enhanced proxy
        return await firecrawl.scrape(url, {
          proxy: 'enhanced'
        });
      }
      
      return content;
    } catch (error) {
      console.error(`Error: ${error.message}`);
      // Retry with enhanced proxy on exception
      try {
        return await firecrawl.scrape(url, {
          proxy: 'enhanced'
        });
      } catch (retryError) {
        console.error(`Enhanced proxy also failed: ${retryError.message}`);
        throw retryError;
      }
    }
  }

  // Usage
  const content = await scrapeWithRetry('https://example.com');
  console.log(content.markdown);
  ```

  ```bash cURL theme={null}
  # First try with default proxy
  RESPONSE=$(curl -s -X POST https://api.firecrawl.dev/v2/scrape \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer YOUR_API_KEY' \
      -d '{
        "url": "https://example.com"
      }')

  # Extract status code from response
  STATUS_CODE=$(echo $RESPONSE | jq -r '.data.metadata.statusCode')

  # Check if status code indicates we should retry with enhanced
  if [[ "$STATUS_CODE" == "401" || "$STATUS_CODE" == "403" || "$STATUS_CODE" == "500" ]]; then
      echo "Se obtuvo el código de estado $STATUS_CODE; reintentando con el proxy enhanced"
      
      # Retry with enhanced proxy
      curl -X POST https://api.firecrawl.dev/v2/scrape \
          -H 'Content-Type: application/json' \
          -H 'Authorization: Bearer YOUR_API_KEY' \
          -d '{
            "url": "https://example.com",
            "proxy": "enhanced"
          }'
  else
      # Output the original response
      echo $RESPONSE
  fi
  ```
</CodeGroup>

Este enfoque te permite optimizar el uso de tus créditos usando el modo enhanced solo cuando sea necesario.
