Guía de instalación y configuración de Browser-use

En la era digital en la que vivimos, existen millones de webs que generan una cantidad masiva de contenido diario. Por eso, es muy común sentirse abrumado ante tanta información disponible a golpe de un solo clic. Esta sobrecarga informativa se acentúa aún más cuando queremos cribar dicha información. Cuando ese filtrado se realiza de forma manual, no solo es una tarea titánica, sino que también resulta totalmente ineficiente.

Por esa razón, y para abordar este problema, hace ya tiempo surgieron herramientas especializadas en la extracción de datos web. Entre ellas BeautifulSoup, que facilita la obtención de información de sitios estáticos analizando su HTML, y otras como Selenium o playwright, que permiten automatizar interacciones con un navegador para manejar sitios dinámicos.

Sin embargo, la aparición de la Inteligencia Artificial y los LLM ha revolucionado todo este paradigma. Gracias a Browser-use, se pueden conseguir cosas que hasta hace poco tiempo solo estaban en nuestra imaginación. Esta herramienta posibilita la integración de modelos LLM para automatizar la interacción con páginas web. De esta forma, nos permite avanzar de manera significativa en el proceso de obtención, filtrado y análisis de la información procedente de la web.

Tras conocer el problema que Browser-use pretende resolver, veamos cómo usarlo y de qué manera puede transformar la forma en la que extraemos y analizamos datos.

¿Qué es Browser-use?

Browser-use es una herramienta de web scraping que permite automatizar el proceso de navegación web de una forma natural. El procedimiento es muy similar al que haría un humano mediante la integración de modelos de lenguaje (LLM).

En este sentido, Browser-use cambia por completo la forma en la que nos acercamos al web scraping. Anteriormente, este proceso se realizaba de distintas formas. O bien mediante la interacción directa con el DOM, o a través de selectores de CSS que debíamos conocer previamente para ejecutar secuencialmente las órdenes que queríamos tal y como lo haría un humano.

Esto causaba muchos dolores de cabeza. No solo porque requería investigar manualmente cuál era la estructura de la página web en cuestión e implementar un código ad-hoc que interactuara con los elementos especificados. Además, en la mayoría de los casos, las páginas web cada cierto tiempo son modificadas. Estos cambios de nombres de elementos o reestructuraciones del DOM hacen que nuestro código, que es sensible a estas pequeñas modificaciones, deje de funcionar y no ejecute las tareas que le encomendamos.

Sin embargo, el funcionamiento de Browser-use es diferente. Los LLMs interpretan el contenido de la página y toman decisiones sobre los pasos que creen convenientes para alcanzar el objetivo propuesto en el prompt. Esto es algo increíble, porque Browser-use no solo automatiza la interacción con la web. Además, comprende el contexto y el propósito de cada acción a realizar y la modifica sin necesidad de interacción humana.

Tras analizar este tipo de tecnología desde un punto de vista teórico, veremos cómo instalarla y configurarla para usarla en nuestros proyectos.

Browser-use: Instalación, configuración y ejemplo

A continuación, veremos un ejemplo práctico de cómo automatizar el proceso de descarga de una tabla desde una página pública de Kaggle.

En primer lugar, instalaremos y configuraremos Browser-use así como todas las dependencias necesarias. Después, veremos el código que debemos crear para pasarle un prompt a Browser-use y que ejecute la búsqueda y descarga de la tabla en concreto.

Instalación y configuración básica

Tras analizar qué es Browser-use y ver el proyecto que llevaremos a cabo, procederemos a su instalación y configuración. En este punto, y a lo largo del artículo, trataremos de hacer la explicación más práctica y nos centraremos en la creación de código para descargar una tabla aleatoria de Kaggle.

Instalación de Browser-use con Gemini

Para no complicar en exceso este punto, mostraremos cómo se instala Browser-use usando una API de Gemini. Dicha API es gratuita y se puede obtener fácilmente desde la página oficial de Google. Para obtenerla, solo es necesario registrarse con un correo electrónico. 

No obstante, también es posible hacer la implementación con Ollama. En este caso, nos aportaría aún más independencia porque dejaríamos de necesitar servicios de terceros y pasaríamos a ejecutarlo todo en local. Sin embargo, para no añadir complejidad, abordaremos esta casuística en otro artículo más avanzado.

Lo primero, como siempre, es instalar las dependencias necesarias para que funcione correctamente. En este caso, necesitaremos browser-use y playwright. Además, como se usará la API de Gemini, también requiere langchain-google-genai.

Para instalarlas, se puede ejecutar todo con un único comando:

pip install browser-use playwright langchain-google-genai

Por otro lado, dado que Browser-use utiliza playwright, también necesitaremos Chromium. Procederemos, por tanto, a instalarlo con el siguiente comando:

playwright install chromium

Con esto, ya tenemos todas las dependencias necesarias para ejecutar Browser-use usando Gemini como motor LLM.

Primeros pasos para configurar Browser-use

El siguiente paso será configurarlo correctamente para que podamos ejecutarlo sin ningún problema. Para ello, lo primero de todo será establecer en nuestro fichero de variables cuál es la API key. Esta API key se genera una vez que nos hayamos registrado en Google AI Studio.

Captura de pantalla de la plataforma Google AI Studio para la generación de una API key

En caso de que vayamos a usar una base de datos, como Postgres, para persistir la información que vayamos obteniendo hay que especificar las credenciales necesarias para la conexión.

En este caso, solo descargaremos un fichero de una web. Por tanto, generar una base de datos no será necesario. Teniendo esto en cuenta, el fichero .env deberá contener lo siguiente:

# API
GOOGLE_API_KEY=<Your_api_key>

Ahora, ya tenemos todo lo indispensable para poder empezar a desarrollar el código.

Cómo extraer datos con Browser-use

Después de haber instalado las dependencias y configurado el repositorio, es el momento de empezar a generar el código.

Configurar el navegador

Lo primero que debemos establecer es la configuración de la sesión del navegador. Esto lo conseguimos usando la clase BrowserSession, que se encarga de gestionar el entorno de navegación automatizado. 

Existen diferentes configuraciones que se pueden personalizar en este apartado. Algunas de ellas son, por ejemplo:

  • Modo de ejecución (headless). Con este parámetro, podemos especificar si queremos que el navegador se ejecute en segundo plano (True) o que sea visible (False).
  • Tamaño de ventana del navegador (viewport). Muy útil para simular diferentes dispositivos.
  • Directorio de almacenamiento de datos (user_data_dir). La ruta especificada será donde se almacenen las cookies, sesiones y otros datos persistentes que sean necesarios durante la ejecución.
from browser_use import BrowserSession

browser_session = BrowserSession(
    headless=True,
    viewport={'width': 964, 'height': 647},
    user_data_dir='~/.config/browseruse/profiles/default',
)

Identificar datos sensibles

Cuando hayamos configurado el navegador, lo siguiente sería definir la tarea que queremos llevar a cabo. Para ello, primero hay que identificar los datos que vamos a usar y que son sensibles (como contraseñas y nombres de usuario). Por motivos de seguridad y privacidad, no es recomendable enviar estos datos directamente al modelo de lenguaje (LLM).

Browser-use proporciona una manera segura de manejar esta situación. Ofrece una variable llamada sensitive_data, un diccionario que permite establecer todos los datos que queremos proteger. 

En este caso, por seguridad no queremos que el modelo vea nuestro email, password y el dataset. Por tanto, generamos el siguiente código:

sensitive_data = {
    'kaggle_email': kaggle_email,
    'kaggle_password': kaggle_password,
    'dataset': dataset_name
}

Así pues, estos valores se referencian dentro del prompt a través de una sintaxis especial (como kaggle_email, kaggle_password y dataset), sin exponer la información sensible al modelo de lenguaje. Por supuesto, estos valores deben estar reflejados en el fichero .env para que puedan ser ejecutados.

Establecer el prompt

Una vez hemos configurado el navegador y establecido los datos sensibles, el siguiente paso es definir la tarea que queremos ejecutar. 

Para ello, detallaremos el prompt en una variable que llamaremos task_description, que contendrá el prompt de la tarea. Además, en ella usaremos la sintaxis mostrada en el apartado anterior para hacer referencia a los datos sensibles que no queremos pasar al modelo.

En nuestro ejemplo concreto, definiremos la variable de la siguiente manera:

task_description = (
"Navigate to https://www.kaggle.com/, sign in whith kaggle_email and kaggle_password"
"Search the Dataset named dataset in kaggle and download it as zip file."
"Finally log out of Kaggle and wait 5 seconds before continuing."
)

Inicializar el modelo

Dado que en nuestro caso usaremos Gemini como modelo LLM, debemos configurarlo de la siguiente manera. En primer lugar, hay que cargar las variables que definimos anteriormente en el fichero .env, pues ahí es donde hemos establecido nuestra API key.

Posteriormente, inicializamos el modelo con el siguiente código:

from langchain_google_genai import ChatGoogleGenerativeAI
from dotenv import load_dotenv

load_dotenv()

gemini_llm = ChatGoogleGenerativeAI(model='gemini-2.0-flash-exp')

Configurar el agente

Por último, tras configurar el navegador, establecer los datos confidenciales, generar el prompt e inicializar el modelo LLM, hay que crear el agente. Antes de hacerlo, es importante saber qué es y qué función tiene.

El agente es quien realmente interactúa con las páginas webs. Dicho de otra manera, usa los modelos de LLM que le hayamos proporcionado para tomar decisiones en tiempo real. Dichas decisiones estarán basadas en el contenido que encuentre para alcanzar el objetivo que se le haya especificado en el prompt. 

Una vez que sabemos qué es un agente, vamos a definirlo en nuestro código:

from browser_use import Agent

agent = Agent(
      task=task_description,
      llm=gemini_llm,
      max_actions_per_step=8,
      use_vision=True,
      browser=browser_session,
      generate_gif=False,
      sensitive_data=sensitive_data,
)

Como se puede observar, además de la tarea a ejecutar (task), el modelo utilizado (llm), la configuración del browser (browser) y los datos sensibles que necesitamos (sensitive_data), existen otros parámetros interesantes que pueden hacer al agente más robusto:

  • max_actions_per_step. Establece el límite de acciones por cada paso de ejecución del agente.
  • use_vision. Permite al agente interpretar imágenes. Esto resulta muy útil especialmente en webs modernas.
  • generative_gif. Opción para generar una grabación en formato gif del proceso. Esta funcionalidad es útil en algunos casos, pero en nuestro ejemplo concreto no aporta valor.

Ejecutar el código

Con toda la configuración ya lista, lo último que falta es ejecutar la tarea. Para ello, simplemente debemos añadir el método run() al final de nuestro script. Esto iniciará todo el proceso cuando se ejecute.

agent.run()

Estructura final

Por último, solo queda introducir todo el código en un método main() y establecer un disparador para que se ejecute correctamente cuando llamemos al script. El código final quedaría de la siguiente manera:

from browser_use import BrowserSession, Agent
from langchain_google_genai import ChatGoogleGenerativeAI
from dotenv import load_dotenv
import os

def main():
    load_dotenv()

    kaggle_email = os.getenv("KAGGLE_EMAIL")
    kaggle_password = os.getenv("KAGGLE_PASSWORD")
    dataset_name = os.getenv("KAGGLE_DATASET")

    browser_session = BrowserSession(
        headless=True,
        viewport={'width': 964, 'height': 647},
        user_data_dir='~/.config/browseruse/profiles/default',
    )

    sensitive_data = {
        'kaggle_email': kaggle_email,
        'kaggle_password': kaggle_password,
        'dataset': dataset_name,
    }

    gemini_llm = ChatGoogleGenerativeAI(model='gemini-2.0-flash-exp')

    task_description = (
        "Navigate to https://www.kaggle.com/, sign in with kaggle_email and kaggle_password. "
        "Search the dataset named dataset in Kaggle and download it as a zip file. "
        "Finally, log out of Kaggle and wait 5 seconds before continuing."
    )

    agent = Agent(
        task=task_description,
        llm=gemini_llm,
        max_actions_per_step=8,
        use_vision=True,
        browser=browser_session,
        generate_gif=False,
        sensitive_data=sensitive_data,
    )

    agent.run()

if __name__ == "__main__":
    main()

Ahora, ya podemos ejecutar el código únicamente lanzando el script desde nuestra terminal.

Conclusión

Como hemos podido comprobar, Browser-use es una herramienta que permite llevar el web scraping al siguiente nivel. Es capaz de integrar de manera sencilla y rápida los modelos de lenguaje (LLMs) para interactuar con las páginas webs, aportando flexibilidad y dinamismo a todo el proceso.

Además, esta nueva herramienta abre un gran abanico de posibilidades en el plano de la automatización de tareas. Mediante unas pocas líneas de código, podemos aprovechar todo el potencial de estos modelos, consiguiendo una robustez muy difícil de obtener con otras herramientas.

En definitiva, Browser-use ha venido a revolucionar la manera en la que se hace web scraping. Esta herramienta promete ser una alternativa muy poderosa para la automatización de procesos que requieran esta clase de integración.

Hasta aquí nuestro post de hoy. Si te ha parecido interesante, te animamos a visitar la categoría Software para ver artículos similares y a compartirlo en redes con tus contactos. ¡Hasta pronto!

Luís Galdeano
Luís Galdeano
Artículos: 8