Evite ser bloqueado con Puppeteer Stealth

Aprenda a integrar Puppeteer Stealth en un script de raspado de datos de Puppeteer para evitar bloqueos.
8 min read
Avoid Getting Blocked With Puppeteer Stealth

Este tutorial de Puppeteer Stealth cubrirá:

  • Qué es la detección de bots y por qué es un problema para Puppeteer.
  • Que es Puppeteer Extra.
  • Como usar el Plugin Puppeteer Extra Stealth para evitar bloqueos.

Detección de Bots: el mayor enemigo de Puppeteer

Puppeteer es una de las librerías JavaScript más utilizadas para la automatización de navegadores. Es tan popular porque está respaldada por el equipo de Chrome en Google. Su API de alto nivel permite controlar navegadores con o sin interfaz gráfica mediante el protocolo DevTools, lo que la convierte en una gran herramienta para el raspado web, las pruebas automatizadas y el desarrollo de bots.

Sin embargo, Puppeteer puede ser fácilmente detenido por las tecnologías de detección de bots. Esto es particularmente cierto cuando se utiliza Chrome/Chromium en modo headless. ¿Por qué? Porque Puppeteer establece automáticamente propiedades y cabeceras por defecto que hacen que el navegador bajo control aparezca como una instancia headless. Por ejemplo, establece la siguiente configuración de Chrome: navigator.webdriver: true.

Las soluciones anti-bot lo saben y analizan esas configuraciones para determinar si el usuario actual es un humano o un bot. Cuando encuentran alguna configuración sospechosa, marcan al usuario como bot.

Por ejemplo, considere esta prueba de detección de bots en modo headless. Si abre la página de prueba en su navegador, verá:

Si abre la página de prueba en su navegador verá que no es Chrome headless

Ahora, intenta visitar esa pagina con Puppeteer vanilla y extrae el resultado de la prueba:

import puppeteer from "puppeteer"

(async () => {
    // set up the browser and launch it
    const browser = await puppeteer.launch()

    // open a new blank page
    const page = await browser.newPage()

    // navigate the page to the target page
    await page.goto("https://arh.antoinevastel.com/bots/areyouheadless")

    // extract the message of the test result
    const resultElement = await page.$("#res")
    const message = await resultElement.evaluate(e => e.textContent)

    // print the resulting message
    console.log(`The result of the test is "%s"`, message);

    // close the current browser session
    await browser.close()
})()

Ejecute el script anterior, y verá:

The result of the test is "You are Chrome headless"

Eso significa que la prueba falló, ya que la página fue capaz de detectar la petición automática como proveniente de un navegador headless.

Por defecto, Puppeteer es una herramienta limitada. Para evitar la detección de bots, usted tendría que ajustarlo manualmente y anular las configuraciones por defecto. ¡Evite todo eso con Puppeteer Extra!

Puppeteer Extra: una versión extensible de Puppeteer

Puppeteer Extra es una envoltura ligera construida alrededor de Puppeteer que lo extiende con soporte para plugins. En otras palabras, puppeteer-extra es un reemplazo para puppeteer. Además de trabajar como la popular librería de automatización del navegador, proporciona el método use() para registrar plugins.  

Cada plugin añade funcionalidad extra a Puppeteer. Algunos de los plugins más útiles disponibles son:

  • puppeteer-extra-plugin-stealth: para dificultar que la tecnología de detección de bots detecte instancias de navegador sin interfaz gráfica (headless).
  • puppeteer-extra-plugin-recaptcha: para resolver reCAPTCHAs y hCaptchas automáticamente.
  • puppeteer-extra-plugin-adblocker: para eliminar anuncios y rastreadores, reduciendo así el ancho de banda y los tiempos de carga.
  • puppeteer-extra-plugin-devtools: para hacer posible la depuración del navegador desde cualquier lugar mediante la creación de un túnel seguro a las DevTools.
  • puppeteer-extra-plugin-repl: para hacer la depuración divertida con una interfaz interactiva REPL (Read-Eval-Print-Loop).
  • puppeteer-extra-plugin-block-resources: para bloquear dinámicamente los recursos de la página, tales como imágenes, medios de comunicación, CSS y archivos JS.
  • puppeteer-extra-plugin-anonymize-ua: para anonimizar la cabecera User-Agent en la navegación de páginas. Descubra por qué es importante en nuestra guía sobre User-Agent para raspado web.
  • puppeteer-extra-plugin-user-preferences: Para establecer preferencias de usuario personalizadas de Chrome/Chromium.

Profundicemos ahora en el plugin Puppeteer Stealth.

Qué es y qué hace el plugin Puppeteer Extra Stealth

puppeteer-extra-plugin-stealth es un plugin para Puppeteer Extra que incluye un conjunto de configuraciones para evitar la detección de bots. En detalle, Puppeteer Stealth se basa en módulos de evasión incorporados que sobrescriben las fugas y propiedades de Puppeteer que lo exponen como un bot. Por ejemplo, elimina “HeadlessChrome” de la cabecera User-Agent y borra la propiedad navigator.webdriver que Puppeteer establece por defecto.

El objetivo del plugin Puppeteer Extra Stealth es hacer que una instancia de Chromium controlada a través de Puppeteer pase todas las pruebas de detección de bots en sannysoft.com. A partir de este escrito, logra su objetivo. Al mismo tiempo, como se indica en la documentación oficial, todavía hay formas de detectar Chromium sin interfaz gráfica. Esto significa que es imposible eludir todos los mecanismos de detección de bots, pero la idea del proyecto es hacer ese proceso lo más difícil posible.

Cómo usar Puppeteer Stealth para evitar la detección de bots mientras se raspan páginas web

Es hora de ver como integrar Puppeteer Stealth en un script de raspado de datos de puppeteer para evitar bloqueos.

Siga los siguientes pasos

Paso 1: Instalar Puppeteer Extra y el Plugin Stealth

Ejecute el siguiente comando para añadir Puppeteer Extra y el plugin Puppeteer Stealth a las dependencias de su proyecto:

npm install puppeteer-extra puppeteer-extra-plugin-stealth

¡Genial! Acaba de cumplir con los prerrequisitos para integrar el plugin Stealth en su script automatizado Puppeteer.

Paso 2: Configurar Puppeteer Extra y registrar el plugin Stealth

Primero, reemplace la sentencia import de puppeteer con esta instrucción:

import puppeteer from "puppeteer-extra"

En otras palabras, asegúrese de importar el objeto puppeteer de "puppeteer-extra``" y no de "puppeteer``".

Luego, importe StealthPlugin desde puppeteer-extra-plugin-stealth:

import StealthPlugin from "puppeteer-extra-plugin-stealth"

Si en cambio es usuario de CommonJS, es necesario:

const puppeteer = require("puppeteer-extra")
const StealthPlugin = require("puppeteer-extra-plugin-stealth")

A continuación, registre el plugin Stealth pasándolo al objeto puppeteer a través del método use():

puppeteer.use(StealthPlugin())

¡Genial! Acaba de añadir las capacidades de evasión por defecto soportadas por el plugin a Puppeteer.

Tenga en cuenta que el constructor de StealthPlugin() acepta un objeto opcional con el conjunto de cadenas correspondientes a las evasiones a habilitar:

// enable only a few evasion techniques
puppeteer.use(StealthPlugin({
    enabledEvasions: new Set(["chrome.app", "chrome.csi", "defaultArgs", "navigator.plugins"])
}))

De lo contrario, utilice la lógica siguiente para eliminar dinámicamente una estrategia de evasión específica del plugin Stealth:

const stealthPlugin = StealthPlugin()
puppeteer.use(stealthPlugin)

// ...

// remove the "user-agent-override" evasion method
pluginStealth.enabledEvasions.delete("user-agent-override")

Paso 3: Conjuntándolo todo

Integre el Puppeteer Extra y su plugin Stealth en el script que viste al principio del artículo:

import puppeteer from "puppeteer-extra"
import StealthPlugin from "puppeteer-extra-plugin-stealth"

(async () => {
    // configure the stealth plugin
    puppeteer.use(StealthPlugin())
    // set up the browser and launch it
    const browser = await puppeteer.launch()

    // open a new blank page
    const page = await browser.newPage()

    // navigate the page to the target page
    await page.goto("https://arh.antoinevastel.com/bots/areyouheadless")

    // extract the message of the test result
    const resultElement = await page.$("#res")
    const message = await resultElement.evaluate(e => e.textContent)

    // print the resulting message
    console.log(`The result of the test is "%s"`, message);

    // close the current browser session
    await browser.close()
})()

Ejecute este snippet, y ahora se imprimirá:

The result of the test is "You are not Chrome headless"

¡Et voilà! La página seleccionada con capacidades de detección de bots ya no es capaz de marcar su script automatizado Puppeteer como un bot.

¡Enhorabuena! Ahora es un ninja de Puppeteer Stealth, y ninguna tecnología de detección de bots le asustará nunca más.

Conclusión

En este artículo, ha entendido por qué la detección de bots es un reto para Puppeteer y cómo lidiar con ello. Gracias a Puppeteer Extra, puede extender la funcionalidad de Puppeteer con plugins. En particular, el plugin Stealth es un gran aliado para evitar la detección de bots, y aquí mostramos cómo usarlo.

No importa lo sofisticado que sea su Puppeteer Extra, las tecnologias anti-bot avanzadas como Cloudflare seran capaces de detectar y bloquear sus scripts. Podría optar por otro paquete de automatización del navegador, pero la causa de la detección es el navegador, no la biblioteca. La solución es un navegador escalable con funcionalidad anti-bot que puede integrarse con cualquier librería de automatización de navegadores. ¡Ese navegador existe y se llama Scraping Browser!

Scraping Browser de Bright Data es un navegador en la nube altamente escalable que se trabaja con Puppeteer, Playwright, Selenium, y más. Rota automáticamente la IP de salida en cada solicitud y puede gestionar la huella digital del navegador, la resolución CAPTCHA y los reintentos automatizados por usted. Esto es posible gracias a las funciones de desbloqueo basadas en proxy en las que se basa.

Empresas de Fortune 500 y más de 20,000 clientes utilizan los proxies de Bright Data. Esta fiable red mundial de proxies incluye:

Hable con uno de nuestros representantes de ventas y compruebe cuál de los productos de Bright Data se adapta mejor a sus necesidades.