Turn euroauctions.com into a recurring source of construction-equipment leads and resale benchmarks. Capture hammer prices, hours and full specs to qualify buyers, sellers and undervalued lots across the European auction circuit.
Changelog — Euro Auctions Scraper — Europe Construction Equipment
2026-10-04 — tiempo_uso con unidad (pendiente build, aprobación David)
ext_tiempo_uso_unidad (h|km|mi|null) y ext_tiempo_uso_calidad (cero|unidad_sin_confirmar|null) en live (parse_past_lot, map_to_ftp vía split_uso) y en preloaded active/past (_fill_uso, idempotente, desde lo almacenado). tiempo_uso conserva el formato (número sin sufijo) y ahora también lleva el km/millas cuando no hay horas; millas SIN convertir, unidad "mi" cuando hours_type=='miles' (past: ext_hours_type). Active almacenado sin tipo: tiempo_uso=km|mi, unidad null + unidad_sin_confirmar. ext_km/km sin cambios. En esquema inglés hours sigue siendo solo horas (idéntico al original en el 100 %). Medición muestras sept: active 66/1000 con uso (todo horas; la muestra no trae km), past 21 -> 22/266 (+1 km). Declaradas en dataset_schema.json.
Active (live/admin): map + activeOnly + dedup + enriquecimiento por página (callback on_page); se escribe y DESPUÉS se guarda el checkpoint. Checkpoint rastriq_ckpt: store euroauctions-checkpoints, clave CHECKPOINT_{YYYY-MM}_{mc_c} (mes del snap_name); unidad done solo si se completó de forma natural; corte por maxItems a mitad de página no da la página por hecha. Runs con _snapshot_dataset_name usan claves con prefijo propio. No admin: checkpoint en el KV por defecto del run (every=1). forceRestart resetea los registros del mes.
Past: escritura del checkpoint esperada (.result); clave acumulada past-completed-cumulative como fuente de resume (bootstrap desde past-completed-euroauctions[-scraper]-past-*; no se lee/escribe en pruebas); una subasta con fetch fallido en cualquier página no se empuja ni se marca completada.
Decisiones David 2026-10-04: notas del puntero past = "delta mensual, cargar en modo append" (solo el texto notes; nombre/claves del puntero igual). Runs con categorias/subastas incompletas siguen SUCCEEDED y publican puntero, con RESUMEN en el log.
Contrato de salida e input schema sin cambios.
2026-09-18 — build FTP-28: E1, E2, E3
T7 (push 2026-09-18): pot_motor/tipo_motor en preloaded_sold/live ahora hacen fallback a title cuando description viene vacia (categoria engines: 0/10 -> deteccion cuando el dato de potencia vive en el titulo del lote, no en la descripcion).
T6 (push 2026-09-18): mapper ftp28 whitelist 31 claves (extras -> ext_*); preloaded_sold ya no usa literal "past-auction"; tipo="auction" via fallback a mc_code cuando no hay categoria real (categoria queda None).
0.10.14 — 2026-09-08 (tag latest)
Corregido
ref_anunciante vuelve a llevar el auction ID (formato de agosto), en las dos ramas
(inventario activo y subastas cerradas). Decisión de David 2026-09-08: el pipeline del
cliente está escrito contra el formato de agosto y esperaba el ID ahí. El valor sigue
duplicado en ext_auction_id. Revierte el vaciado introducido en 0.10 sin perder el ext_.
Desplegado en Apify como build 0.10.14 vía API.
0.10 — 2026-08-25 (tag beta, sin promocionar)
Corregido
ref_anunciante pasa a None. Contenía el identificador de la subasta, no del vendedor:
49 valores distintos para 80.522 lotes al 100% de cobertura. 1031 es
Leeds - 8th, 9th, 10th & 11th July 2026. En cualquier tabla resumen lucía como el mejor dato
del perímetro mientras decía la fecha del evento.
En Euro Auctions el vendedor es la propia casa de subastas; el consignatario no se publica.
ext_auction_id añadido a la rama de subastas cerradas. Solo existía en la de inventario
activo, así que vaciar ref_anunciante allí habría borrado el identificador sin dejar nada.
Añadido
_snapshot_dataset_name en las dos ramas, con los tres puntos de publicación de puntero
protegidos. El del inventario activo estaba sin proteger: una prueba en esa modalidad habría
repuntado el snapshot del cliente igual.
_admin_snapshot y _snapshot_dataset_name declarados en el input schema.
Por qué NO se ha promocionado
ref_anunciante pasa de 100% a 0%. El dato no se pierde —está en ext_auction_id— pero si
el cliente mira cobertura verá un campo caer a cero de un mes para otro, y si algo de su ingesta
lo usa como clave, se rompe. Hay que avisarlo antes.
Nota de plataforma: el actor estaba en el límite de 10 versiones. Se borró la v0.0 —vacía—
para crear ésta. Quedan tres versiones dev obsoletas por limpiar.
Formato: que cambio, por que, y la medicion que lo respalda. Un cambio sin numero detras es
una opinion; en este repo no cuenta como entrada de changelog.
Las versiones son las de Apify (mayor.menor). La plataforma no admite numero de parche.
[0.9] — 19 de agosto de 2026
Corregido — el volcado superaba el limite de payload y corrompia el puntero
Un push de 9.453.568 bytes contra el limite de 9.437.184 mataba el hilo. El run seguia
reportando exito y dejaba el puntero en 6.559 registros sobre un dataset de 20.702. Ahora el
volcado va en lotes de 500 y el hilo marca fallo, con Actor.fail().
Reconstruido — el historico de subastas cerradas
De 12 subastas recogidas a 240 de 240. Maestro consolidado: 422.893 registros, con precio de
cierre en el 100%.
Pendiente — sin ruta de entrada para las cerradas
run_preloaded(inp) resuelve siempre el puntero del inventario activo; pastAuctions: true
solo afecta al raspado en vivo. Quien pide las cerradas recibe el inventario activo, correctamente
formateado y sin ningun aviso. Es la unica de las dieciseis bases que no pasa la puerta de calidad.
Ademas activeOnly vale True por defecto y descarta cualquier item con precio de cierre — justo
los que forman el historico. El arreglo es el patron que ya usan Surplex y RB Auction:
run_preloaded(inp, pointer_key=...) elegido en el dispatch.
Pendiente — el puntero de cerradas apunta solo al mes
euroauctions-scraper-past resuelve a euroauctions-scraper-past-2026-08 (80.522), no al historico
consolidado de 422.893.
0.10 — builds 0.10.6 a 0.10.10 — 2026-08-29
Corregido — QA: actor marcado "Under maintenance"
El prefill de input_schema.json tenía dos problemas que hacían fallar el 100% de los tests
automáticos de Apify:
data_freshness: "live" forzaba un raspado en vivo innecesario para la validación de QA.
proxyConfiguration: { useApifyProxy: false } dejaba la petición sin proxy. La API de
Euro Auctions devuelve HTTP 403 desde IPs de datacenter; sin proxy residencial o de Apify,
todos los runs de QA fallaban.
Corregido: data_freshness prefill → "preloaded", proxyConfiguration prefill →
{ useApifyProxy: true }. El pretest de QA pasa en 3.9 s, 10 items, $0.0000.
Añadido — proxy residencial Decodo (Smartproxy)
Integración de Decodo como proxy primario, con Apify proxy como fallback:
Variable de entorno DECODO_PROXY (secreto, formato userid:password).
_get_decodo_proxy() construye la URL: http://user-{userid}-sessionduration-{min}:{pass}@gate.decodo.com:{port}.