Para crear un script de automatización con IA, describes una tarea repetitiva a un agente de código y pruebas el pequeño script en Python que escribe. Renombrar archivos, combinar archivos de Excel y CSV, un informe semanal por correo o un scraper que sigue precios en un sitio suele necesitar entre 50 y 200 líneas. Lo difícil no es el prompt: es describir con precisión la entrada, comprobar la salida, programar el script y enterarte cuando se rompe.
Este artículo va de cero a una automatización que funciona: qué instalar, qué herramienta elegir en cada caso, qué decirle primero al agente, cómo probar y cómo ejecutarlo cada día con cron. También cubro el lado legal y ético del scraping, porque la IA no pensará en eso por ti.
Qué significa aquí «automatización con IA»
No me refiero a un modelo que haga el trabajo él mismo cada vez. El agente escribe un script una sola vez; a partir de ahí el script se ejecuta igual todos los días, sin ninguna IA. Esa distinción importa: un script es barato, repetible y puedes leer lo que hace. Una configuración que llama a un modelo cada día cuesta más y es más difícil de predecir.
Esto es vibe coding: no escribes el código línea a línea, describes lo que quieres y diriges el resultado. Las automatizaciones le van bien porque el objetivo es claro y el resultado es fácil de comprobar: ¿se nombraron bien los archivos?, ¿tiene la hoja las filas correctas?
¿Qué trabajos merece la pena automatizar?
Un buen candidato se repite a menudo, tiene reglas que puedes escribir y se puede deshacer si sale mal. Ejemplos cotidianos:
- Archivos: renombrar las facturas de tu carpeta Descargas por fecha y moverlas a carpetas año/mes.
- Excel y CSV: combinar los archivos de ventas que envía cada sucursal, quitar filas vacías y generar una hoja de resumen.
- Informes por correo: sacar datos de una carpeta o de una base de datos cada semana y enviar un resumen a ti o a tu equipo.
- Vigilar la web: seguir el precio de un producto, las nuevas entradas de una página de anuncios o de comunicados, y recibir un aviso cuando algo cambie.
En todo lo que deba seguir bajo control de una persona (pagar a alguien, enviar un contrato), detén la automatización en «prepáralo, yo lo apruebo».
Paso 1: instala las herramientas
Necesitas un agente de código y Python. Sirve cualquier agente de código de terminal: Claude Code, Codex, Gemini CLI o Aider pueden leer y escribir archivos y ejecutar comandos.
# Is Python 3 installed?
python3 --version
# project folder and virtual environment
mkdir invoice-sorter && cd invoice-sorter
git init
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
¿Por qué Python? Las bibliotecas de automatización son maduras: pandas y openpyxl para hojas de cálculo, requests para HTTP, beautifulsoup4 para analizar HTML, playwright para un navegador. Los agentes han visto mucho código con ellas, así que cometen menos errores. Convertir la carpeta en un repositorio git significa que puedes deshacer cualquier cambio del agente.
Paso 2: el primer prompt
Una petición vaga da un script vago. Un buen primer mensaje incluye la entrada, la salida, las reglas y los casos límite. Pon dos o tres archivos de ejemplo reales en la carpeta (falsos si contienen datos personales) y señálaselos al agente:
Write a Python script: rename_invoices.py
Input: PDF invoices in ./inbox. Examples are in ./samples.
Page one of each PDF has an "Invoice date: DD/MM/YYYY" line and a "Company:" line.
What it does:
- Rename the file to YYYY-MM-DD_company-name.pdf (lowercase, hyphens instead of spaces).
- Move it to ./archive/YYYY/MM/.
- If the date or company can’t be read, leave the file alone, copy it to ./failed and log it.
Rules:
- Run as --dry-run by default: print what it would do, touch nothing.
- Require an --apply flag for the real run.
- Never overwrite an existing file; append -2 instead.
- List dependencies in requirements.txt.
- When done, run it on ./samples with --dry-run and show me the output.
Dos reglas de aquí merecen copiarse en toda automatización: simulacro por defecto y nunca sobrescribir. Si el agente interpreta mal una fecha, obtienes una lista para revisar en lugar de cientos de archivos movidos al sitio equivocado.
Paso 3: itera y prueba
La primera versión rara vez maneja todos los archivos. El bucle:
- Lee la salida de
--dry-run. ¿Hay algo emparejado mal? - Enséñale al agente el archivo problemático: «
samples/invoice_7.pdfsalió como 1970-01-01; ese archivo usa la etiqueta “Issue date”. Admite las dos». - Pídele que añada una pequeña prueba para ese caso. Unos cuantos archivos de ejemplo con
pytestbastan. - Cuando todo parezca correcto, ejecuta
--applyprimero sobre una copia y luego sobre la carpeta real.
En los trabajos con Excel y CSV la comprobación es más simple: compara el número de filas de la entrada con los totales de la salida. Haz que el propio script afirme algo como «el archivo combinado debe tener 1.240 filas y este total de ingresos». Que el código se ejecute no prueba que calcule correctamente.
Paso 4: el scraper, ¿requests o Playwright?
La primera decisión en el scraping es cómo está construida la página. Haz clic derecho, elige «Ver código fuente de la página» y busca en él los datos que quieres (el precio, el título).
Si está en el código fuente, bastan requests y BeautifulSoup. Son rápidos, no abren ningún navegador y cargan poco el servidor.
import requests
from bs4 import BeautifulSoup
HEADERS = {"User-Agent": "price-tracker/1.0 (contact@example.com)"}
resp = requests.get("https://example.com/product/123", headers=HEADERS, timeout=20)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, "html.parser")
price = soup.select_one(".product-price")
if price is None:
raise RuntimeError("Price element not found; the page layout may have changed")
print(price.get_text(strip=True))
Si el contenido llega después mediante JavaScript, o necesitas iniciar sesión, hacer clic o desplazarte, necesitas un navegador real. Playwright es una opción habitual:
pip install playwright
playwright install chromium
No le digas al agente cuál usar; pídele que lo compruebe primero:
I want the product names and prices from https://example.com/category/headphones.
First check robots.txt and the page source: is the data in the HTML, or loaded
by JavaScript? If the site has a public API or a JSON endpoint, prefer it.
Then pick the simplest approach and explain why.
Wait at least 3 seconds between requests and visit at most 5 pages.
Write the result to products.csv.
Un consejo: en muchos sitios que abres con Playwright, la pestaña de red del navegador muestra que los datos en realidad llegan de una petición JSON. Llamar directamente a ese endpoint puede ser más robusto y ligero, aunque sigue sujeto a los términos del sitio.
Límites legales y éticos: robots.txt, términos, RGPD
Una IA escribirá encantada código que haga scraping de un sitio; si debes hacerlo es decisión tuya. Esto no es asesoramiento legal, pero estas son mis reglas de trabajo:
- Primero la API oficial. Muchos sitios, bolsas, empresas de mensajería y organismos públicos ofrecen sus datos mediante una API. Es más estable, sus reglas son explícitas y no se rompe cuando cambia el diseño de la página.
- Lee robots.txt y los términos de servicio. Si los términos prohíben el acceso automatizado o robots.txt no permite la ruta, no lo hagas. Hacer scraping de páginas tras un inicio de sesión suele incumplir los términos.
- Evita los datos personales. Recoger nombres, teléfonos o correos entra en el RGPD (y en la KVKK en Turquía); sin una finalidad, una base legal y un plazo de conservación, no los recojas.
- Ve despacio. Espera unos segundos entre peticiones, envía de una en una y no vuelvas a descargar páginas que ya tienes. Usa un User-Agent que te identifique.
- Ten en cuenta los derechos de autor. Seguir un precio para ti es distinto de copiar el contenido de otra persona y republicarlo.
- No luches contra las defensas. Resolver CAPTCHA, rotar IP o saltarte la protección de inicio de sesión son señales de que el sitio no quiere que estés ahí.
Paso 5: errores, reintentos y alertas
Un script que hoy funciona se rompe en silencio la semana que viene: el sitio cambia su diseño, alguien añade una columna a la hoja de cálculo, la red se cae. Pedir esto desde el principio te ahorra problemas:
Harden the script for daily use:
- Add timeouts to network requests; on transient errors (connection error, 429, 5xx)
retry up to 3 times with increasing waits. Don’t retry 4xx errors.
- Log every run to logs/YYYY-MM-DD.log.
- Treat zero results, or a missing expected field, as an error.
- On error, email me using the SMTP settings in .env, with a summary of the error
and the path of the log file.
- Send nothing on success.
«Cero resultados es un error» es la regla que más compensa. La mayoría de los scrapers no se bloquean cuando se rompen; producen un CSV vacío. En lugar de un correo puedes usar webhooks y APIs de bots de Slack o Telegram; elige lo que de verdad vayas a notar.
Paso 6: prográmalo con cron
Cuando el script está listo, la forma más simple de ejecutarlo con regularidad en macOS y Linux es cron. Ejecuta crontab -e y añade:
# Run every day at 08:30
30 8 * * * cd /Users/you/price-tracker && .venv/bin/python track.py >> logs/cron.log 2>&1
Cosas a vigilar:
- cron no carga el entorno de tu shell. Usa la ruta completa a Python (la del entorno virtual) y haz
cda la carpeta. - cron no se ejecuta mientras el equipo está suspendido. Para tareas que deben ejecutarse todos los días, un pequeño servidor Linux o un flujo de GitHub Actions programado es más fiable.
- En Windows, el Programador de tareas hace el mismo trabajo; pide al agente un archivo
.baty los pasos de configuración. - Revisa los registros todos los días durante la primera semana.
Lo que la IA suele hacer mal
- Inventar selectores. Sin ver la página, el agente adivina una clase CSS como
.price. Dale el HTML real, o pídele que descargue e inspeccione la página. - Tragarse los errores. Un bloque
except: passhace que el script parezca funcionar sin hacer nada. Lee cada líneaexcept. - Formatos de fecha y número. Los números al estilo europeo
1.234,56y las fechasDD/MM/YYYYse leen mal con frecuencia. Compara a mano unos cuantos valores de la salida con el origen. - Codificación. Si un CSV con caracteres acentuados se ve corrupto, pídele que pruebe
utf-8-sigo la codificación heredada correcta. - Mensajes de éxito demasiado seguros. «El script está terminado y probado» no es una prueba por sí solo. Mira tú mismo la salida.
- Demasiadas dependencias. Montar automatización de navegador o un framework para un trabajo de diez líneas. Pide la solución más simple.
Seguridad
- Los secretos van en
.env. Las contraseñas SMTP, las claves de API y los inicios de sesión nunca van en el código; léelos de.envconpython-dotenvy añade.enva.gitignore. Sube a git un.env.examplecon valores ficticios. - Nunca pegues una clave en el chat. No le escribas al agente «mi clave es …». Las conversaciones pueden almacenarse y acabar en registros. Dale solo el nombre de la variable: «léela de la variable de entorno
SMTP_PASSWORD». - Lee los comandos que ejecuta el agente. Sobre todo
rm,mvmasivos,pip installde paquetes que no conoces y cualquier cosa que envíe datos al exterior. Si no estás seguro, no lo apruebes. - Mínimo privilegio. Usa una contraseña de aplicación para una cuenta de correo y una clave de solo lectura para una API.
Hacerlo con AgentVera
Todo esto funciona en una terminal normal con un solo agente. Cuando ejecuto varias automatizaciones a la vez uso AgentVera, porque simplifica unos cuantos pasos:
- Agentes separados, carpetas separadas. En el espacio de trabajo, Claude Code puede escribir el scraper en un panel mientras Codex construye el informe de Excel en otro. Si comparten repositorio, da a cada uno su propio git worktree para evitar colisiones.
- Navegador del agente. Los agentes que usan Playwright manejan un Chrome con su propio perfil, y ves lo que hacen en directo en el navegador del agente. Así es más fácil ver por qué un selector no coincide.
- Ejecución en un servidor. Desde la página de SSH y SFTP puedes copiar el script a un servidor y configurar allí el crontab.
- Mensajes programados a agentes. Las tareas programadas programan un mensaje a un agente, no tu script. Por ejemplo, una vez por semana: «lee los registros y resume los fallos». La ejecución diaria debería seguir siendo trabajo de cron.
- Revisa el diff. La revisión de código comprueba cada turno terminado, lo que ayuda a detectar errores silenciados durante el paso de refuerzo.
Si quieres encadenar agentes, consulta flujos de trabajo con agentes de IA; para conectar un agente con herramientas externas, consulta qué es un servidor MCP.
Lista de comprobación rápida
- Entrada, salida y casos límite escritos en el primer prompt
- Simulacro por defecto, sin sobrescribir
- Probado con archivos de ejemplo, algunos resultados comprobados a mano
- API oficial preferida donde exista; robots.txt y términos leídos
- Pausas entre peticiones, timeouts y reintentos limitados
- Cero resultados cuentan como fallo, los fallos envían una alerta
- Secretos en
.env,.envfuera de git - Rutas completas en la línea de cron, registros revisados la primera semana
Conclusión
El truco para crear automatizaciones con IA es darle al agente un trabajo pequeño y bien descrito, y luego tratar el script que escribe como software: simulacros, pruebas, registros, alertas. En el lado del scraping la elección técnica es fácil (requests si está en el código fuente, Playwright si no); lo más difícil es respetar los límites y elegir la vía oficial cuando existe. Para tu primera automatización, elige una tarea que hayas hecho a mano tres veces esta semana, adapta el prompt de arriba y empieza con un simulacro.