Monitorear precios de la competencia con capturas automáticas
Entrar todos los días a cinco tiendas a ver si bajaron un precio, cambiaron el banner o lanzaron una promo es un trabajo que nadie hace por más de una semana. Y cuando te enterás de un cambio, ya no sabés desde cuándo está ni cómo era antes.
La solución es simple: que una máquina visite esas páginas una vez por día, guarde una captura y el texto, y te avise solo cuando algo cambió. Acá va cómo armarlo, con un cron o con n8n o Make.
Qué conviene guardar
Para cada página que te interesa (la home, una categoría, algunos productos clave) vas a guardar dos cosas por día:
- Una captura. Es tu archivo histórico: qué banner tenía la vidriera, qué producto estaba destacado, cuándo empezó una promo.
- El texto de la página. Es lo que vas a comparar. Comparar imágenes de un día a otro da falsos positivos todo el tiempo (un carrusel que rota, un contador, un anuncio); comparar texto te dice exactamente qué cambió: "$ 45.999" pasó a "$ 41.999".
Las dos cosas se pueden sacar con un navegador headless como Puppeteer o Playwright, si ya tenés uno andando. Si no querés mantener un Chrome en un servidor, una API de capturas te las da en un solo pedido. Los ejemplos de abajo usan screenshot.com.ar: su endpoint GET /v1/read abre la página una vez y devuelve un JSON con el contenido principal en markdown (sin menús, pie, publicidad ni banners de cookies) y la captura en base64. Cuenta como una sola captura.
Opción 1: un cron y dos scripts
Para un servidor o una compu que queda prendida. Necesitás curl, jq y Python 3.
1. La lista de páginas
Creá la carpeta ~/vidriera y adentro un archivo paginas.txt, con un nombre corto y la URL en cada línea:
rival-home https://www.tienda-rival.com.ar
rival-zapatillas https://www.tienda-rival.com.ar/zapatillas
otra-producto-x https://www.otra-tienda.com.ar/producto-x
2. El script que guarda todo
Guardalo como ~/vidriera/vidriera.sh y dale permisos con chmod +x ~/vidriera/vidriera.sh:
#!/usr/bin/env bash
# Guarda el texto y la captura de cada página de paginas.txt, con la fecha de hoy.
set -euo pipefail
API_KEY="TU_API_KEY"
DIR="$HOME/vidriera"
HOY=$(date +%F)
while read -r NOMBRE URL; do
[ -z "${NOMBRE:-}" ] && continue
mkdir -p "$DIR/$NOMBRE"
if ! RESP=$(curl -sS --fail-with-body -G "https://screenshot.com.ar/v1/read" \
--data-urlencode "url=$URL" \
-d "full_page=true" -d "format=jpeg" -d "quality=70" -d "cache_ttl=3600" \
-H "X-API-Key: $API_KEY"); then
echo "Error en $NOMBRE: $RESP" >&2
continue
fi
echo "$RESP" | jq -r '.markdown' > "$DIR/$NOMBRE/$HOY.md"
echo "$RESP" | jq -r '.screenshot.base64 // empty' | base64 -d > "$DIR/$NOMBRE/$HOY.jpg"
echo "OK $NOMBRE"
done < "$DIR/paginas.txt"
El cache_ttl=3600 hace que, si lo corrés dos veces en la misma hora (por ejemplo, para probar), la segunda salga de cache y no gaste. Al día siguiente la captura es nueva.
3. El script que compara
Guardalo como ~/vidriera/comparar.py. Para cada página, compara el texto de hoy con el anterior y marca las líneas que tienen un precio:
# Muestra qué cambió en cada página desde la captura anterior.
import difflib
import re
from pathlib import Path
BASE = Path.home() / "vidriera"
PRECIO = re.compile(r"\$\s?\d{1,3}(?:\.\d{3})*(?:,\d{2})?")
for carpeta in sorted(p for p in BASE.iterdir() if p.is_dir()):
archivos = sorted(carpeta.glob("*.md"))
if len(archivos) < 2:
continue
antes, ahora = archivos[-2], archivos[-1]
diff = difflib.unified_diff(
antes.read_text(encoding="utf-8").splitlines(),
ahora.read_text(encoding="utf-8").splitlines(),
lineterm="",
n=0,
)
cambios = [
linea for linea in diff
if linea[:1] in "+-" and not linea.startswith(("+++", "---"))
]
if not cambios:
continue
print(f"\n== {carpeta.name}: {antes.stem} -> {ahora.stem}")
for linea in cambios:
print(linea + (" <- PRECIO" if PRECIO.search(linea) else ""))
Las líneas con - son las de antes y las con +, las de ahora.
4. Programalo
Abrí el cron con crontab -e y agregá esta línea para que corra todos los días a las 8 (cambiá /home/usuario por tu carpeta personal):
0 8 * * * /home/usuario/vidriera/vidriera.sh && python3 /home/usuario/vidriera/comparar.py > /home/usuario/vidriera/cambios-$(date +\%F).txt
En el cron, los % tienen que ir escapados con \, por eso el \%F. Si querés el aviso por mail o por Slack, mandá ese archivo con la herramienta que ya uses.
Opción 2: n8n o Make, sin servidor propio
Si en tu equipo ya usan n8n o Make, el flujo es el mismo, con bloques:
- Disparador diario. En n8n, un nodo Schedule Trigger; en Make, programás el escenario para que corra una vez por día.
- La lista de páginas. Una hoja de Google Sheets con nombre y URL, una fila por página. Así el cliente o el equipo pueden agregar páginas sin tocar el flujo.
- El pedido. Un nodo HTTP Request (en Make, el módulo HTTP → Make a request) con método GET a
https://screenshot.com.ar/v1/read, el headerX-API-Keycon tu clave y los parámetrosurlyfull_page=true. - Guardar. El campo
markdowndel JSON va a la misma hoja (o a una tabla), en una columna con la fecha. La captura enscreenshot.base64la podés convertir a archivo y subirla a Google Drive. - Comparar y avisar. Comparás el
markdownde hoy con el último guardado (en n8n, con un nodo Code o Compare Datasets; en Make, con un Data store) y, si es distinto, mandás un mensaje a Slack, Telegram o mail con la página y las líneas que cambiaron.
Si solo querés el archivo de capturas para mostrar, sin comparar texto, podés usar GET /v1/capture, que devuelve la imagen directamente.
Detalles que hacen la diferencia
- Listados largos. El markdown se corta, por defecto, en 50.000 caracteres (el JSON trae
truncated: truesi pasó). Para una categoría con muchos productos, subímax_charshasta 200.000. - Páginas muy largas. La captura de página completa llega hasta 10.000 px de alto; si la página es más larga, se corta y te lo avisa.
- Contenido que tarda en aparecer. Si los precios se cargan después de unos segundos, agregá
delay=3000(milisegundos). - Solo páginas públicas. Lo que está detrás de un login no se puede capturar.
- Sé razonable. Una visita por día a unas pocas páginas públicas alcanza.
Cuánto te sale
Hacé la cuenta con tus páginas: 15 páginas una vez por día son unas 450 capturas por mes. Eso excede el plan gratis (100 por mes, sirve para armarlo y probarlo) y entra cómodo en el Pro, de 5.000 capturas por $9.900 por mes. Una agencia que sigue la competencia de tres clientes, con 40 páginas cada uno, ronda las 3.600 por mes y también entra en el Pro; si te pasás, el Business tiene 25.000 capturas por $29.900 por mes. Se paga en pesos con Mercado Pago: mirá los planes.
Todos los parámetros de /v1/read y /v1/capture están en la documentación.
Probá screenshot.com.ar gratis
100 capturas por mes sin tarjeta, por API o por MCP. Planes en pesos con Mercado Pago.