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
| Tipo Proxy | Riesgo de detección | Mejor |
|---|---|---|
| Residencial | Baja | La mayoría de tareas de raspado, sitios protegidos |
| ISP (Static Residential) | Low-Medium | Sesiones largas, cuentas |
| Datacenter | Alto | Sitios desprotegidos, tareas de alto volumen |
| Móvil | Muy bajo | Lugares 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-Uadebe 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-JPes 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
| Idioma | Biblioteca por defecto | Riesgo de detección | Browser-Grade Alternative |
|---|---|---|---|
| Python | peticiones/urllib3 | Muy alta | curl cffi con impersonate |
| Node.js | axios/got | Alto | Tengo... |
| Vamos. | net/http | Muy alta | uTLS + 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
| Layer | Medida | Prioridad |
|---|---|---|
| IP | Use proxies residenciales con geo-targeting | Crítica |
| IP | Rotar IPs por solicitud o sesión | Crítica |
| Headers | Enviar conjuntos completos y realistas | Crítica |
| Headers | Match Accept-Language to proxy location | Alto |
| TLS | Utilice la biblioteca TLS de grado navegador | Crítica |
| TLS | Match TLS huella dactilar para el navegador reclamado | Crítica |
| Navegador | Utilice plugins de sigilo para navegadores sin cabeza | Alto |
| Navegador | Mantener perfiles de huellas dactilares consistentes | Alto |
| Comportamiento | Agregar retrasos aleatorios entre solicitudes | Alto |
| Comportamiento | Siga las rutas de navegación naturales | Mediana |
| Comportamiento | Mantener las cookies en las sesiones | Mediana |
| Validación | Comprobar contenido de respuesta, no sólo códigos de estado | Alto |
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:
- Nivel 1 - HTTP cliente + encabezados + proxy: Trabaja para la mayoría de los sitios. Uso
curl_cffiogot-scrapingcon ProxyHat proxies. - Nivel 2 — Añadir TLS de grado navegador: Se requiere cuando el sitio comprueba las huellas dactilares JA3/JA4.
- Nivel 3 - Navegador sin cabeza + sigilo: Necesario para contenido de JavaScript y sofisticados sistemas antibots.
- 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.






