Volver al blog
Guías
Mihnea-Octavian ManolacheLast updated on Mar 31, 20268 min read

Paso a paso: cómo eludir Cloudflare y mejorar tus tareas de web scraping

Paso a paso: cómo eludir Cloudflare y mejorar tus tareas de web scraping

Hoy en día, el web scraping se ha convertido en una tarea realmente complicada. Si alguna vez has creado un rastreador web con un navegador sin interfaz gráfica, seguro que te has topado con algún sistema antibots. Y burlar Cloudflare, Datadome o cualquier otro proveedor antibots, por cierto, no es tarea fácil. Primero hay que idear estrategias de evasión y luego implementarlas en producción. E incluso así, puede haber situaciones que nunca hayas tenido en cuenta.

Sin embargo, sin una implementación mínima de estas técnicas de evasión, tus posibilidades de que te detecten y bloqueen son muy altas. Por eso, el tema del artículo de hoy es cómo eludir la detección de Cloudflare. Y la mayoría de las técnicas que vamos a tratar se aplican también a otros proveedores de detección. A modo de referencia, nos centraremos en Selenium para ver si podemos hacerlo sigiloso. A lo largo del artículo, entre otras cosas, hablaré de:

  • Métodos de detección de bots
  • Técnicas generales de evasión anti-bot
  • Técnicas avanzadas de evasión para Selenium

¿Cómo detecta Cloudflare los navegadores sin interfaz gráfica?

Cloudflare es una empresa tecnológica con una red gigantesca. Se centra en servicios como CDN, DNS y diversos sistemas de seguridad en línea. Su cortafuegos de aplicaciones web suele estar diseñado para proteger contra ataques como DDoS o cross-site scripting. En los últimos años, Cloudflare ha añadido, y otros proveedores del sector han introducido, sistemas de huellas digitales capaces de detectar navegadores sin interfaz gráfica. Como se puede imaginar, uno de los primeros afectados por estas técnicas es Selenium. Y dado que el sector del web scraping depende en gran medida de esta tecnología, los scrapers también se ven directamente afectados.

Antes de pasar a las técnicas anti-bot, creo que es importante analizar cómo detecta Cloudflare a Selenium. Bueno, el sistema puede ser muy complejo. Por ejemplo, hay propiedades en un navegador de las que carece un controlador web. La interfaz `navigator` de un navegador tiene incluso una propiedad llamada `webdriver` que indica si un navegador está controlado por automatización. Y eso es una señal de alerta inmediata. Si quieres probarlo:

  • Abre las herramientas de desarrollador de tu navegador
  • Ve a la consola
  • Escribe el siguiente comando: `navigator.webdriver`

En tu caso, debería devolver «false». Pero si lo pruebas con Puppeteer o Selenium, obtendrás «true». Si te preguntas cómo aprovecha Cloudflare esto para detectar bots, bueno, es bastante sencillo. Todo lo que tienen que hacer es inyectar un script como el que aparece a continuación en el sitio web de su socio:

// detection-script.js

const webdriver = navigator.webdriver

// If webdriver returns true, display a reCaptcha

// In this example, I am transferring the user to a Cloudflare challenge page.

// But you get the idea

if ( webdriver ) location.replace('https://cloudflarechallenge.com')

Por supuesto, en la vida real, estos proveedores utilizan muchos más niveles de detección. Incluso el tamaño de la pantalla, la distribución del teclado o los complementos utilizados por los navegadores se emplean para identificar específicamente un navegador. Si te interesa saber cómo funciona la detección sin navegador, echa un vistazo a mi sencilla prueba de service worker. Y eso es solo si te ciñes al navegador. También puedes detectar la actividad de los bots analizando la dirección IP desde la que se origina la solicitud. Por ejemplo, si utilizas direcciones IP de centros de datos, tus posibilidades de ser bloqueado aumentan con cada solicitud. Por eso se recomienda utilizar proxies residenciales o de ISP cuando se crea un rastreador web.

Cómo eludir Cloudflare con Selenium

Afortunadamente, la comunidad de web scraping es muy activa. Y dado que existe tanta demanda para eludir Cloudflare y otros proveedores antibots, hay soluciones de código abierto en ese ámbito. ¡Se pueden lograr grandes cosas cuando las comunidades de programación trabajan juntas! De cara al futuro, sugiero que sigamos estos pasos:

  • Realizar algunas pruebas para ver si Selenium por defecto puede eludir Cloudflare
  • Añadir algunas evasiones adicionales para que nuestros scripts sean más sigilosos

Así que empecemos con nuestro primer paso:

#1: ¿Puede el Selenium predeterminado eludir Cloudflare?

No soy de los que hacen suposiciones. Y eso es especialmente porque no sabemos con certeza cómo funcionan los sistemas de Cloudflare. Utilizan todo tipo de ofuscación en su código, lo que dificulta la ingeniería inversa. Por eso, a lo largo de mi experiencia como desarrollador, he aprendido que las pruebas son la mejor manera de entender cómo funciona un sistema. Así que construyamos un scraper básico y veamos cómo se comporta en un objetivo real, protegido por Cloudflare.

1.1. Configurar el entorno

Con Python, lo mejor es aislar nuestros proyectos dentro de un único directorio. Así que creemos una nueva carpeta, abramos una ventana de terminal y naveguemos hasta ella:

# Create a new virtual environment and activate it

~ » python3 -m venv env && source env/bin/activate

# Install dependencies

~ » python3 -m pip install selenium

# Create a new .py file and open the project inside your IDE

~ » touch app.py && code .

1.2. Crear un scraper web sencillo con Selenium

Ahora que has configurado tu proyecto con éxito, es hora de añadir algo de código. No vamos a crear nada sofisticado aquí. Solo necesitamos este script con fines de prueba. Si quieres aprender sobre scraping avanzado, echa un vistazo a este [ENLACE](AQUÍ DEBE IR EL ARTÍCULO) tutorial sobre Pyppeteer.

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

# Set Chrome to open in headless mode

options = Options()

options.headless = True

# Create a new Chrome instance and navigate to target

driver = webdriver.Chrome(options=options)

driver.get('https://www.snipesusa.com/')

# Give it some time to load

time.sleep(10)

# Take screenshot of page

driver.get_screenshot_as_file('screenshot.png')

# Close browser

driver.quit()

Ahora echa un vistazo a la captura de pantalla. Esto es lo que he obtenido:

Creo que podemos concluir con seguridad que la prueba ha fallado. El sitio web objetivo está protegido por Cloudflare y, como puedes ver, nos está bloqueando. Por lo tanto, por defecto, Selenium no es capaz de eludir Cloudflare. No voy a profundizar en el tema ni a comprobarlo con otros proveedores de detección de bots. Si quieres seguir probando, aquí tienes algunos objetivos y sus proveedores:

N.º 2: ¿Puede Selenium sigiloso eludir Cloudflare?

En primer lugar, permítanme aclarar los términos. Por Selenium sigiloso me refiero a una versión de Selenium que puede pasar desapercibida y eludir Cloudflare. No me refiero a ninguna técnica de ocultación específica. Hay varias formas de implementar técnicas de evasión en Selenium. Existen paquetes que se encargan de ello, o puedes usar `execute_cdp_cmd` para interactuar directamente con la API de Chrome. Esta última opción te permite un mayor control, pero requiere más trabajo. Aquí tienes un ejemplo de cómo podrías usarla para cambiar el valor del agente de usuario:

driver.execute_cdp_cmd('Emulation.setUserAgentOverride', {

               "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36",

               "platform": "Win32",

               "acceptLanguage":"ro-RO"

       })

Pero tendrías que revisar el CDP e identificar las API que te permiten realizar todos los cambios necesarios. Así que, por el momento, probemos con algunos paquetes.

1.1. Selenium sigiloso

Hay al menos dos paquetes que puedes utilizar para hacer que Selenium sea sigiloso. Sin embargo, hasta ahora, ninguno de ellos garantiza eludir Cloudflare. Una vez más, tenemos que probar y ver si alguno de ellos funciona. En primer lugar, echemos un vistazo a `selenium-stealth`. Este paquete es una envoltura de `puppeteer-extra-plugin-stealth`, lo que permite utilizar las evasiones de Puppeteer con Selenium de Python. Para utilizarlo, primero hay que instalarlo. Abre una ventana de terminal e introduce este comando:

# Install selenium-stealth

~ » python3 -m pip install selenium-stealth

Ya está todo listo. Podemos utilizarlo para hacer que nuestro rastreador anterior sea más sigiloso:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium_stealth import stealth

import time

# Set Chrome to open in headless mode

options = Options()

options.headless = True

# Create a new Chrome instance

driver = webdriver.Chrome(options=options)

# Apply stealth to your webdriver

stealth(driver,

   languages=["en-US", "en"],

   vendor="Google Inc.",

   platform="Win32",

   webgl_vendor="Intel Inc.",

   renderer="Intel Iris OpenGL Engine",

   fix_hairline=True,

)

# Navigate to target

driver.get('https://www.snipesusa.com/')

# Give it some time to load

time.sleep(10)

# Take screenshot of page

driver.get_screenshot_as_file('stealth.png')

# Close browser

driver.quit()

Al ejecutar el script, esta vez obtuve un resultado diferente, a diferencia de la configuración predeterminada de Selenium:

La segunda opción que puedes utilizar es `undetected_chromedriver`. Esta se describe como un «chromedriver de Selenium optimizado». Probémoslo:

# Install undetected_chromedriver

~ » python3 -m pip install undetected_chromedriver

El código es muy similar al de nuestro script predeterminado. La principal diferencia radica en el nombre del paquete. Aquí tienes un scraper básico con `undetected_chromedriver`; veamos si puede eludir Cloudflare:

import undetected_chromedriver as uc

import time

# Set Chrome to open in headless mode

options = uc.ChromeOptions()

options.headless = True

# Create a new Chrome instance and maximize the window

driver = uc.Chrome(options=options, executable_path='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome')

driver.maximize_window()

# Navigate to target

driver.get('https://www.snipesusa.com/')

# Give it some time to load

time.sleep(10)

# Take screenshot of page

driver.get_screenshot_as_file('stealth-uc.png')

# Close browser

driver.quit()

Una vez más, la ejecución del script me ha dado buenos resultados. Parece que, al menos, estos dos paquetes pueden eludir con éxito la protección de Cloudflare. Al menos a corto plazo. A decir verdad, lo más probable es que, si utilizas estos scripts de forma intensiva, Cloudflare detecte tu dirección IP y la bloquee.

Así que permíteme presentarte una tercera opción: la API de web scraping.

1.2. Selenium con la API de Web Scraping

Web Scraping API tiene una característica increíble llamada «Modo Proxy». Puedes leer más al respecto aquí. Pero lo que quiero destacar aquí es que nuestro Modo Proxy se puede integrar con éxito con Selenium. De esta forma, obtienes acceso a todas las funciones de evasión que hemos implementado. Y déjame decirte que contamos con un equipo dedicado que trabaja en técnicas de evasión personalizadas. En términos técnicos, gestionamos rotaciones de IP, utilizamos varios proxies, resolvemos captchas y usamos la API de Chrome para cambiar continuamente nuestra huella digital. En términos no técnicos, esto se traduce en menos complicaciones para ti y una mayor tasa de éxito. Básicamente, obtienes la versión más sigilosa de Selenium que existe. Y así es como se hace:

# Install selenium-wire

~ » python3 -m pip install selenium-wire


Utilizamos `selenium-wire` para poder usar Selenium con un proxy. Aquí tienes el script:

from seleniumwire import webdriver

import time

# Method to encode parameters

def get_params(object):

   params = ''

   for key,value in object.items():

       if list(object).index(key) < len(object) - 1:

           params += f"{key}={value}."

       else:

           params += f"{key}={value}"

   return params

# Your WSA API key

API_KEY = '<YOUR_API_KEY>'

# Default proxy mode parameters

PARAMETERS = {

   "proxy_type":"datacenter",

   "device":"desktop",

   "render_js":1

}

# Set Selenium to use a proxy

options = {

   'proxy': {

       "http": f"http://webscrapingapi.{ get_params(PARAMETERS) }:{ API_KEY }@proxy.webscrapingapi.com:80",

   }

}

# Create a new Chrome instance

driver = webdriver.Chrome(seleniumwire_options=options)

# Navigate to target

driver.get('https://www.httpbin.org/get')

# Retrieve the HTML documeent from the page

html = driver.page_source

print(html)

# Close browser

driver.quit()

Si ejecutas este script un par de veces, verás cómo cambia la dirección IP cada vez. Ese es nuestro sistema de rotación de IP. En segundo plano, también añade técnicas de evasión. Ni siquiera tienes que preocuparte por ellas. Nosotros nos encargamos de la parte de eludir Cloudflare para que puedas centrarte más en analizar los datos.

Conclusiones

Si quieres crear un scraper capaz de eludir Cloudflare, debes tener en cuenta muchas cosas. Un equipo dedicado puede trabajar las 24 horas del día, los 7 días de la semana, y aún así no hay garantía de que las evasiones funcionen siempre. Esto se debe a que, con cada lanzamiento de una nueva versión del navegador, existe la posibilidad de que se añadan nuevas funciones a la API. Y algunas de estas funciones pueden utilizarse para identificar y detectar bots.

Incluso diría que el mejor navegador para eludir Cloudflare y otros proveedores es el que construyes tú mismo. Y nosotros hemos creado uno en Web Scraping API. Ahora lo compartimos contigo. ¡Así que disfruta del scraping!

Acerca del autor
Mihnea-Octavian Manolache, Desarrollador Full Stack @ WebScrapingAPI
Mihnea-Octavian ManolacheDesarrollador Full Stack

Mihnea-Octavian Manolache es ingeniero Full Stack y DevOps en WebScrapingAPI, donde se encarga de desarrollar funciones para los productos y de mantener la infraestructura que garantiza el buen funcionamiento de la plataforma.

Empieza a crear

¿Estás listo para ampliar tu recopilación de datos?

Únete a más de 2000 empresas que utilizan WebScrapingAPI para extraer datos de la web a escala empresarial sin ningún gasto de infraestructura.