Las combinaciones clásicas de Selenium y Puppeteer se están encontrando cada vez más con sistemas anti-bots de nivel Cloudflare, DataDome y PerimeterX. Nuevos frameworks están surgiendo — Scrapling, Botasaurus y nodriver, que fueron diseñados desde el principio con un enfoque en evadir la detección. Pero incluso el framework más avanzado es inútil sin proxies correctamente configurados. En este artículo, analizaremos cómo conectar proxies en cada una de las tres herramientas, qué errores matan la efectividad y cómo elegir el tipo de IP para una tarea de scraping específica.
¿En qué se diferencian Scrapling, Botasaurus y nodriver de Selenium?
Los tres frameworks surgieron como respuesta a que Selenium y el Puppeteer convencional se volvieron demasiado fáciles de detectar. Los sistemas anti-bots verifican decenas de parámetros: protocolo CDP, navigator.webdriver, renderizado de canvas, tiempos de eventos — y los controladores clásicos dejan huellas características en casi todos ellos.
Scrapling — es una biblioteca de Python que combina el scraping adaptativo de HTML con la capacidad de emular un navegador a través de StealthyFetcher basado en Camoufox (un fork de Firefox con huella digital parcheada). Es excelente para tareas donde se necesita un scraping rápido con un consumo mínimo de recursos, pero donde la protección del sitio verifica activamente el TLS-fingerprint.
Botasaurus — es un framework basado en Chromium modificado (undetected-chromedriver bajo el capó), diseñado para scraping masivo paralelo con gestión automática de perfiles de navegador y soporte integrado para resolver captchas a través de servicios de terceros.
nodriver — es el sucesor de undetected-chromedriver del mismo autor, que ha abandonado completamente Selenium WebDriver y trabaja directamente a través de CDP (Chrome DevTools Protocol), lo que elimina una parte significativa de los artefactos de automatización detectables.
La característica común de los tres es que reducen la detección a nivel de huella digital del navegador, pero no resuelven el problema de la reputación de IP. Si las solicitudes provienen de una IP de centro de datos que ya está en listas negras de DataDome o Cloudflare, ningún parche del navegador salvará de un captcha o un error 403.
Configuración de proxies en Scrapling
Scrapling soporta proxies tanto en modo HTTP rápido (Fetcher) como en modo navegador (StealthyFetcher). Para scraping estático sin renderizado de JS, el proxy se pasa directamente en los parámetros de la solicitud:
from scrapling.fetchers import Fetcher
response = Fetcher.get(
"https://example.com",
proxy="http://user:[email protected]:9000"
)
print(response.status)
Para el modo con un navegador completo (StealthyFetcher en Camoufox), el proxy se pasa a través de un diccionario con campos separados para el servidor, el nombre de usuario y la contraseña — esto es importante porque Camoufox maneja la autorización del proxy de manera diferente que el Chromium convencional:
from scrapling.fetchers import StealthyFetcher
response = StealthyFetcher.fetch(
"https://example.com",
proxy={
"server": "gate.proxycove.com:9000",
"username": "user",
"password": "pass"
},
headless=True
)
print(response.status)
Un error común es pasar el proxy como una cadena completa en el modo de navegador, como en las solicitudes HTTP. Camoufox en este caso ignora la autorización o falla con un timeout al intentar conectarse al servidor proxy. Si ves el error ERR_NO_SUPPORTED_PROXIES — verifica el formato del diccionario con campos separados.
Configuración de proxies en Botasaurus
Botasaurus utiliza el decorador @browser
para configurar el controlador, y el proxy se pasa como parámetro de este decorador o directamente en la función de inicio:
from botasaurus.browser import browser, Driver
@browser(
proxy="http://user:[email protected]:9000"
)
def scrape_data(driver: Driver, data):
driver.get("https://example.com")
return driver.page_html
scrape_data()
Si necesitas conectar diferentes proxies para cada tarea paralela (lo cual es crítico en el scraping masivo a través de Botasaurus), es mejor pasar el proxy dinámicamente a través de una lista de datos, en lugar de codificarlo en el decorador:
from botasaurus.browser import browser, Driver
@browser
def scrape_with_proxy(driver: Driver, data):
driver.config.proxy = data["proxy"]
driver.get(data["url"])
return driver.page_html
tasks = [
{"url": "https://example.com/page1", "proxy": "http://user:pass@ip1:port"},
{"url": "https://example.com/page2", "proxy": "http://user:pass@ip2:port"},
]
scrape_with_proxy(tasks)
Botasaurus paraleliza tareas a través de multiprocessing, por lo que en el scraping masivo es importante usar proxies con un pool suficiente de IP — de lo contrario, varios hilos estarán golpeando la misma dirección, lo que instantáneamente delata la automatización al anti-bot por el patrón de frecuencia de solicitudes.
Configuración de proxies en nodriver
nodriver trabaja a través de una conexión directa a CDP sin la capa de Selenium, por lo que el proxy se configura a través de argumentos de inicio del navegador, y no a través de una API separada. Para proxies sin autorización, es sencillo:
import nodriver as uc
import asyncio
async def main():
browser = await uc.start(
browser_args=["--proxy-server=http://gate.proxycove.com:9000"]
)
page = await browser.get("https://example.com")
await asyncio.sleep(3)
browser.stop()
asyncio.run(main())
El problema es que Chromium no soporta login/contraseña en proxies a través de --proxy-server directamente.
Para proxies autorizados en nodriver, necesitas levantar un túnel proxy local sin autorización
(por ejemplo, a través de px o 3proxy), o manejar el evento CDP Fetch.authRequired:
import nodriver as uc
import asyncio
async def main():
browser = await uc.start(
browser_args=["--proxy-server=http://gate.proxycove.com:9000"]
)
page = await browser.get("https://example.com")
async def auth_handler(event):
await page.send(uc.cdp.fetch.continue_with_auth(
request_id=event.request_id,
auth_challenge_response=uc.cdp.fetch.AuthChallengeResponse(
response="ProvideCredentials",
username="user",
password="pass"
)
))
page.add_handler(uc.cdp.fetch.AuthRequired, auth_handler)
await asyncio.sleep(5)
browser.stop()
asyncio.run(main())
Este es el aspecto menos obvio entre los tres frameworks — muchos desarrolladores pasan horas tratando de entender por qué la autorización simplemente no funciona, sin saber sobre el dominio Fetch en CDP.
Rotación de proxies y lucha contra los anti-bots
Incluso una huella digital de navegador perfectamente configurada no salvará si una IP recibe más de 50-100 solicitudes por minuto a un dominio protegido. DataDome y Cloudflare analizan la frecuencia de solicitudes desde una dirección específica y patrones temporales entre acciones — intervalos demasiado uniformes también son sospechosos.
El esquema de rotación funcional para los tres frameworks se construye de la misma manera:
- Utiliza un gateway con rotación automática de IP a nivel de proveedor — no necesitas escribir tu propia lógica de cambio de direcciones para cada solicitud.
- Para tareas de sesión (login, navegación multipágina) fija la IP por sesión a través de un parámetro sticky en la cadena de conexión.
- Para scraping simple de páginas estáticas, rota la IP en cada solicitud o cada 5-10 solicitudes.
- Agrega retrasos aleatorios entre solicitudes (1-4 segundos) — esto reduce la detección por patrones temporales.
Ejemplo de sesión sticky en la cadena de conexión, donde el session-id mantiene la misma IP saliente durante 10 minutos:
proxy = "http://user-session-abc123:[email protected]:9000"
Para Botasaurus, este esquema es especialmente útil, porque en el scraping paralelo cada proceso puede obtener su propio session-id único, y obtienes un pool estable de diferentes IP sin gestionar manualmente la lista de direcciones.
Qué tipo de proxy elegir para cada framework
El tipo de proxy influye en el éxito del scraping tanto como la elección del framework. A continuación, una comparación por tareas:
| Tarea | Tipo de proxy recomendado | Por qué |
|---|---|---|
| Scraping de sitios con Cloudflare/DataDome | Proxies residenciales | Las IP reales de usuarios domésticos rara vez caen en listas negras de anti-bots |
| Scraping masivo sin protección estricta | Proxies de centros de datos | Mayor velocidad, menor costo en grandes volúmenes de solicitudes |
| Emulación de un usuario real en sitios móviles | Proxies móviles | Las direcciones CGNAT de los operadores de telecomunicaciones tienen el mayor nivel de confianza ante los anti-bots |
Para Scrapling en modo StealthyFetcher, los proxies residenciales ofrecen el mayor efecto, porque Camoufox ya resuelve el problema de la huella digital del navegador — solo queda no ser descubierto por la IP. Para Botasaurus, en scraping paralelo masivo, los proxies de centros de datos son a menudo óptimos en relación velocidad/precio, si el sitio objetivo no utiliza protección avanzada de nivel DataDome.
Errores típicos al combinar proxies y automatización de navegadores
En la práctica, la mayoría de los fracasos en el scraping están relacionados no con el framework en sí, sino con una configuración incorrecta de los proxies. Aquí hay una lista de errores que ocurren con más frecuencia:
- La misma IP para todos los hilos paralelos de Botasaurus. El anti-bot ve 20 sesiones simultáneas desde una dirección y la bloquea en minutos.
- Pasar el proxy como una cadena en el modo de navegador de Scrapling. Camoufox requiere un diccionario con campos separados — de lo contrario, la autorización no pasa.
- Ignorar el dominio CDP Fetch en nodriver. Sin un manejador authRequired, el proxy autorizado simplemente no se conectará, el navegador se quedará colgado en la carga.
- Falta de rotación en acciones de sesión. Cambiar la IP a mitad de una sesión autorizada delata instantáneamente la automatización — usa sesiones sticky.
- Desajuste entre la geolocalización del proxy y la configuración regional del navegador. IP de Alemania con encabezados Accept-Language: ru — un clásico signo de bot para sistemas de scoring de fraude.
- Frecuencia de solicitudes demasiado agresiva incluso con rotación. La rotación de IP no elimina la necesidad de hacer pausas entre solicitudes — el patrón de comportamiento también se analiza.
Es importante verificar las fugas de DNS al trabajar a través de proxies en modo de navegador — a veces el navegador resuelve dominios a través del DNS del sistema, en lugar de a través del túnel proxy, lo que crea un desincronización entre la IP de la solicitud y la IP de resolución, que es fácilmente detectada por los sistemas de protección.
Conclusión
Scrapling, Botasaurus y nodriver resuelven el problema de detección a nivel de huella digital del navegador mucho mejor que el clásico Selenium, pero ninguno de ellos elimina la importancia de un proxy de calidad. La configuración correcta de la autorización (especialmente en nodriver a través de CDP), una rotación adecuada de IP y la elección del tipo de proxy adecuado para cada sistema anti-bots — son tres factores que determinan la estabilidad del scraping a largo plazo.
Si estás scrapeando sitios con protección avanzada como Cloudflare o DataDome, comienza con proxies residenciales — ofrecen el mayor porcentaje de solicitudes exitosas precisamente gracias a la reputación de la IP. Para tareas masivas sin protección estricta, los proxies de centros de datos siguen siendo la opción óptima en relación a velocidad y costo en grandes volúmenes.