Cómo ejecutar un navegador sin cabeza con Python para Web Scraping: Consejos y Trucos
Mihnea-Octavian Manolache el 03 Feb 2023

El uso de un navegador sin cabeza Python con Selenium es casi la norma en el web scraping. Pero, ¿qué es realmente un navegador headless? ¿Y cuál es el mejor navegador headless para Selenium? ¿Y por qué usar un navegador headless en Python cuando tienes `requests`? Bueno, hay muchas preguntas sobre este tema. Lo que significa que tenemos muchas respuestas que descubrir juntos. Pero antes de profundizar, tracemos algunos objetivos de aprendizaje. Al final de este artículo, deberías ser capaz de:
- Entender qué es un navegador headless y sus casos de uso
- Saber cómo abrir un navegador headless en Python
- Crear un raspador web con Python y Selenium
Y por último, también hablaremos de alternativas a los navegadores sin cabeza de Python. Aunque la atención se centra en Python, mi objetivo es descubrir la mejor solución de scraping. Y eso tiene en cuenta el tiempo de respuesta, los recursos utilizados, etc. Así que, sin más preámbulos, ¡entremos en materia!
¿Qué significa navegador sin cabeza Python?
A grandes rasgos, un navegador es un programa informático que permite a los usuarios navegar e interactuar con una página web. Un navegador headless es exactamente eso, pero sin interfaz gráfica de usuario. Esto significa que un navegador sin cabeza Python es un programa que puede:
- Navegar a cualquier sitio de Internet
- Renderizar archivos JavaScript servidos por el sitio web
- Interactuar con los componentes de esa página web
El hecho de que no haya una interfaz gráfica de usuario asociada plantea algunas dudas sobre la interacción. Sin embargo, la respuesta es bastante sencilla. Al no haber GUI, los humanos no pueden interactuar directamente con la página. Y ahí es donde entran en juego los controladores web. Un controlador web es una interfaz que permite la introspección y el control. En pocas palabras, los controladores web son marcos que nos permiten controlar mediante programación varios navegadores web.
Hay un par de frameworks que permiten la automatización del navegador en Python. Pero el principal es Selenium. Selenium es un conjunto de herramientas construidas principalmente para pruebas automatizadas. Pero en la práctica, es ampliamente utilizado para web scraping también.
¿Por qué utilizar un navegador headless en Python?
Según la cabecera de la página principal de Selenium:
"Selenium automatiza los navegadores. Eso es todo. Lo que hagas con ese poder depende enteramente de ti".
Esto nos lleva a pensar que los navegadores automatizados tienen varios casos de uso. Pero, ¿por qué ejecutarlos en modo headless? Bueno, la respuesta es una vez más simple. Un navegador Python headless utiliza menos recursos (CPU y memoria) en comparación con un navegador headful. Y eso se debe principalmente a que no hay elementos gráficos que dibujar.
De nuevo, menos es más cuando se compara con un cliente HTTP básico como `requests` de Python, por ejemplo. Y eso es porque el navegador sin cabeza todavía abre muchos procesos para interactuar con la página y renderizar archivos JavaScript. Como sabes, `requests` es incapaz de renderizar JavaScript. Sólo puede obtener HTML sin procesar usándolo. Y en los tiempos modernos, eso no es suficiente para el web scraping. La mayoría de las plataformas web modernas dependen en gran medida de JavaScript para rellenar el DOM. Por ejemplo, si intentas `curl` una aplicación React, obtendrás una página web vacía que te pedirá que "habilites JavaScript":
<!doctype html>
<html lang="en">
<head>
...
</head>
<body>
<noscript> You need to enable JavaScript to run this app. </noscript>
<div id="root"></div>
</body>
</html>
Mientras que no puedes hacer eso con `requests`, puedes hacerlo con un navegador headless. Y eso responde a una de nuestras preguntas iniciales. Los raspadores web modernos utilizan navegadores sin cabeza en lugar de peticiones porque, de lo contrario, la respuesta no sería concluyente.
¿Cuáles son los inconvenientes de un navegador sin cabeza?
La principal desventaja de un navegador sin cabeza Python (y en su mayoría todos los navegadores automatizados) es su huella digital. Si sigues mis artículos, sabrás que a veces hablo de sigilo. Esa es la habilidad de un navegador automatizado para pasar desapercibido.
Y en Python, los navegadores headless son fácilmente distinguibles. Para empezar, comprobar una simple propiedad del navegador como `navigator.webdriver` es una forma instantánea de saber si un navegador está controlado por un controlador web. En el web scraping, uno de los principales retos es encontrar formas de evitar la detección. A esto lo llamamos métodos o técnicas de evasión. Puede leer más sobre ello aquí.
En Web Scraping API, por ejemplo, tenemos un equipo dedicado trabajando constantemente en nuestro Modo Stealth. Eso es para asegurar que la huella digital de nuestro navegador es única e indetectable con cada solicitud.
Navegadores sin cabeza disponibles con Python Selenium
En primer lugar, debes saber que Selenium es muy potente. Y ni siquiera se limita a Python. Hay clientes Selenium y controladores web para C#, Ruby, Java, Python e incluso JavaScript. Y el soporte del controlador web de Selenium es aún más impresionante. Soporta los principales navegadores:
En el mundo del web scraping, los navegadores Python headless más utilizados son Chrome y Firefox. Creo que esto se debe principalmente a que estos dos navegadores son de alto rendimiento y multiplataforma. Por ejemplo, puedes desarrollar tu proyecto de web scraping en un entorno MacOS y luego desplegarlo fácilmente en Linux.
Cómo abrir un navegador headless en Python
Ahora que hemos cubierto algunos conceptos teóricos, creo que es seguro seguir adelante y explorar la parte práctica. En esta sección, te mostraré cómo construir un raspador web con Selenium. Para este proyecto, asegúrese de que su máquina está equipada con python y Chrome.
#1: Configurar el entorno
Como de costumbre, en Python debemos encapsular todo dentro de un entorno virtual. Si no estás familiarizado con los entornos virtuales, lee esto primero. Ahora vamos a abrir una nueva ventana de terminal y vamos a:
- Crear una nueva carpeta
- Navegue hasta la carpeta
- Crear un nuevo entorno virtual
- Activa el entorno virtual
~ mkdir headless_scraper
~ cd headless_scraper
~ python3 -m venv env
~ source env/bin/activate
#2: Instalar dependencias
Es bastante sencillo que necesitamos Selenium y un controlador web para nuestro proyecto. Por suerte, podemos instalar ambos usando el gestor de paquetes de Pyhton, `pip`. Dentro de la misma ventana de terminal, escribe el siguiente comando:
~ pip install selenium webdriver-manager
Ahora ya estás preparado para el éxito. Podemos pasar a la codificación real. Descargo de responsabilidad rápida, este artículo se centra en la interacción con un navegador sin cabeza. Una solución completa de web scraping requiere mucho más esfuerzo. Pero estoy seguro de que si usted sigue nuestras entradas del blog se puede lograr en poco o ningún tiempo.
#3: Abrir un navegador automatizado
Hasta ahora, tenemos el proyecto, pero no hay ningún archivo que podamos ejecutar. Vamos a crear un nuevo archivo `.py` y abrirlo en nuestro IDE:
~ touch headles_scraper.py
~ code .
Ahora deberías estar dentro de Visual Studio Code o tu IDE. Puedes empezar importando los paquetes necesarios dentro de `handle_scraper.py`:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
Este último es un paquete que le ayuda a gestionar fácilmente los controladores web para los diferentes navegadores soportados por Selenium. Puedes leer más sobre él aquí. A continuación, queremos crear un nuevo navegador con selenio y abrir un sitio web:
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://webscrapingapi.com')
Ejecuta este archivo ahora y verás que funciona. Pero en lugar de usar un navegador sin cabeza de Python, abre una ventana de Chrome con cabeza:

#4: Hacer en headless
Nos propusimos construir un raspador web de recursos amigables. Así que idealmente, queremos abrir un navegador headless con Selenium. Afortunadamente, hay un método fácil que podemos utilizar para cambiar Selenium de headful a headless. Sólo tenemos que hacer uso de las opciones del controlador web de Chrome. Así que vamos a importar `Options` y añadir dos líneas más de código:
...
from selenium.webdriver.chrome.options import Options
...
options = Options()
options.headless = True
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.get('https://webscrapingapi.com')
Ejecute de nuevo el script. Como puedes ver, esta vez no aparece ninguna ventana. Pero, ¿está realmente funcionando en segundo plano? Una forma rápida de visualizarlo y comprobarlo es hacer una captura de pantalla utilizando Selenium. Sólo tienes que añadir esta línea al final de tu script:
driver.get_screenshot_as_file('headless.png')
Si todo ha ido bien, deberías tener la misma imagen que yo:

#5: Añadir funciones de scraping
¿Qué es un web scraper? Bueno, en esencia, un web scraper es un programa que llama a un endpoint de un servidor y recoge datos de él. En el caso de los sitios web, estos datos suelen consistir en archivos HTML. Pero hoy en día algunos servidores también sirven objetos JSON. Así que vamos a ceñirnos a este término: datos. Para la siguiente sección, vamos a fijar nuestros objetivos más alto. Usemos un poco de programación orientada a objetos. Nuestros objetivos son:
- Crear una clase Scraper
- Añadir un método para extraer datos sin procesar
- Añadir un método para extraer datos de un solo elemento
- Añadir un método para extraer datos de elementos de la misma clase
Así que tenemos tres métodos básicos que queremos construir. Sin embargo, para propósitos de aprendizaje, estos tres métodos están abriendo un camino no sólo al web scraping, sino a la programación orientada a objetos con Python. ¡Y creo que eso es genial! Ahora vamos a eliminar todo lo que hemos codificado y vamos a empezar de cero:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webelement import WebElement
class Scraper:
def __init__(self, headless: bool = True) -> None:
self.headless = headless
pass
def setup_scraper(self) -> None:
self.options = Options()
self.options.headless = self.headless
self.driver = webdriver.Chrome(options=self.options)
def navigate(self, target) -> None:
self.driver.get(target) if target else print('[!] No se ha dado ningún objetivo. Por favor, especifique una URL.')
def extract_raw_data(self) -> str:
return self.driver.page_source
def extract_single_element(self, selector: str, selector_type: By = By.CSS_SELECTOR) -> WebElement:
return self.driver.find_element(selector_type, selector)
def extract_all_elements(self, selector: str, selector_type: By = By.CSS_SELECTOR) -> list[WebElement]:
return self.driver.find_elements(selector_type, selector)
He añadido anotaciones de tipo para facilitar la comprensión, más que el rendimiento. De esta manera, usted puede realmente visualizar la aplicación desde una perspectiva de E / S. Ahora, los métodos se explican por sí mismos. No estamos realizando ningún tipo de acción sobre los datos, sólo los estamos devolviendo. Si quieres, eso puede ser un punto de partida para que construyas un scraper complejo con un navegador headless de Python.
Hasta ahora, ejecutar el archivo no hace nada. Eso es porque sólo hemos declarado nuestro Scraper y sus métodos. Ahora tenemos que usarlos. Así que vamos a añadir los siguientes trozos de código:
# Inicializar un nuevo Scraper y navegar a un objetivo
scraper = Scraper()
scraper.setup_scraper()
scraper.navigate('https://httpbin.org')
# Extraer e imprimir todo el documento HTML
raw_data = scraper.extract_raw_data()
print(raw_data)
# Extraer e imprimir un elemento por su nombre de clase
single_element = scraper.extract_single_element('title', By.CLASS_NAME)
print(single_element.text)
# Extraer e imprimir todos los elementos pertenecientes a un tipo de etiqueta
all_elements = scraper.extract_all_elements('a', By.TAG_NAME)
print([el.get_attribute('href') for el in all_elements])
Y ya está. Si ejecutas tu script ahora, podrás ver alguna acción sucediendo. De nuevo, esto es simplemente un prototipo diseñado para que empieces. Si quieres aprender más acerca de cómo un navegador sin cabeza Python puede ser utilizado en web scraping, te reto a hacerlo:
- Lea la documentación de Selenium
- Añadir más funcionalidad al script que hemos construido hoy
De este modo, adquirirás conocimientos y añadirás un proyecto a tu cartera.
¿Cuáles son las mejores alternativas a los navegadores sin cabeza de Python?
Python es uno de los lenguajes de programación más populares para construir raspadores web. Sin embargo, no es la única solución. Tampoco es la mejor. En esta sección, discutiremos alternativas a un navegador sin cabeza Python. Empezaremos con el porqué de las soluciones alternativas y también veremos ejemplos concretos.
La razón principal por la que usted optaría por una alternativa a la construcción de un raspador web Python usted mismo son los recursos. Una solución completa de web scraping requiere implementar un sistema de rotación de IP, algunas técnicas de evasión, tener en cuenta el rendimiento, y eso es sólo por nombrar algunos. Así que la construcción de un raspador web no sólo es caro, sino que también consume mucho tiempo. Por no mencionar que el mantenimiento de la infraestructura genera aún más costes.
El segundo inconveniente del navegador sin cabeza Python tiene que ver con el rendimiento. Mientras que Python es un gran lenguaje y es muy fácil de usar, no es conocido específicamente por su velocidad. A diferencia de Java, por ejemplo (que también tiene un paquete Selenium), Python es de tipado dinámico e interpretado. Estas dos características hacen que sea mucho más lento en comparación con otros lenguajes. Ahora que tenemos una idea general, seamos específicos. Aquí están las 5 mejores alternativas a Selenium y al navegador sin cabeza de Python:
#1: API de raspado web
Si desea abordar el primer inconveniente que hemos identificado, entonces usted necesita mirar en los proveedores de raspado de terceros. Y Web Scraping API cuenta con una suite completa de raspado. Además, nuestro servicio está repleto de características como:
- Sistema de rotación de IP para centros de datos y proxies residenciales
- Modo oculto
- Solucionadores de captchas
Estas tres características por sí solas hacen casi imposible que un objetivo alcance a nuestro scraper y lo bloquee. Y luego están las funciones de raspado. Con Web Scraping API, puede extraer datos basados en selectores, cambiar entre tipos de dispositivos, tomar capturas de pantalla y muchas más. Una lista completa de características se puede encontrar aquí.
#2: Titiritero
Puppeteer es el equivalente de Selenium para JavaScript. Es una de las librerías más utilizadas para la automatización web. A diferencia de Selenium, el estado por defecto de Puppeteer es headless. Asi que no necesitas agregar codigo extra para hacerlo headless. Lo que es aún más interesante es que también hay una implementación de la API de Puppeteer para Python. Puedes consultar este blog donde profundizo sobre la construcción de un web scraper con Pyppeteer.
#3: Dramaturgo
Playwright es otra herramienta de automatización web desarrollada por colaboradores de Microsoft. Es popular principalmente porque ofrece soporte para varios idiomas y plataformas. Su lema es "Cualquier navegador, cualquier plataforma". Se puede acceder a su API en cualquier sistema operativo y con cualquiera de los siguientes lenguajes:
Estas son las principales alternativas a un navegador sin cabeza de Python. Pero también hay otras herramientas disponibles. ZombieJS o HtmlUnit son sólo dos más de una lista de muchas. Supongo que elegir una tecnología es tanto una cuestión de rendimiento como de preferencia personal. Así que te animo a que las pruebes todas y elijas tu favorita.
Conclusiones
Utilizar un navegador headless de Python tiene sus pros y sus contras. Por un lado, puedes construir una solución personalizada a la que siempre puedes añadir más funciones. Por otro lado, el desarrollo y el mantenimiento pueden ser bastante caros. Y también está la cuestión del sigilo. Si necesitas una solución profesional, creo que lo mejor es que recurras a un proveedor externo. De lo contrario, para aprender, siempre te animaré a que juegues con la tecnología.
Noticias y actualidad
Manténgase al día de las últimas guías y noticias sobre raspado web suscribiéndose a nuestro boletín.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Artículos relacionados

Recopile sin esfuerzo datos en tiempo real de los motores de búsqueda mediante la API SERP Scraping. Mejore el análisis de mercado, el SEO y la investigación temática con facilidad. ¡Empiece hoy mismo!


Explore las complejidades del scraping de datos de productos de Amazon con nuestra guía en profundidad. Desde las mejores prácticas y herramientas como Amazon Scraper API hasta las consideraciones legales, aprenda a superar los desafíos, eludir los CAPTCHA y extraer información valiosa de forma eficiente.


Explore la comparación en profundidad entre Scrapy y Selenium para el scraping web. Desde la adquisición de datos a gran escala hasta la gestión de contenido dinámico, descubra los pros, los contras y las características únicas de cada uno. Aprenda a elegir el mejor marco de trabajo en función de las necesidades y la escala de su proyecto.
