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:

¡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:
- Proxies de centro de datos – Más de 1,300,000+ IPs de centros de datos.
- Proxies residenciales – Más de 400M+ IPs residenciales en más de 195 países.
- Proxies ISP – Más de 1,300,000+ IPs ISP.