Comparado con lo que hoy hace clone-store.ts (verificado leyendo el código, no supuesto) y con lo que ofrecen los scrapers comerciales más usados del mercado.
0 de 11 pendientes resueltos
1 Lo que ya tiene (verificado en el código)
Cada ítem acá abajo se confirmó leyendo /var/www/scraping.tol.ar/server/clone-store.ts y los cron jobs en /root/agentes/ — nada de esta lista es supuesto.
Motor híbrido: HTML estático + navegador con JSTiene
Usa cheerio para HTML plano y un navegador headless (Puppeteer vía getBrowser()) cuando la página necesita JavaScript ejecutado — por ejemplo para sacar variantes de TiendaNube que solo aparecen en window.LS.variants después de renderizar.
clone-store.ts:180-202
Descubrimiento de productos vía sitemap.xmlTiene
Lee el sitemap (incluyendo sitemaps anidados) para armar la lista de URLs de producto a visitar, en vez de navegar el sitio como un usuario.
clone-store.ts:248-267, 356-375
Detección de bloqueo por el sitio de origenTiene
Si el sitio devuelve 401/403/429/503 lo marca como BlockedError, cuenta cuántos pedidos fueron bloqueados y si es demasiado, avisa en vez de guardar un catálogo a medias como si estuviera completo.
clone-store.ts:136-162, 2684-2732
Cola de reintentos con backoffTiene
Si un clonado falla, queda anotado y un cron (cada 2hs) lo reintenta solo, con espera creciente (2hs, 4hs, 8hs...) hasta 5 intentos. Si se agotan, avisa por WhatsApp en vez de quedar fallado en silencio.
clone-store.ts:1420-1447 · reintentar-clones-fallidos.js (cron cada 2hs)
Checkpoint / reanudar clonado cortadoTiene
Si el servidor se reinicia a mitad de un clonado, el próximo intento retoma desde los productos ya extraídos en vez de arrancar de cero.
clone-store.ts:31-34 (CLONE_CHECKPOINT_DIR)
Re-escrapeo diario automáticoTiene
Todos los días a las 13hs (Argentina) recorre las tiendas clonadas y vuelve a traer precio/stock/catálogo desde la tienda madre. No es bajo demanda, corre solo.
crontab: 0 16 * * * rescrapear-tiendas-diario.js
Escritura incremental en base de datosTiene
Antes de escribir en Supabase compara si el producto es exactamente igual al ya guardado (sameProductData). Si no cambió nada, no hace el PATCH ni ensucia el historial de precios con una entrada falsa.
clone-store.ts:1638-1650
Historial de precio/stock por productoTiene
Cada cambio real de precio o stock queda registrado en product_price_history, no se pisa el dato viejo sin dejar rastro.
clone-store.ts:1655-1665
Validación de precio sospechosoTiene
Si un producto scrapea con un precio que parece un error, no lo publica automáticamente — lo deja pendiente de revisión manual en vez de mostrar un precio roto a un cliente.
clone-store.ts:2800, 2844
Baja automática de productos discontinuadosTiene
Si un producto ya no está en el catálogo de origen, se borra de la tienda clonada — pero solo cuando la corrida vio el catálogo completo (si se truncó por un límite de cantidad, no borra nada para no confundir "no lo vi" con "no existe más").
clone-store.ts:1758-1762, 2823-2836
Aviso de WhatsApp con detalle por productoTiene
Resuelto el 20/07 por el Agente Scraping — no necesitó ninguna decisión ni gasto de Ariel, era código puro. Antes el aviso diario era solo un contador ("N actualizados"). Ahora insertProduct devuelve el detalle de cada cambio real de precio/stock, y rescrapear-tiendas-diario.js arma con eso una lista producto por producto en el mensaje de WhatsApp (tope de 25 líneas para no mandar un mensaje gigante). De paso se corrigió un bug real que estaba de antes: el script del cron hacía JSON.parse de toda la respuesta del scraper como si fuera un solo JSON, pero el endpoint manda varias líneas (ndjson) — eso rompía con "Respuesta inválida del scraper" en algunas corridas aunque el clonado hubiera salido bien (se ve en el log real del 19/7). Ahora se parsea línea por línea.
Cada foto se descarga y convierte a webp una sola vez y se guarda local. Si el sitio original se cae o bloquea después, la tienda clonada sigue mostrando las fotos igual.
clone-store.ts:21-24, precacheProductImages
Freno de velocidad contra el sitio de origenTiene
Los pedidos a la tienda madre están limitados a un mínimo de 400ms entre sí (global, no por worker), para no gatillar la protección anti-bot del sitio por ir demasiado rápido.
clone-store.ts:2670-2673
2 Lo que le falta — vamos marcando a medida que lo resolvemos
Ordenado por impacto real. Tildá el checkbox cuando lo terminemos — queda guardado en este navegador.
2b No resueltos — necesitan que vos decidas o pagues algo
Estos no los podemos resolver solos programando: falta que Ariel contrate un servicio, pruebe algo, o apruebe un cambio de riesgo. Cada uno dice exactamente qué hacer y adónde va el resultado.
3 Comparación con los scrapers comerciales más usados
Basado en conocimiento general de estos productos (documentación pública), no en una consulta hecha ahora mismo a sus sitios — a diferencia de la sección 1 y 2, que son 100% código verificado. Tratalo como orientativo, no como dato exacto.
Capacidad
tol.ar (hoy)
Octoparse
Apify
Bright Data
Zyte
Diffbot
Rotación de proxies / IPs
No tiene
Con plan pago
Sí
Sí (su producto principal)
Sí
Sí
Resolución de CAPTCHA
No
Parcial
Vía addons
Sí
Sí
Sí
Incrementalidad (saltear lo que no cambió)
No (lastmod ignorado)
Según config
Según config
Según config
Sí (auto-throttle + caché)
Sí
Resiste rediseños de la página (IA vs. selectores)
No, selectores fijos
No, selectores fijos
Depende del actor
Depende del setup
Parcial
Sí, extracción por IA
Historial de precio/stock por producto
Sí
No nativo
Si el actor lo implementa
No es su foco
Vía Scrapy Cloud custom
No nativo
Reintentos automáticos con backoff
Sí
Sí
Sí
Sí
Sí
Sí
Checkpoint / reanudar corte a la mitad
Sí
Parcial
Sí
Depende del setup
Sí
n/d
Cache propio de imágenes (independiza del sitio de origen)
Sí
No es su foco
Si el actor lo hace
No es su foco
No es su foco
No es su foco
Validación de precio sospechoso antes de publicar
Sí
No nativo
No nativo
No nativo
No nativo
No nativo
Builder visual sin programar (no-code)
No
Sí (su producto principal)
Marketplace de "actors" prearmados
No, es infraestructura
No, es infraestructura
API, no visual
Cobertura multi-plataforma out-of-the-box
TiendaNube fuerte, resto genérico
Templates por sitio popular
Marketplace enorme de actors
Infraestructura, no templates
Infraestructura, no templates
Cualquier página, IA genérica
Nuestro scraper es el único de esta lista pensado específicamente para "clonar una tienda online completa y mantenerla sincronizada con precio/stock/fotos todos los días" — los demás son herramientas generales de extracción de datos web, no soluciones de e-commerce. Por eso gana en historial de precios, cache de imágenes y validación de precio, y pierde en proxies/CAPTCHA/no-code, que no son su enfoque.
4 Qué haría un "scraper perfecto" para lo que hace tol.ar
No es copiar Bright Data ni Octoparse enteros — es tomar de cada uno solo lo que resuelve un problema real que ya vimos (bloqueos, catálogos grandes, rediseños silenciosos):
1. Lee el lastmod del sitemap y solo visita productos que cambiaron de verdad (gap #1, ya identificado).
2. Tiene un segundo proxy/IP como plan B cuando el sitio de origen bloquea la IP principal, en vez de esperar a que el bloqueo se levante solo (gap #2).
3. Se da cuenta solo cuando una tienda cambió de diseño — por ejemplo, si de repente 0 productos traen categoría cuando ayer el 95% la traía, frena y avisa en vez de guardar datos rotos (gap #5).
4. Mantiene todo lo que ya tiene: historial de precios, cache de imágenes, checkpoint, validación de precio sospechoso, baja de discontinuados — eso ya está al nivel de cualquier solución comercial, y en algunos puntos por encima porque está hecho a medida para esto.