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 pasar por 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 resultados diferentes, 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 a nuestro script predeterminado. La principal diferencia radica en el nombre del paquete. Aquí hay un scraper básico con `undetected_chromedriver` y 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 salido bien. 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 sobre ella 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.