Ofertas
Todas las ofertas, en cualquier estado.
| Foto | Oferta | Precio | Estado | Origen | Clics | Acciones |
|---|
Candidatas
Ofertas que han traído los motores o que se han añadido a mano. Revísalas: o se convierten en oferta, o se descartan.
| Foto | Candidata | Precio | Origen | Comentarios | Estado | Acciones |
|---|
Usuarios
Cuentas dadas de alta en la aplicación.
| Usuario | Rol | Estado | Ofertas | Sesiones | Último acceso |
|---|
Motores
Buscadores de ofertas. Cada motor tiene una URL desde la que se lanzan las búsquedas.
| Motor | Tipo | Frecuencia | Añadido | Candidatas | Última ejecución | Acciones |
|---|
Cómo se hace una búsqueda
Esto es lo que pasa de verdad cuando se lanza una búsqueda. Está contado desde el código, así que si algún día cambia el procedimiento, esto hay que cambiarlo con él.
Los pasos, en orden
- Se baja la web del motor con un
fetchnormal, sin navegador (20 s de tope y 2 MB de máximo). Si esa descarga falla —lo típico es un 403 de un muro anti-bots— se reintenta con el navegador de verdad, que sí pasa los muros de tipo desafío (PcComponentes responde 403 a la descarga normal y el navegador la lee entera). Se prueba siempre primero la descarga normal, que es mucho más rápida. Si el muro pide un captcha humano (Leroy Outlet), no hay nada que hacer y se dice tal cual. Si el listado está paginado, se siguen las páginas siguientes: ver más abajo cómo y hasta cuándo. - Esa página se le pasa al modelo en una llamada y devuelve un JSON con las ofertas: título, marca, tienda, enlace, precio, precio anterior, categoría, foto, cupón y fecha de caducidad. En esa llamada se le da la lista de las seis categorías de la web con una pista de qué entra en cada una, para que elija una de verdad y no se invente un nombre.
- Oferta por oferta: si el enlace que da el motor ya está en candidatas, se salta sin abrir nada (no cuesta nada); si el enlace es en realidad una categoría y no un producto (ver «Un enlace de categoría no es un producto»), no se guarda; si el artículo es reacondicionado o de segunda mano (ver más abajo), no se guarda; si la fecha de caducidad que anuncia la página ya pasó, la oferta no se guarda; si se ha llegado al tope de productos, se corta; si no, se abre la ficha.
- La ficha se abre con Chromium de verdad, no con
fetch: las tiendas sirven una página de desafío a los servidores. De esa visita salen la foto, el precio y la fecha tope (si el listado no los traía), la marca, el texto de la oferta y, si la página lo enseña, el código del cupón (eso lo mira una regla, no el modelo: no cuesta nada). - El enlace que se guarda es el de la tienda final, nunca el del motor. Y los repetidos se comprueban contra esa dirección final: el mismo producto puede llegar con el enlace del agregador y con el de la tienda, o por dos motores distintos, y no puede entrar dos veces.
- El candidato entra ya con su descripción escrita y con sus avisos en los comentarios: la descripción la redacta el modelo en el momento de guardar cada candidata, con el texto de su ficha (una llamada al modelo por candidata). Antes se hacía en una pasada al final de la búsqueda, y una búsqueda interrumpida dejaba sin descripción a todas sus candidatas; ahora cada una queda cerrada en cuanto entra.
- Si la ficha dice que el producto ya no está, el candidato se guarda descartado: queda constancia, pero no le hace perder el tiempo a quien revisa.
- Al terminar se apuntan la duración y los contadores en «Actividad».
Muros anti-bots: qué se puede y qué no
- La descarga normal es lo primero, y basta para la mayoría de los motores. Cuando responde 403, se reintenta con el navegador. Cuáles necesitan el navegador no se puede decir de antemano: eso sólo se sabe probando.
- Los muros de tipo desafío (Cloudflare, el de PcComponentes) los pasa el navegador solo, sin que nadie toque nada: la página carga entera en unos 5 s.
- Los muros con captcha humano (DataDome, el de Leroy Outlet) no se pueden pasar: el navegador recibe 900 bytes con un captcha esperando a una persona. Ese motor no se puede rastrear automáticamente, y la búsqueda lo dice con esas palabras en vez de con un 403 sin explicación. Fallar así no cuesta nada: no llega al modelo.
- El respaldo también tiene el tope de 2 MB, porque el navegador devuelve el HTML ya renderizado y suele traer de más.
La cola y la prioridad
- Todo va de uno en uno. Las búsquedas pasan por una única cola, así que lanzar diez motores no arranca diez a la vez: arranca una y las demás esperan su turno. Con búsquedas de 6-7 minutos, la última de diez puede empezar una hora después. Mientras una esté atascada, las de detrás no empiezan.
- El orden de la lista es la prioridad. Se lanzan de arriba abajo, y cada motor tiene dos botones pequeñitos —▲ y ▼— para subirlo o bajarlo de puesto. Se guarda en el motor, no en el navegador.
- El botón «Lanzar los de una vez» pone en cola todos los motores marcados como una vez que estén activos, en ese orden de prioridad y sin juzgar (que decida una persona, como en las programadas).
- Un motor de «una vez» se apaga al terminar su búsqueda, salga bien o mal, y venga de donde venga: del programador, del botón o de un lanzamiento a mano. Los que no se apagan son los recurrentes (diario, semanal, mensual): esos vuelven a tocar cuando les toca.
- Ninguna ejecución pasa de 4 horas. Si una se pasa, se corta con el error «Superado el límite de 4 horas de ejecución» y su motor se va al final de la cola, para que los demás no esperen detrás de uno que atasca.
Si el listado no da nada: se prueba todo
- Cada motor tiene su maña y no se sabe de antemano cuál hace falta. Hay webs que van con la descarga normal, otras que necesitan el navegador (montan el listado con JavaScript y la descarga normal sólo trae el esqueleto) y otras que sólo sueltan los productos si el navegador espera a que la red se calme y baja hasta el final de la página.
- Se prueban las tres, en ese orden, hasta que una dé ofertas. La que funciona se recuerda para las páginas siguientes de esa misma búsqueda.
- Y se decide por el resultado, no por el HTML: intenté detectar las páginas «sin montar» por el HTML y no hay señal que valga (en Nintendo la cabecera trae 45 plantillas sin rellenar en las tres formas de descarga, incluida la del navegador ya montada). Lo único fiable es que el modelo no saque ni una oferta.
- Ojo con el gasto: cada forma que se prueba es una llamada al modelo. Un listado que sale a la primera cuesta una; uno que necesite el navegador, dos. (El de Nintendo: unos 2 céntimos; antes costaba 2 céntimos y no daba nada.)
Agregador o tienda final: no es lo mismo
- Tienda final: la URL del motor ya vende. Se abre la ficha y punto. Si al resolver las redirecciones el enlace acaba en otra dirección de la misma tienda, se lee ahí y se guarda esa.
- Agregador: su página no vende nada; es un escaparate que salta a la tienda con un botón del tipo «Ir a oferta». Con estos se hace una visita ligera (se carga la página, se busca el enlace de salida y se lee el texto, sin esperar precios: unos 8 s) y después se abre la ficha ya en la tienda. El dominio del agregador nunca se guarda como página del producto: si no se consigue salir de él, el candidato se guarda descartado, con el motivo a la vista.
- El porqué: la foto, el precio y el enlace tienen que ser los de quien vende el producto, no los del motor que lo copia.
Un enlace de categoría no es un producto
- Hay páginas de motor que no listan productos, sino que llevan a categorías. La que lo trajo (28/09) fue «Carrefour - ofertas»: su dirección apunta a un hub de 42 enlaces a categorías y ni un solo producto, así que el modelo devolvió «Almohadas» o «Pintura» como si fueran artículos. La cola se llenó de enlaces que no llevaban a ninguna parte.
- Por eso hay una red que no depende del modelo: si la dirección tiene forma
de listado —
/cat28812084/c,/categoria/…,/buscar…,/search…— no se guarda. La lista es corta y sólo con formas inequívocas, porque un falso positivo se llevaría por delante una oferta buena. - Y al modelo se le pide, con esas palabras, que la
urlsea la página del producto concreto y nunca una categoría ni un listado, y que si en la página sólo hay categorías o promociones devuelva una lista vacía.
Paginación: sí se sigue, con tres frenos
Si el listado está paginado, se sigue a la página siguiente mientras se pueda reconocer el enlace y no se pase de ningún tope:
- Sólo se sigue un enlace que lo diga claro: un
rel="next"o un texto de «siguiente», «next» o una flecha (»). Ante la duda no se sigue: leer la página equivocada cuesta una llamada al modelo y trae basura a la revisión. - Cinco páginas como mucho por búsqueda. Cada página es una llamada al modelo, así que ese número también es un tope de gasto.
- Y se para en cuanto hay suficientes productos para el tope de esa búsqueda. Con el tope a 20, no tiene sentido leer cinco páginas.
- Nunca se lee dos veces la misma página: si el enlace vuelve a donde ya se ha estado, se para. Así no hay bucles.
- Si una página siguiente falla, la búsqueda se queda con lo que ya tenía y lo apunta; sólo la primera es obligatoria.
Las páginas que se leyeron quedan apuntadas en «Actividad», en su columna.
Caducidad: lo que ya pasó, no entra
- Cada oferta puede llevar una fecha de caducidad: la que anuncia la tienda («válido hasta el 30 de septiembre»). Se guarda tal cual la dice la página, y vacía quiere decir que la oferta no anuncia ninguna; una fecha inventada haría caducar ofertas buenas, así que no se inventa ninguna.
- Se busca en los dos sitios, en este orden: primero en el listado del motor y, si allí no venía, en la ficha del producto. El listado manda cuando la trae. (Se añadió el 29/09: el listado de Nintendo no dice la fecha y su ficha sí, «Promoción hasta el 07-10-2026».) Cuando la fecha sale de la ficha se apunta en los comentarios de la candidata, para saber de dónde viene.
- Si la fecha que se encuentra ya ha pasado, la oferta no se guarda: ni candidata ni nada. Se cuenta en el registro de la búsqueda para que quede dicho. Una fecha de hoy no es pasado: la oferta vale todo el día.
- El campo se puede corregir y rellenar a mano en los formularios (el de oferta y el de candidata), y el botón de la IA lo trae relleno si la ficha lo dice.
Reacondicionados y de segunda mano: no entran
- Sólo valen artículos nuevos. Quedan fuera los reacondicionados («refurbished», «renewed»), los de segunda mano, los usados, los seminuevos, los desembalados, los devueltos, los «open box» y los de exposición.
- Lo mira el modelo, que ve la página entera y sabe si el artículo está usado aunque el título no lo diga (la etiqueta de estado de la ficha, el sufijo del enlace, un precio anormalmente bajo para ese producto). No cuesta llamadas de más: es la misma llamada que ya se hace para extraer.
- Y además hay una red de seguridad que no depende del modelo: si el título —el de la página o el que se ha escrito— trae una de esas palabras, el artículo se descarta igual y se anota en el registro de la búsqueda («3 artículo(s) reacondicionado(s) o de segunda mano: no se guardan»).
- Esas marcas son deliberadamente pocas y sin ambigüedad. Un falso positivo (dejar fuera una oferta buena) no lo nota nadie, y en cambio un reacondicionado que se cuele lo descarta quien revisa en dos clics. Por eso no se filtra por «ocasión» a secas, que en español vale tanto para un coche de segunda mano como para un «precio de ocasión» estupendo y nuevo.
- El campo se puede corregir en los formularios, pero la búsqueda no los trae. Si en el panel se pega a mano el enlace de un reacondicionado en «Procesar por IA», se dice qué pasa en vez de un «no se encontró ninguna oferta» que haría pensar en un fallo de la web.
Cupones: el código, si existe
- Muchos agregadores de cupones no dan ningún código: su página lista promociones y su botón «Ver Cupón» no revela nada, sólo salta a la tienda. En esos no hay código que conseguir, y el que se busca es el de la tienda.
- Por eso el código se busca en la ficha de la tienda, que ya se abre para el precio y la foto: una regla mira los campos de cupón, sus atributos y el texto («usa el código PIZZA20»). No cuesta ninguna llamada al modelo.
- Lo que devuelva el modelo pasa por una puerta: en «cupón» sólo entra un código o el nombre corto de un cupón. Un titular («Código Dominos 2 pizzas por 8,49 €») no es un cupón y se descarta, en vez de acabar en los comentarios como si lo fuera.
Textos: nada copiado
El título y la descripción los escribe el modelo, no se copian de la página. Como eso es una promesa, se comprueba:
- Título: se le pide al modelo el título tal cual estaba en la página («titulo_original») y el suyo. Si los dos textos son el mismo —en comparación no cuentan mayúsculas, acentos ni signos—, se marca en los comentarios de la candidata.
- Descripción: se mide la tirada más larga de palabras seguidas que coincide con el texto de la tienda. Con 8 o más, se marca. Copiar y cambiar una palabra de en medio no convierte la copia en un texto propio, y eso se detecta.
- La marca no borra nada: deja la oferta fuera de la publicación automática y se lo dice a quien revisa.
Palabras clave: para buscar, no para enseñar
- Cada artículo puede llevar palabras clave: con qué palabras lo buscaría alguien que quiera comprarlo («lavadora, siemens, iq300»). Salen del mismo JSON que ya devuelve el modelo al extraer, así que no cuestan una llamada de más.
- No se ven en la web: ni en la portada ni en la ficha. Lo que se enseña es el título; esto es una herramienta del buscador.
- Sí sirven para encontrar: el buscador de la web y el del panel miran también este campo, así que un artículo al que se llama «televisor» sale buscando «tele».
- Se guardan ordenadas y sin sobras: en minúsculas, sin repetidas y con un tope de 12 palabras (y de 255 caracteres, que es lo que aguanta la columna). Lo que llegue de más no se filtra por sentido ni se completa a mano: sólo se ordena lo que el modelo haya dicho.
- Se pueden corregir en los tres formularios (oferta, candidata y revisión) y sólo las escribe un administrador: no es cosa de quien publica desde la web. El botón de la IA las trae como cualquier otro campo: lo que devuelva el modelo manda.
Juzgar o sólo extraer: la diferencia es quién decide publicar
- Sólo extraer: el modelo devuelve todas las ofertas y no opina. Todo lo que traiga entra pendiente de revisión y lo decide una persona. Es lo que hacen las búsquedas programadas.
- Extraer y juzgar: además de extraer, el modelo opina de cada oferta:
- «interesante» (sí o no) y el motivo. Las que no lo son no se abren: se ahorran su visita, su foto y su precio.
- «publicar»: si la oferta se puede sacar publicada sin que la mire nadie. Pide tres cosas: un descuento de más del 30 %, un producto concreto con nombre y marca, y todos los datos (título, tienda, enlace, precio, categoría y foto).
- Una oferta sólo se publica sola si el modelo dice que sí y aquí no falta nada: enlace de tienda, tienda, precio, categoría válida, foto, descripción propia, ningún aviso de copia y un descuento de más del 30 %. La decisión se toma en el momento en que entra la candidata (su descripción ya está escrita), así que si la búsqueda se corta, lo que ya había entrado se ha publicado o se ha anotado por qué no. El descuento lo calcula la web con los dos precios, no se fía de la palabra del modelo — y sin precio anterior no hay descuento que valga, así que esa oferta se queda para revisar. Si falta cualquier cosa, la candidata se queda pendiente y en sus comentarios aparece por qué no se publicó sola.
- Ante la duda, el modelo tiene orden de decir que no: una oferta de más en la cola no molesta a nadie; una mala publicada, sí. Y todo lo que publique sola queda en el panel, donde se puede despublicar igual que cualquier otra.
Buen precio: se compara con lo que cuesta en el mercado
- Al juzgar (y sólo al juzgar, o a mano con el botón «Comprobar» de los formularios), cada oferta se busca en un comparador de precios y su precio se compara con el más barato que haya. De ahí sale el campo «Buen precio (vs. comparador)»: sí, no o vacío.
- No es Google. Google devuelve su página anti-bots a las peticiones que salen de este servidor —probado con la búsqueda normal y con Google Shopping—, así que desde aquí no se puede leer. Lo que sí se lee es un comparador, que además es mejor para esto: da el precio más bajo de varias tiendas y cuántas ofertas hay.
- Lo difícil no es el precio: es saber que es el mismo producto. En la
primera versión, emparejar por parecido daba veredictos con mucha seguridad sobre
artículos que no eran —un PC de 989 € salía «buen precio» porque el comparador tenía
un servidor de 6.495 € con un nombre parecido—. Por eso ahora se exige que el
resultado traiga un código de modelo del título (
C27G42ZE,WH-1000XM5) o todas las palabras significativas y todos los números; con una sola palabra no basta, que «apple» empareja cualquier cosa. - Segundo intento, con el modelo. Cuando la regla no encuentra nada, se le enseñan al modelo los nombres de los resultados y se le pregunta cuál es el mismo producto. Hace falta porque el idioma tumba a la regla: «negro volcánico» contra «obsidiana», «teclado numérico» contra «numpad». Se le pide un número o «ninguno», y ante la duda tiene orden de decir «ninguno». Cuesta unas decenas de tokens por artículo (medido: del orden de un céntimo por cada 245).
- Se considera buen precio hasta un 3 % por encima del más barato del mercado: son céntimos en casi cualquier artículo, y ese margen absorbe las diferencias de envío y de vendedor. Lo que se busca es «no nos están dando gato por liebre», no «somos el más barato por un céntimo».
- Guarda de cordura: si el más barato del mercado está más de tres veces por encima del nuestro, no hay veredicto. Casi siempre es otro producto mal emparejado, no un chollo del 70 %.
- Tres estados, no dos. El campo dice «No comprobado» cuando nadie lo ha mirado, «Sin resultados» cuando se intentó y no se consiguió (no se pudo emparejar el mismo producto, o el comparador no contestó), y «Sí» o «No» cuando hay veredicto. Un intento sin resultado no es un fallo: es mejor eso que un buen precio inventado —un dato de más se publica con nuestra firma y no se nota; un hueco se ve y lo revisa alguien—. El motivo queda escrito en los comentarios del artículo, y un intento fallido no borra un veredicto anterior: si ya estaba comprobado, se conserva.
- No usa el navegador y no gasta modelo (salvo el segundo intento): son dos peticiones y una resta, menos de un segundo.
Cuánto se tarda (medido, no estimado)
- Una ficha de producto: entre 10 y 30 s. Medido: 10,1 s una ficha de Amazon con precio, 25,0 s una portada de tienda, 28,6 s una página de cupón (esa paga entera la espera de 20 s a que aparezca un precio).
- Entre visita y visita hay 3 s de espera obligatorios; van dentro de esas cifras.
- Comprobar el precio contra el mercado: menos de un segundo y sin navegador (dos peticiones y una resta). Si la regla no empareja, el segundo intento añade una llamada corta al modelo.
- Con un agregador: la visita ligera (~8 s) más la ficha en la tienda.
- Una búsqueda de unas 36 ofertas: 5-7 minutos. Con el tope puesto a 1 producto, 42 s. Con listado paginado, súmale lo que tarden las páginas de más (la llamada al modelo de cada página va aparte).
- El resumen de la descripción: una llamada al modelo por candidata, en el momento de guardarla (antes era una sola llamada para toda la búsqueda, pero una búsqueda interrumpida se llevaba por delante todas las descripciones). De más, unos 400 tokens de instrucciones por candidata.
Cuánto cuesta (tokens de DeepSeek)
Desde ahora cada búsqueda guarda los tokens que ha gastado, según lo que contesta DeepSeek, y se ven en «Actividad». Eso es el número exacto. Lo que sigue es la estimación para hacerse una idea.
Lo que manda en el gasto es el HTML de cada página del motor, que se le manda entero al modelo: es casi todo entrada. Medido en las webs de verdad: la página de Chollers pesa 153 KB y la de ofertas de Amazon, 286 KB. Con unas 24 ofertas por página, 100 productos son unas 5 páginas (y 5 es justo el tope de páginas).
- Sólo extraer, 100 productos: unos 240.000 tokens de entrada y unos 21.000 de salida.
- Extraer y juzgar, los mismos 100: la entrada es la misma (es la misma llamada, con la instrucción un poco más larga) y la salida sube a unos 25.000, porque cada oferta lleva dos campos más.
- Con los precios publicados hoy por DeepSeek para el modelo rápido y en hora barata (entrada 0,15 $ y salida 0,60 $ por millón), eso son unos 5 céntimos de dólar por cada 100 productos. Juzgar añade menos de medio céntimo: la diferencia entre juzgar y no juzgar no es el dinero, es quién decide.
- Un aviso de tamaño: una web con páginas del doble de grandes (Amazon) cuesta cerca del doble, porque el gasto va con el HTML. Y el tope de 5 páginas es también el tope de gasto de una búsqueda.
- Ojo si algún día cambia el precio o el modelo: la cuenta sale de los tokens guardados, así que basta con volver a multiplicar.
De dónde sale cada dato
- Foto y precio: de la ficha de la tienda que vende. El precio del listado del motor sólo se usa si la ficha no lo da.
- Enlace: el de la tienda final, después de resolver las redirecciones.
- Categoría: el modelo elige una de las seis de la web, y para eso se le da la lista con una pista de qué entra en cada una («Moda: ropa, calzado, bolsos…»). Si no elige ninguna, o elige una que no existe, se intenta deducir por las palabras del título («zapatillas» → Moda, «sartén» → Hogar, «lavadora» → Hogar). Y si tampoco se puede, la candidata se guarda sin categoría y la pone quien revisa. La deducción por palabras nunca pisa una categoría que ya tenga.
- Descripción: siempre la escribe el modelo. El texto de la tienda no se guarda tal cual nunca.
- Marca: la del listado y, si allí no venía, la de los datos de la ficha.
- Caducidad: de lo que anuncia la página (el listado o la ficha), sólo si lo anuncia. Si no dice nada, el campo se queda vacío.
- Cupón: el código que muestre la ficha de la tienda y, si allí no hay ninguno, lo que el modelo haya visto en la página del motor, siempre que parezca un código de verdad.
- Palabras clave: del mismo JSON que devuelve el modelo al extraer. No se enseñan en la web; sólo las usa el buscador.
- Buen precio: de comparar nuestro precio con el más barato del mercado en un comparador. No comprobado (vacío) es que nadie lo ha mirado; Sin resultados, que se intentó y no se consiguió; y el motivo queda en los comentarios.
Actividad
Lo que ha hecho el programa por su cuenta: búsquedas (qué motor, cuántos artículos encontró y si hubo error) y comprobaciones de que los artículos siguen vivos y a buen precio. Las que están en curso salen arriba y se refrescan solas.
Búsquedas
Cada vez que un motor sale a buscar ofertas: cuántos artículos trajo, cuántas páginas leyó, qué gastó en el modelo y si hubo error.
| Fecha | Motor | ¿Juzgar? | Páginas | Encontrados | Nuevos | Tokens | Error | Duración | Acciones |
|---|
Comprobaciones
Que los artículos sigan vivos y que el precio siga siendo bueno. Las manuales se lanzan con el botón «Comprobar activos» de Ofertas y Candidatas; las automáticas, desde el programador de tareas.
| Fecha | Comprobación | Origen | Estado | Resultado | Error | Duración |
|---|
Programaciones
Lo que se ejecuta solo, todos los días a las 12:01. El interruptor vive en la propia web: apagar una programación no toca el temporizador del sistema, hace que el trabajo no actúe.
| Programación | Cuándo | Estado | Última ejecución | Resultado | Acción |
|---|