# Método de Scraping 5: Extracción Estructurada Generativa Local (Qwen ONNX) 🔮📋
El objetivo final del scraping moderno no es simplemente almacenar páginas web enteras, sino extraer **datos estructurados limpios (JSON, Parquet)** listos para ser consumidos por bases de datos, APIs o data pipelines. `bgustscraper` logra esto de forma **100% local, offline y sin coste alguno** integrando un modelo de lenguaje de última generación optimizado para correr sobre la CPU del host: `Qwen2.5-0.5B-Instruct`.
---
## ⚙️ Principio de Funcionamiento
Cuando ejecutas una búsqueda con la bandera de extracción (`--extract "..."` / `-e "..."`), `bgustscraper` orquesta el siguiente flujo:
1. **Obtención y Compresión del Texto:** El sitio web es raspado (Playwright o Cloudscraper) y su contenido se comprime semánticamente utilizando el clustering K-Means a 12 oraciones esenciales.
2. **Preparación del Contexto y Prompt de Sistema:**
* Se crea un prompt estructurado de sistema que fuerza al modelo a responder estrictamente en formato JSON válido.
* Se añade el texto comprimido del sitio web como contexto de origen inalterable.
* Se inyecta la consulta específica del usuario (ej: *"Extrae la tasa del dólar y euro, y la fecha de vigencia"*).
3. **Inferencia local ONNX CPU:**
* El worker Node.js carga en memoria el modelo `onnx-community/Qwen2.5-0.5B-Instruct` cuantizado en precisión **Q4** (ocupando solo ~350MB de RAM/disco).
* La inferencia se realiza de forma directa utilizando el motor nativo multi-hilo de **ONNX Runtime** para CPU.
* Se configura una **temperatura ultrabaja (0.1)** para evitar respuestas creativas y asegurar la fidelidad de los datos.
4. **Limpieza y Parsea Estricto:**
* El subproceso lee la respuesta en tiempo real.
* Limpia posibles marcas de bloque de código de markdown (como ` ```json ` y ` ``` `).
* Parsea de forma estricta el objeto JSON resultante.
* Si el parser tiene éxito, guarda el archivo físico en `downloads/extraction_<timestamp>.json` y propaga los datos a la CLI en formato JSON estilizado.
---
## 🛠️ Código y Archivos Relacionados
* **Orquestación en Rust:** [src/semantic_extractor.rs](file:///home/august/code/bgust-nlp-ecosystem/bgustscraper/src/semantic_extractor.rs) y [src/main.rs](file:///home/august/code/bgust-nlp-ecosystem/bgustscraper/src/main.rs).
* **Inferencia y Carga en Node.js:** [worker/index.js](file:///home/august/code/bgust-nlp-ecosystem/bgustscraper/worker/index.js) (uso de la biblioteca `@huggingface/transformers` v3).
---
## 💻 Ejemplo de Uso de la CLI
Para extraer las tasas de cambio de un portal financiero:
```bash
cargo run --release -p bgustscraper -- "https://www.bcv.org.ve" --extract "Extrae el valor de venta del Dólar (USD) y el Euro (EUR) con su fecha"
```
### Salida JSON Generada:
```json
{
"USD": 36.45,
"EUR": 39.12,
"moneda": "VES",
"fecha_vigencia": "2026-06-02"
}
```
---
## ⚖️ Ventajas y Desventajas
### Ventajas:
* **Privacidad Absoluta y Coste Cero:** No se envían datos confidenciales a APIs externas como OpenAI o Anthropic. Toda la inferencia es local y gratuita.
* **Consumo Increíblemente Bajo:** El modelo de 0.5B parámetros cuantizado en Q4 corre de forma fluida en micro-instancias en la nube o computadoras de escritorio estándar sin necesidad de tarjeta gráfica (GPU).
* **Fácil Integración:** Al entregar JSON puro estructurado, elimina la necesidad de escribir y mantener selectores CSS frágiles que se rompen cuando la estructura visual del sitio cambia mínimamente.
### Desventajas:
* **Capacidad de Razonamiento Acotada:** Al ser un modelo ultra-pequeño (500M de parámetros), no se le pueden delegar tareas de razonamiento lógico extremadamente complejas o traducciones masivas en el mismo paso.
* **Tiempo de Inferencia en CPU:** Puede tardar entre 2 y 5 segundos por inferencia en CPUs comerciales normales.