Evita la Detección de Bots con Playwright Stealth

Supera la detección de bots con el plugin Playwright Stealth. Nuestra guía rápida te muestra cómo integrar Stealth en tus scripts de Playwright, manteniendo tu automatización web fluida e indetectable.
10 min de lectura

Este tutorial de Playwright Stealth cubrirá:

  • Qué es la detección de bots y por qué representa un problema para Playwright.
  • Qué es Playwright Stealth.
  • Cómo usarlo tanto en Python como en JavaScript para evitar ser bloqueado.

¡Empecemos!

La Detección de Bots como la Mayor Limitación de Playwright

Playwright es una de las librerías de Python más populares para la automatización de navegadores. En concreto, es fiable y ampliamente utilizada porque es desarrollada y mantenida directamente por Microsoft. Su API de alto nivel e intuitiva facilita el control de navegadores headless o con interfaz gráfica en diferentes lenguajes de programación. Esto significa que Playwright es una gran herramienta para el desarrollo de bots multiplataforma y multinavegador, pruebas automatizadas y scraping web.

Playwright es una de las librerías de Python más populares para la automatización de navegadores. En concreto, es fiable y ampliamente utilizada porque es desarrollada y mantenida directamente por Microsoft. Su API de alto nivel e intuitiva facilita el control de navegadores headless o con interfaz gráfica en diferentes lenguajes de programación. Esto significa que Playwright es una gran herramienta para el desarrollo de bots multiplataforma y multinavegador, pruebas automatizadas y scraping web.

El principal problema con la librería es que puede ser fácilmente detectada y bloqueada por tecnologías anti-bot, especialmente cuando se utilizan navegadores en modo headless. ¿Cómo es posible? Playwright modifica automáticamente el valor de propiedades especiales y cabeceras al controlar navegadores headless. Por ejemplo, establece la configuración de Chrome navigator.webdriver en true.

Las soluciones de detección de bots conocen esas configuraciones y las analizan para verificar si el usuario actual es una persona o un bot. Cuando estos mecanismos detectan configuraciones sospechosas, clasifican al usuario como bot y lo bloquean de inmediato.

Por ejemplo, considera esta prueba de detección de bots para el modo headless. Visita la página en tu navegador y verás:

Página web mostrando el mensaje 'You are not Chrome headless'

¡Perfecto, ese es el resultado esperado!

Ahora intenta visitar la misma página con Playwright estándar y extrae la respuesta de la página:


import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        # launch the browser
        browser = await p.chromium.launch()
        # open a new page
        page = await browser.new_page()

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

        # extract the answer contained on the page
        answer_element = page.locator("#res")
        answer = await answer_element.text_content()

        # print the resulting answer
        print(f'The result is: "{answer}"')

        # close the browser and release its resources
        await browser.close()

asyncio.run(main())

Ejecuta el programa Python y mostrará:

The result is: "You are Chrome headless"

Esto significa que la página de prueba de automatización de bots ha podido detectar que la solicitud realizada por tu script automatizado proviene de un navegador headless.

En otras palabras, Playwright es una herramienta limitada que puede ser fácilmente detenida por tecnologías de detección de bots. Para evitarlo, puedes anular manualmente las configuraciones predeterminadas y esperar lo mejor. ¡O instalar el plugin Playwright Stealth!

Plugin Playwright Stealth: Qué Es y Cómo Funciona

playwright-stealth es un paquete de Python que extiende Playwright anulando configuraciones específicas para evitar la detección de bots. Playwright Stealth es un port del paquete npm puppeteer-extra-plugin-stealth, que utiliza módulos de evasión integrados para evitar filtraciones y modificar propiedades que exponen los navegadores automatizados como bots. Por ejemplo, elimina la propiedad navigator.webdriver y quita “HeadlessChrome” de la cabecera User-Agent que Chrome establece por defecto en modo headless.

El objetivo del plugin Stealth es permitir que una instancia de navegador headless automatizada supere con éxito todas las pruebas de detección de bots en sannysoft.com. En el momento de redactar este artículo, ese objetivo se ha cumplido. Sin embargo, como se menciona en la documentación oficial, aún existen métodos para detectar navegadores headless. Lo que funciona hoy puede no funcionar mañana. Eludir todos los mecanismos de detección de bots no es completamente alcanzable, pero la librería busca hacer este proceso lo más difícil posible.

Cómo Usar Playwright Stealth para Evitar la Detección de Bots

Sigue los pasos a continuación para aprender cómo integrar Playwright Stealth en un script de Python con playwright y evitar ser bloqueado.

Paso 1: Configurar un Proyecto Python con Playwright

Nota: Si ya tienes un proyecto Python con Playwright configurado, puedes omitir este paso.

Primero, asegúrate de tener Python 3 instalado en tu máquina. De lo contrario, descarga el instalador, ejecútalo y sigue el asistente de instalación.

A continuación, usa los comandos siguientes para configurar un proyecto Python llamado playwright-demo:

mkdir playwright-demo
cd playwright-demo

Estos comandos crean la carpeta playwright-demo y acceden a ella en la terminal.

Inicializa un entorno virtual de Python y actívalo:

python -m venv env
env/Scripts/activate

Ejecuta el siguiente comando para instalar Playwright:

pip install playwright 

Esto tomará un momento, así que ten paciencia.

Después, instala los navegadores requeridos con:

playwright install

Abre la carpeta del proyecto en el IDE de Python de tu elección y crea un archivo index.py. Inicialízalo con las siguientes líneas:

import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        page = await browser.new_page()

        # browser automation logic...        

        await browser.close()

asyncio.run(main())

El script anterior lanza una instancia de Chromium en modo headless, abre una nueva página y finalmente cierra el navegador. Así es como luce un script básico de Playwright en Python.

Para ejecutarlo, corre:

python index.py

¡Perfecto, ya tienes un proyecto Playwright listo para ser extendido con el Plugin Stealth!

Paso 2: Instalar y Usar el Plugin Stealth

Instala el plugin Playwright Stealth con:

pip install playwright-stealth

Abre tu archivo index.py y añade la siguiente importación a tu script de Playwright:

from playwright_stealth import stealth_async 

O si estás usando la API síncrona:

from playwright_stealth import stealth_sync

Para registrarlo en Playwright, pasa el objeto page a la función importada de la siguiente manera:

await stealth_async(page)

O si estás usando la API síncrona:

stealth_async(page)

La función stealth_async() extenderá page anulando algunas configuraciones predeterminadas para evitar la detección de bots.

¡Fantástico! Solo queda visitar la página objetivo y repetir la prueba.

Paso 3: Unirlo Todo

Integra el plugin Stealth en el script de Playwright presentado al inicio del artículo:

import asyncio
from playwright.async_api import async_playwright
from playwright_stealth import stealth_async
async def main():
    async with async_playwright() as p:
        # launch the browser
        browser = await p.chromium.launch()
        # open a new page
        page = await browser.new_page()

        # register the Playwright Stealth plugin
        await stealth_async(page)

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

        # extract the message contained on the page
        message_element = page.locator("#res")
        message = await message_element.text_content()

        # print the resulting message
        print(f'The result is: "{message}"')

        # close the browser and release its resources
        await browser.close()

asyncio.run(main())

Ejecútalo de nuevo y esta vez mostrará:

The result is: "You are not Chrome headless"

¡Et voilà! La página objetivo, equipada con capacidades de detección de bots, ya no puede identificar tu script automatizado de Playwright como un bot.

¡Bien hecho! Ya dominas el arte de Playwright Stealth y ninguna tecnología de detección de bots podrá detenerte.

Extra: Playwright Stealth en JavaScript

Si eres usuario de Playwright en JavaScript y quieres lograr el mismo resultado, necesitas usar el paquete npm puppeteer-extra-plugin-stealth. Esto funciona tanto para Puppeteer Extra como para Playwright Extra. Si no estás familiarizado con estos proyectos, son esencialmente versiones mejoradas de las dos librerías de automatización de navegadores. En concreto, añaden funcionalidad de extensión mediante plugins a Puppeteer y Playwright, respectivamente.

Así pues, supón que tienes el siguiente script de Playwright en JavaScript y quieres integrarlo con el plugin Stealth:

import { chromium } from "playwright"

(async () => {
    // set up the browser and launch it
    const browser = await chromium.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 contained on the page
    const messageElement = page.locator('#res')
    const message = await messageElement.textContent()

    // print the resulting message
    console.log(`The result is: "${message}"`)

  // close the browser and release its resources
  await browser.close()
})()

Primero, instala playwright-extra y puppeteer-extra-plugin-stealth:

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

A continuación, importa chromium desde playwright-extra en lugar de playwright e importa StealthPlugin desde puppeteer-extra-plugin-stealth:

import { chromium } from "playwright-extra"
import StealthPlugin from "puppeteer-extra-plugin-stealth"

Luego, registra el Plugin Stealth con:

chromium.use(StealthPlugin())

Uniéndolo todo, obtendrás:

import { chromium } from "playwright-extra"
import StealthPlugin from "puppeteer-extra-plugin-stealth"

(async () => {
    // configure the Stealth plugin
    chromium.use(StealthPlugin())

    // set up the browser and launch it
    const browser = await chromium.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 contained on the page
    const messageElement = page.locator('#res')
    const message = await messageElement.textContent()

    // print the resulting message
    console.log(`The result is: "${message}"`)

    // close the browser and release its resources
    await browser.close()
})()

¡Genial! Acabas de integrar el plugin Stealth en Playwright con JavaScript.

Conclusión

En esta guía, comprendiste por qué la detección de bots representa un desafío para Playwright y cómo abordarlo. Gracias a la librería de Python Playwright Stealth, puedes mejorar la configuración predeterminada del navegador para eludir la detección de bots. Como se demostró aquí, un enfoque similar también puede aplicarse en JavaScript.

Independientemente de lo sofisticado que sea tu script de automatización de navegador en Playwright, los sistemas avanzados de detección de bots seguirán representando un problema. Aunque podrías considerar usar otro paquete de automatización de navegador, la causa raíz de la detección reside en el navegador, no en la librería en sí. La solución está en un navegador escalable con funcionalidad de evasión anti-bot que se integre perfectamente con cualquier librería de automatización. Ese navegador existe y se conoce como Navegador de scraping.

El Navegador de scraping de Bright Data es un navegador en la nube altamente escalable compatible con Playwright, Puppeteer y Selenium. Rota automáticamente la IP de salida en cada solicitud y puede gestionar la huella digital del navegador, los reintentos automáticos y la resolución de CAPTCHA por ti. Estas funciones son posibles gracias a las características de desbloqueo basadas en Proxy en las que se apoya.

Los proxies de Bright Data son utilizados por empresas del Fortune 500 y más de 20.000 clientes. Esta fiable red de proxies mundial incluye: