Cómo reducir la detección al hacer scraping: una guía completa

Una guía integral de múltiples capas para evitar la detección cuando se raspa web — cubriendo la rotación IP, encabezados HTTP, huellas TLS, huellas digitales del navegador, patrones conductuales y gestión de sesión.

Cómo reducir la detección al hacer scraping: una guía completa

Por qué ocurre la detección

La detección de chatarra web es un proceso multicapa. Los sistemas antibot no dependen de una sola señal: combinan la reputación IP, los encabezados HTTP, huellas dactilares TLS, huellas dactilares del navegador, y análisis conductual para calcular una puntuación de riesgo. Cuando esa puntuación supera un umbral, se bloquea, se sirve un CAPTCHA o se alimentan datos engañosos.

Esta guía ofrece un enfoque integral para reducir la detección en todas las capas. Para una visión general de cómo funcionan estos sistemas, vea nuestro artículo principal sobre cómo los sistemas antibot detectan proxies.

Capa 1: IP Reputación y Selección Proxy

Su dirección IP es lo primero que ve un servidor. Los sistemas antibot mantienen bases de datos que marcan direcciones IP por tipo, historia y comportamiento.

Selección de Tipo Proxy

Selección de Tipo Proxy
Tipo ProxyRiesgo de detecciónMejor
ResidencialBajaLa mayoría de tareas de raspado, sitios protegidos
ISP (Static Residential)Low-MediumSesiones largas, cuentas
DatacenterAltoSitios desprotegidos, tareas de alto volumen
MóvilMuy bajoLugares de protección más altos, redes sociales

Para la mayoría de proyectos de desguace, Los proxies residenciales de ProxyHat ofrecer el mejor equilibrio de bajo riesgo de detección y eficiencia de costes. Vea nuestro detallado comparación de tipo proxy para orientación.

IP Rotation Strategy

# Python: Rotating proxy per request using ProxyHat
import requests
proxy_url = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
proxies = {
    "http": proxy_url,
    "https": proxy_url
}
# Each request through the gateway gets a different IP
for url in urls_to_scrape:
    response = requests.get(url, proxies=proxies, timeout=30)
    process(response)
  • Rotación por solicitud para enumerar páginas y resultados de búsqueda.
  • Use sesiones pegajosas para flujos multipágina (paginación, secuencias de inicio de sesión).
  • Geo-target your IPs para que coincida con el público esperado del sitio Ubicación de ProxyHat.

Capa 2: Cabeceras HTTP

Los encabezados HTTP incorrectos o desaparecidos son una de las señales más fáciles para detectar sistemas antibots. Un navegador real envía 15-20 encabezados en un orden específico; un script Python predeterminado envía 3-4.

Cabeceras esenciales

# Python: Realistic header set
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br, zstd",
    "Cache-Control": "max-age=0",
    "Sec-Ch-Ua": '"Chromium";v="131", "Not_A Brand";v="24"',
    "Sec-Ch-Ua-Mobile": "?0",
    "Sec-Ch-Ua-Platform": '"Windows"',
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",
    "Upgrade-Insecure-Requests": "1",
    "Connection": "keep-alive"
}
response = requests.get(url, headers=headers, proxies=proxies)

Header Consistency Rules

  • Match Sec-Ch-Ua with User-Agent: Si usted reclama Chrome 131, su Sec-Ch-Ua debe referencia la versión 131.
  • Incluye todos los encabezados Sec-Fetch: Chrome moderno envía estos en cada navegación. Perderlos es una señal fuerte.
  • Establecer el lenguaje Aceptable para que coincida con su geo proxy: Un proxy estadounidense con Accept-Language: ja-JP es sospechoso.
  • Mantener orden de cabecera: Algunos sistemas anti-bot controlan el encabezado ordenando. Use bibliotecas que preserven el orden de inserción.

Capa 3: TLS y HTTP/2

Su biblioteca de clientes HTTP produce un único TLS huella dactilar que los sistemas anti-bot controlan contra su agente de usuario reclamado. Un agente de usuario de Chrome con una huella dactilar Python TLS es inmediatamente marcado.

Mitigation by Language

Mitigation by Language
IdiomaBiblioteca por defectoRiesgo de detecciónBrowser-Grade Alternative
Pythonpeticiones/urllib3Muy altacurl cffi con impersonate
Node.jsaxios/gotAltoTengo...
Vamos.net/httpMuy altauTLS + transporte personalizado
# Python: Browser-grade TLS with curl_cffi
from curl_cffi import requests as curl_requests
response = curl_requests.get(
    "https://example.com",
    impersonate="chrome",
    proxies={
        "http": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080",
        "https": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
    }
)

Capa 4: Etiqueta del navegador

Si usted está usando un navegador sin cabeza, anti-bot JavaScript sondea su huella del navegador — Canvas, WebGL, AudioContext, propiedades del navegador. El principio fundamental es la coherencia interna:

  • Todas las señales de huella deben estar de acuerdo.
  • La huella dactilar debe coincidir con sus afirmaciones de usuario-agente
  • La huella debe cambiar cuando usted gira proxies

Configuración de Stealth

// Node.js: Puppeteer with stealth and proxy
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
const browser = await puppeteer.launch({
  headless: 'new',
  args: [
    '--proxy-server=http://gate.proxyhat.com:8080',
    '--disable-blink-features=AutomationControlled',
    '--window-size=1920,1080'
  ]
});
const page = await browser.newPage();
await page.authenticate({
  username: 'USERNAME',
  password: 'PASSWORD'
});
await page.setViewport({ width: 1920, height: 1080 });

Capa 5: Patrones conductuales

Incluso con la imitación técnica perfecta, patrones de comportamiento similares a bot activará la detección. Los sistemas antibot analizan el tiempo, los patrones de navegación y las firmas de interacción.

Solicitud de tiempo

  • Añada retrasos aleatorios: Los humanos no hacen solicitudes a intervalos exactos. Añadir 1-5 segundos de retraso aleatorio entre solicitudes.
  • Vary delays by page type: Las páginas de contenido merecen más pausas de "lectura" que las páginas de lista.
  • Evite los patrones de explosión: No haga 50 solicitudes rápidas después de pausa. Distribuir solicitudes uniformemente con varianza natural.
# Python: Natural request timing
import time
import random
def scrape_with_natural_timing(urls, proxies):
    for url in urls:
        response = requests.get(url, proxies=proxies, headers=headers)
        process(response)
        # Random delay: 1-4 seconds with normal distribution
        delay = max(0.5, random.gauss(2.5, 0.8))
        time.sleep(delay)

Patrones de navegación

  • Seguir los caminos naturales: Visita la página principal primero, luego páginas de categoría, luego páginas de detalle — no salta directamente a URL profundas.
  • Establecer los encabezados de referencia adecuados: Cada página debe hacer referencia a la página anterior como referencia.
  • Handle redirige: Siga HTTP redirige naturalmente en lugar de reintentar la URL original.

Gestión del período de sesiones

  • Mantener tarros de galletas: Aceptar y devolver las cookies dentro de una sesión: descartar todas las cookies es una señal de bot.
  • Duración limitada del período de sesiones: Después de 50-100 solicitudes, inicie una nueva sesión con una nueva IP y cookies.
  • Limitaciones de la tasa de respeto: Si recibe 429 respuestas, retroceda exponencialmente en lugar de reintentar inmediatamente.

Capa 6: Validación de la respuesta

La detección no siempre resulta en un bloque. Los sitios pueden servir diferentes contenidos, inyectar datos engañosos o devolver bloques blandos. Siempre valide sus respuestas:

  • Compruebe los códigos de estado: 200 no siempre significa éxito: algunos sitios devuelven 200 con páginas CAPTCHA o contenido vacío.
  • Estructura de contenido validada: Asegurar que la respuesta contenga elementos esperados (precios del producto, texto del artículo, etc.).
  • Monitor for honeypots: Enlaces o campos de forma ocultos diseñados para atrapar rastreadores automatizados.
  • Tasas de éxito de seguimiento: Si su tasa de éxito disminuye por debajo del 90%, algo ha cambiado y necesita investigación.

Lista completa de verificación antidetección

Lista completa de verificación antidetección
LayerMedidaPrioridad
IPUse proxies residenciales con geo-targetingCrítica
IPRotar IPs por solicitud o sesiónCrítica
HeadersEnviar conjuntos completos y realistasCrítica
HeadersMatch Accept-Language to proxy locationAlto
TLSUtilice la biblioteca TLS de grado navegadorCrítica
TLSMatch TLS huella dactilar para el navegador reclamadoCrítica
NavegadorUtilice plugins de sigilo para navegadores sin cabezaAlto
NavegadorMantener perfiles de huellas dactilares consistentesAlto
ComportamientoAgregar retrasos aleatorios entre solicitudesAlto
ComportamientoSiga las rutas de navegación naturalesMediana
ComportamientoMantener las cookies en las sesionesMediana
ValidaciónComprobar contenido de respuesta, no sólo códigos de estadoAlto

Ejemplo: Full Anti-Detection Scraper

# Python: Complete anti-detection scraper setup
from curl_cffi import requests as curl_requests
import time
import random
class StealthScraper:
    def __init__(self, proxy_user, proxy_pass):
        self.proxy = f"http://{proxy_user}:{proxy_pass}@gate.proxyhat.com:8080"
        self.session = curl_requests.Session(impersonate="chrome")
        self.session.proxies = {
            "http": self.proxy,
            "https": self.proxy
        }
        self.request_count = 0
    def get(self, url, referer=None):
        headers = {}
        if referer:
            headers["Referer"] = referer
        response = self.session.get(url, headers=headers, timeout=30)
        self.request_count += 1
        # Rotate session every 50-80 requests
        if self.request_count >= random.randint(50, 80):
            self._rotate_session()
        # Natural delay
        time.sleep(max(0.5, random.gauss(2.0, 0.6)))
        return response
    def _rotate_session(self):
        self.session = curl_requests.Session(impersonate="chrome")
        self.session.proxies = {
            "http": self.proxy,
            "https": self.proxy
        }
        self.request_count = 0
# Usage
scraper = StealthScraper("USERNAME", "PASSWORD")
home = scraper.get("https://example.com")
listing = scraper.get("https://example.com/products", referer="https://example.com")
detail = scraper.get("https://example.com/products/123", referer="https://example.com/products")

Cuándo escalar su enfoque

Comience con el enfoque más simple y escalar sólo cuando sea necesario:

  1. Nivel 1 - HTTP cliente + encabezados + proxy: Trabaja para la mayoría de los sitios. Uso curl_cffi o got-scraping con ProxyHat proxies.
  2. Nivel 2 — Añadir TLS de grado navegador: Se requiere cuando el sitio comprueba las huellas dactilares JA3/JA4.
  3. Nivel 3 - Navegador sin cabeza + sigilo: Necesario para contenido de JavaScript y sofisticados sistemas antibots.
  4. Nivel 4 — Automatización completa del navegador con la micrometría conductual: Reservado para los sitios más protegidos (Cloudflare Enterprise, PerimeterX, etc.).

Para las pautas de implementación en idiomas específicos, consulte nuestras guías: Python, Node.js, y Vamos..

Directrices éticas

Las técnicas antidetección son herramientas, su uso ético depende del contexto. Siempre:

  • Respetar robots.txt y términos de servicio
  • Scrape sólo datos disponibles públicamente
  • Limite las tarifas de solicitud para evitar el impacto del servidor
  • Cumplir las normas de protección de datos (GDPR, CCPA)
  • Uso prácticas éticas de desguace como base
El objetivo de la antidetección no es evitar la seguridad legítima. Es para asegurar que su acceso automatizado a los datos públicos no se insignifica incorrectamente como malicioso.

Preguntas frecuentes

¿Listo para empezar?

Accede a más de 50M de IPs residenciales en más de 148 países con filtrado impulsado por IA.

Ver preciosProxies residenciales
← Volver al Blog