¡Hola, agente en entrenamiento! Emma aquí, de nuevo en agent101.net, y hoy vamos a hablar de algo que ha estado por debajo de la superficie durante un tiempo, pero que finalmente está tomando impulso: hacer que los agentes de IA realmente hagan cosas por ti, incluso si solo estás comenzando. En específico, vamos a ver cómo hacer que un agente de IA simple monitoree una parte específica de Internet y te avise cuando algo cambie. Piénsalo como tu sabueso digital personal, pero mucho menos desordenado.
Durante meses, he estado experimentando con varias herramientas de IA, tratando de llevarlas más allá de solo escribirme poemas graciosos o resumir artículos. Quería que fueran proactivas. ¡Quería que fueran… agentes! Pero cada vez que miraba un tutorial, sentía que necesitaba un título en informática y un fin de semana libre solo para configurar el entorno. Frustrante, ¿verdad?
Entonces, hace unas semanas, estaba intentando rastrear el lanzamiento de un producto específico: un nuevo dispositivo para el hogar inteligente que simplemente tenía que tener. Era una de esas cosas que aparecían sin mucho aviso, y el stock se desvanecía en minutos. Actualizar la página cada cinco minutos me estaba volviendo loco. Mis dedos dolían, mis ojos estaban borrosos y mi ingesta de café estaba peligrosamente alta. Fue entonces cuando se me iluminó la bombilla: esta es exactamente la clase de tarea repetitiva que requiere vigilancia para la cual un agente de IA es perfecto. Y encontré una forma de hacerlo que incluso yo, un blogger de tecnología que se autodenomina “se confunde con YAML a veces”, podía manejar. Sin frameworks elaborados, sin bibliotecas oscuras, solo un poco de Python y una buena comprensión de lo que un asistente de IA puede hacer por ti.
Así que hoy, vamos a construir un agente de IA simple que monitorea una página web en busca de un cambio específico y te notifica. No se trata de construir el próximo Skynet; se trata de resolver un problema real y cotidiano con un toque de magia de IA. Y créeme, si yo puedo hacerlo, tú también puedes.
¿Qué es un Agente de Monitoreo de IA Simple?
En su núcleo, un agente de monitoreo de IA es solo un programa que observa algo y reacciona cuando se cumplen ciertas condiciones. En nuestro caso, va a observar una página web. ¿Por qué “agente de IA” y no solo “script”? Bueno, la parte de “IA” entra cuando comenzamos a pensar en cómo interpreta los cambios y en cómo decide qué es importante. Para este tutorial para principiantes, vamos a mantener la IA bastante ligera; piénsalo como usar un modelo de IA para ayudarnos a entender el texto, no necesariamente para tomar decisiones complejas. La parte de “agente” es el bucle: observar, pensar (un poco), actuar, repetir.
Mi objetivo con este agente fue simple: quería saber el *instante* en que la página del producto de ese dispositivo para el hogar inteligente cambiara de “Agotado” a “Disponible”. No quería recibir spam con cada pequeña actualización, solo esa única pieza crucial de información. Sin embargo, esto no es solo para lanzamientos de productos. Imagina rastrear ofertas de trabajo, artículos de noticias sobre un tema específico, cambios en los precios de los competidores, o incluso actualizaciones de tu webcómic favorito. Las posibilidades son bastante interesantes una vez que te acostumbras.
Las Herramientas que Necesitaremos (No Te Asustes, Son Mínimas)
- Python: Si no lo tienes, ve a conseguirlo. Es gratis y relativamente fácil de usar.
- Algunas bibliotecas de Python: Usaremos
requestspara obtener páginas web,BeautifulSouppara analizar HTML, y potencialmente una forma de enviar notificaciones (comosmtplibpara correo electrónico o un webhook simple). - Un modelo de IA (opcional pero útil): Para esto, voy a asumir que tienes acceso a algo como la API de OpenAI o la API de Gemini de Google. Lo usaremos para detectar cambios de manera inteligente en lugar de simplemente hacer coincidencias de texto. Aquí es donde la “IA” realmente entra en juego más allá de solo un script.
- Un editor de texto: VS Code, Sublime Text, incluso Notepad si te sientes a la antigua.
¿Ves? Nada muy intimidante. No estamos configurando servidores ni configurando servicios en la nube intrincados. Todo esto es local, en tu máquina, justo como lo hice yo.
Paso 1: Obteniendo el Contenido de la Página Web
Primero lo primero, nuestro agente necesita “ver” realmente la página web. Usaremos la biblioteca requests para esto. Es como tu navegador, pero sin los gráficos elegantes; solo obtiene el HTML en bruto.
import requests
def fetch_page_content(url):
try:
response = requests.get(url)
response.raise_for_status() # Esto generará un HTTPError para respuestas malas (4xx o 5xx)
return response.text
except requests.exceptions.RequestException as e:
print(f"Error al obtener la URL {url}: {e}")
return None
# Probemos con una URL de prueba (reemplaza con tu objetivo real)
# Para este ejemplo, usaré un marcador de posición. NUNCA raspees sin revisar el robots.txt del sitio
# y los términos de servicio. ¡Sé respetuoso y no sobrecargues los servidores!
target_url = "https://example.com/product-page" # REEMPLAZA ESTO CON TU OBJETIVO REAL
current_content = fetch_page_content(target_url)
if current_content:
print("Contenido obtenido con éxito. Primeros 200 caracteres:")
print(current_content[:200])
else:
print("Error al obtener el contenido.")
Cuando escribí esto por primera vez, realmente intenté obtener una página que bloqueaba solicitudes automatizadas. Tuve un error 403. ¡Vaya! Tuve que encontrar un sitio objetivo diferente o averiguar cómo agregar encabezados para imitar un navegador. Para este tutorial, supongamos que el sitio que estás apuntando está bien con solicitudes básicas. Siempre revisa el archivo robots.txt del sitio (por ejemplo, https://example.com/robots.txt) para ver lo que permiten y lo que no para los rastreadores. ¡El raspado ético es importante!
Paso 2: Analizando el HTML para Encontrar lo Que Importa
Una vez que tenemos el HTML en bruto, es un lío de etiquetas y texto. Necesitamos extraer la parte específica que indica “Disponible” o “Agotado”. Aquí es donde entra BeautifulSoup. Nos ayuda a navegar la estructura HTML como un mapa.
Esta fue la parte más complicada para mí. Cada sitio web es diferente. Tienes que abrir la página objetivo en tu navegador, hacer clic derecho en el elemento que te interesa (como el texto “Disponible”) y seleccionar “Inspeccionar” o “Inspeccionar Elemento”. Esto te mostrará el código HTML para esa parte específica. Busca identificadores únicos como IDs o nombres de clase.
from bs4 import BeautifulSoup
def extract_relevant_info(html_content):
if not html_content:
return "No hay contenido para analizar."
soup = BeautifulSoup(html_content, 'html.parser')
# Esto es muy específico para la página web que estás monitoreando.
# TENDRÁS QUE CAMBIAR ESTO.
# Ejemplo: Buscando un div con una clase específica, o un span con un texto específico.
# Para mi página de producto, el estado de stock a menudo estaba en una etiqueta con una clase como "product-status"
# Intenta encontrar un span o div que contenga el estado del stock
stock_element = soup.find('span', class_='product-status') # Ajusta el nombre de clase basado en tu inspección
if not stock_element:
stock_element = soup.find('div', id='stock-indicator') # Ajusta el ID basado en tu inspección
if stock_element:
return stock_element.get_text(strip=True)
else:
# Si no podemos encontrar el elemento específico, devuelve un trozo más grande o incluso todo el cuerpo
# y deja que el modelo de IA lo averigüe. Esta es una buena alternativa.
body_content = soup.find('body')
if body_content:
return body_content.get_text(separator=' ', strip=True)
return "Elemento específico no encontrado, proporcionando el texto completo de la página (puede ser ruidoso)."
# Asumiendo que `current_content` es del paso anterior
relevant_text = extract_relevant_info(current_content)
print(f"Texto relevante extraído: {relevant_text[:200]}...") # Imprimir los primeros 200 caracteres
Mis intentos iniciales aquí fueron fracasos hilarantes. Intenté simplemente capturar toda la página y alimentársela a la IA, lo cual a veces funcionaba pero era realmente lento y costoso (¡las llamadas a la API no son gratis!). Luego intenté ser demasiado específico y perdí el elemento porque el nombre de la clase cambió ligeramente. La clave es encontrar un equilibrio: lo suficientemente específico para reducir el ruido, lo suficientemente general para manejar cambios menores en el diseño.
Paso 3: La Magia de la IA – Detectando Cambios Significativos
¡Ahora viene la parte divertida! En lugar de hacer una simple comparación de texto (que se activaría con cada pequeño cambio de anuncio), usaremos un modelo de IA para decirnos si el *significado* del texto relevante ha cambiado de manera significativa con respecto a nuestro interés (el estado del stock).
Para esto, necesitarás una clave de API para tu modelo de IA elegido (OpenAI, Gemini, etc.). ¡Guárdala de forma segura, no directamente en tu código!
import os
from openai import OpenAI # O `google.generativeai` si estás utilizando Gemini
# Configura tu clave API de OpenAI
# ¡NUNCA codifiques las claves API directamente! Usa variables de entorno o un archivo de configuración.
# os.environ["OPENAI_API_KEY"] = "TU_CLAVE_API_AQUÍ" # NO HAGAS ESTO EN CÓDIGO DE PRODUCCIÓN
# En su lugar, configúralo en tu terminal: export OPENAI_API_KEY="sk-..."
client = OpenAI() # Asume que OPENAI_API_KEY está configurado en las variables de entorno
def ask_ai_about_change(old_text, new_text, target_keyword="in stock"):
prompt = f"""
Eres un asistente inteligente monitoreando una página web en busca de cambios relacionados con la disponibilidad de productos.
Te proporcionaré dos versiones de texto extraídas de una página de producto.
Tu tarea es determinar si el estado de disponibilidad del producto ha cambiado significativamente,
específicamente si se ha convertido en '{target_keyword}' cuando anteriormente no lo era,
o si ha cambiado de '{target_keyword}'.
Texto antiguo:
"{old_text}"
Texto nuevo:
"{new_text}"
¿Ha cambiado la disponibilidad del producto a o desde '{target_keyword}'?
Si es así, explica brevemente el cambio. Si no, simplemente di 'No hay cambio significativo.'
Concéntrate solo en la disponibilidad, ignora cambios menores de redacción o formato.
"""
try:
completion = client.chat.completions.create(
model="gpt-3.5-turbo", # O "gpt-4", "gemini-pro", etc.
messages=[
{"role": "system", "content": "Eres un asistente útil."},
{"role": "user", "content": prompt}
],
max_tokens=150
)
return completion.choices[0].message.content
except Exception as e:
print(f"Error al llamar al modelo de IA: {e}")
return "El análisis de IA falló."
# Ejemplo de uso (normalmente lo harías en un bucle)
# Por ahora, simularemos un cambio
# Supongamos que 'previous_relevant_text' proviene de una obtención anterior
previous_relevant_text = "Agotado. Se espera reabastecimiento en 2 semanas."
new_relevant_text = "¡En stock! Cantidad limitada disponible."
ai_response = ask_ai_about_change(previous_relevant_text, new_relevant_text, "En stock")
print(f"Evaluación de la IA: {ai_response}")
# Simular sin cambio
new_relevant_text_no_change = "Agotado. Se espera reabastecimiento en 3 semanas."
ai_response_no_change = ask_ai_about_change(previous_relevant_text, new_relevant_text_no_change, "En stock")
print(f"Evaluación de la IA (simulación sin cambio): {ai_response_no_change}")
Este es el momento en que el agente realmente se convierte en “IA.” En lugar de escribir patrones regex complejos o comparaciones de cadenas frágiles, simplemente le digo a la IA qué tipo de cambio estoy buscando. ¡Es como tener un pequeño pasante que entiende el contexto! Cuando probé esto por primera vez, me preocupaba que la IA se confundiera con ligeras variaciones en la redacción. Pero con un buen prompt, resultó ser sorprendentemente eficaz. Identificó correctamente cuando “Próximamente” se convirtió en “¡Pre-ordenar ahora!” como un cambio significativo, incluso cuando las palabras exactas “En stock” no estaban presentes.
Paso 4: Integrándolo Todo – El Bucle del Agente y Notificación
Un agente necesita funcionar de manera continua. Así que envolveremos nuestra lógica de obtención y verificación en un bucle. ¡Y cuando encuentre algo, necesita informarnos!
import time
# ... (import requests, BeautifulSoup, os, OpenAI de pasos anteriores) ...
# Variable global para almacenar el último estado conocido
last_known_status_text = ""
def send_notification(message):
print(f"\n!!! ALERTA DEL AGENTE !!!\n{message}\n")
# Aquí integrarías con un servicio de notificación real:
# - Email (usando smtplib)
# - Servicio de notificación push (Pushover, IFTTT webhook, bot de Telegram)
# - Puerta de enlace SMS
# Para simplificar, solo lo imprimiremos en la consola.
# Ejemplo para correo electrónico (requiere configuración):
# import smtplib
# from email.mime.text import MIMEText
# msg = MIMEText(message)
# msg['Subject'] = '¡Cambio en la página web detectado!'
# msg['From'] = '[email protected]'
# msg['To'] = '[email protected]'
# try:
# with smtplib.SMTP_SSL('smtp.ejemplo.com', 465) as smtp:
# smtp.login('[email protected]', 'tu_contraseña')
# smtp.send_message(msg)
# print("Notificación por correo electrónico enviada.")
# except Exception as e:
# print(f"Error al enviar el correo: {e}")
def run_agent(url, interval_seconds=300, target_keyword="En stock"):
global last_known_status_text
print(f"El agente comienza a monitorear {url} cada {interval_seconds} segundos.")
print("Obtención inicial...")
# Obtención inicial para establecer la línea base
html_content = fetch_page_content(url)
if html_content:
last_known_status_text = extract_relevant_info(html_content)
print(f"Estado inicial establecido: {last_known_status_text[:100]}...")
else:
print("No se pudo obtener el contenido inicial. El agente comienza con una línea base vacía.")
# Si la obtención inicial falla, el agente volverá a intentarlo en la primera iteración del bucle
while True:
print(f"\n[{time.strftime('%Y-%m-%d %H:%M:%S')}] Comprobando {url}...")
current_html_content = fetch_page_content(url)
if current_html_content:
new_relevant_text = extract_relevant_info(current_html_content)
if not last_known_status_text: # Manejar el caso en el que la obtención inicial falló
last_known_status_text = new_relevant_text
print(f"Línea base establecida tras la falla inicial: {last_known_status_text[:100]}...")
if new_relevant_text != last_known_status_text:
print("Cambio potencial detectado. Preguntando a la IA...")
ai_analysis = ask_ai_about_change(last_known_status_text, new_relevant_text, target_keyword)
if "No hay cambio significativo." not in ai_analysis:
send_notification(f"Actualización de la página web para {url}:\n{ai_analysis}\nTexto Nuevo: {new_relevant_text[:200]}...")
last_known_status_text = new_relevant_text # Actualizar la línea base solo en caso de cambio significativo
else:
print(f"IA determinó: {ai_analysis} (menor, ignorado)")
# Incluso si la IA dice que no hay cambio significativo, podríamos querer actualizar la línea base
# para evitar alertas repetidas de "cambio potencial" para la misma diferencia menor.
# O, mantenerla como está si deseas que la IA reevalúe cada vez.
# Para este ejemplo, actualizaremos para evitar saturar a la IA por cambios menores estáticos.
last_known_status_text = new_relevant_text
else:
print("No se detectó cambio textual en la sección relevante.")
else:
print(f"Error al obtener contenido de {url} en esta iteración.")
time.sleep(interval_seconds) # Esperar antes de volver a comprobar
# --- Ejecución principal ---
if __name__ == "__main__":
# Configura tu URL objetivo y el intervalo deseado
# Ten en cuenta las políticas del sitio web y no hagas solicitudes con demasiada frecuencia.
my_target_url = "https://www.some-store.com/new-widget-X" # <<< ¡REEMPLAZA ESTO!
monitoring_interval = 600 # Comprobar cada 10 minutos (600 segundos)
desired_status = "En stock" # ¿Qué palabra clave estamos buscando?
# IMPORTANTE: ¡Asegúrate de que tu clave API de OpenAI esté configurada como variable de entorno!
# export OPENAI_API_KEY="sk-..." en tu terminal antes de ejecutar.
run_agent(my_target_url, monitoring_interval, desired_status)
Configuré mi intervalo a 5 minutos para ese elusivo dispositivo de hogar inteligente. Cada vez que veía el mensaje "Comprobando..." sentía un pequeño picor de emoción. Cuando finalmente llegó la notificación – "¡En stock! Cantidad limitada disponible." – juro que escuché cantar a los ángeles. Hice clic en el enlace, lo añadí a mi carrito y completé la compra en segundos. ¡Éxito! Mi pequeño agente de IA me había salvado de recargar interminablemente y me ayudó a conseguir ese gadget.
Consejos prácticos para tu primer agente de IA
- Empieza pequeño: No intentes construir un agente conversacional complejo desde el principio. Una tarea de monitoreo simple es perfecta para aprender lo básico.
- Inspecciona tu objetivo: Comprender la estructura HTML de la página web que estás monitoreando es crucial. Usa las herramientas de desarrollador de tu navegador.
- La ingeniería de prompts es clave: Cuanto mejor describas qué tipo de cambio buscas al modelo de IA, más precisas y útiles serán sus respuestas. ¡Experimenta con tus prompts!
- Sé respetuoso: No bombardees los sitios web con solicitudes. Usa intervalos razonables, revisa
robots.txty entiende los términos de servicio de un sitio respecto al acceso automatizado. - Asegura tus claves: Nunca codifiques directamente claves API en tu script. Usa variables de entorno.
- Itera: Tu primer intento puede no ser perfecto. ¡El mío ciertamente no lo fue! Ajusta tus selectores de `BeautifulSoup`, refina tu prompt de IA y modifica tu método de notificación hasta que funcione para ti.
Construir este pequeño agente fue un gran impulso de confianza para mí. Me mostró que la IA no es solo para grandes empresas o investigaciones académicas. Es una herramienta que nosotros, como usuarios individuales y desarrolladores menores, podemos usar para resolver nuestros propios problemas y hacer nuestras vidas digitales un poco más fáciles. Así que adelante, elige una página web que estés cansado de revisar manualmente y construye tu propio sabueso digital. ¡Te sorprenderá lo que puedes lograr!
Artículos relacionados
- Cuando tu agente se rebela: Dominando los Interruptores de Muerte
- Agentes de IA en Bienes Raíces: Transformando la Industria
- API de OpenAI en 2026: 7 cosas después de 3 meses de uso
🕒 Published: