Notas · 27 de octubre de 2026 · 6 min de lectura

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:

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:

  1. Disparador diario. En n8n, un nodo Schedule Trigger; en Make, programás el escenario para que corra una vez por día.
  2. 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.
  3. 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 header X-API-Key con tu clave y los parámetros url y full_page=true.
  4. Guardar. El campo markdown del JSON va a la misma hoja (o a una tabla), en una columna con la fecha. La captura en screenshot.base64 la podés convertir a archivo y subirla a Google Drive.
  5. Comparar y avisar. Comparás el markdown de 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

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.

Crear mi API key