1
Health check — verificar daemon activo
08:01:53
⚡bash
TERMINAL
~/.kimi-webbridge/bin/kimi-webbridge status
Respuesta
12ms
"running": true, "extension_connected": true, "version": "2.4.1"
2
navigate — abrir Doctoralia nutricionistas Madrid
08:01:54
🌐curl
ACTION: navigate
curl -s -X POST http://127.0.0.1:10086/command \
-H 'Content-Type: application/json' \
-d '{
"action": "navigate",
"args": {
"url": "https://www.doctoralia.es/nutricionistas/madrid",
"newTab": true,
"group_title": "NutriPulse — Captacion leads"
},
"session": "nutribase-scraping"
}'
Respuesta
380ms
{
"success": true,
"url": "https://www.doctoralia.es/nutricionistas/madrid",
"tabId": 847
}
3
snapshot — leer arbol de accesibilidad
08:01:55
Por que snapshot en lugar de CSS: Los @e refs del arbol de accesibilidad sobreviven cambios de clases CSS y hashes de bundler. Son el selector mas robusto para automatizaciones a largo plazo.
📸curl
ACTION: snapshot
curl -s -X POST http://127.0.0.1:10086/command \
-d '{"action":"snapshot","args":{},"session":"nutribase-scraping"}'
Arbol de accesibilidad (fragmento)
92ms
{
"url": "https://www.doctoralia.es/nutricionistas/madrid",
"title": "Nutricionistas en Madrid | Doctoralia.es",
"tree": [
{ "@e": "@e12", "role": "listitem", "name": "Dra. Carmen Ruiz Molina" },
{ "@e": "@e13", "role": "listitem", "name": "Dra. Isabel Torres Vega" },
{ "@e": "@e14", "role": "listitem", "name": "Dr. Marcos Alonso Prieto" },
// ... 20 especialistas mas
]
}
4
evaluate — extraer datos estructurados con JS
08:01:55 — 08:01:58
⚙curl
ACTION: evaluate
curl -s -X POST http://127.0.0.1:10086/command \
-d '{
"action": "evaluate",
"args": {
"code": "(() => { const cards = document.querySelectorAll(\"[data-id=specialist-card]\"); return JSON.stringify([...cards].map(c => ({ nombre: c.querySelector(\".name\")?.textContent?.trim(), ciudad: c.querySelector(\".city\")?.textContent?.trim(), rating: parseFloat(c.querySelector(\".rating\")?.textContent), telefono: c.querySelector(\".phone\")?.textContent?.trim() || null, tiene_web: !!c.querySelector(\"a.website-link\") }))); })()"
},
"session": "nutribase-scraping"
}'
# Nota: JSON.stringify sin indent para evitar truncado de respuesta
# Nota: IIFE para scope limpio entre llamadas evaluate
23 especialistas extraidos
210ms
{
"type": "string",
"value": "[{\"nombre\":\"Dra. Carmen Ruiz Molina\",\"ciudad\":\"Madrid\",...},...]"
}
5
screenshot — capturar evidencia visual
08:01:58
📷curl
ACTION: screenshot
curl -s -X POST http://127.0.0.1:10086/command \
-d '{
"action": "screenshot",
"args": {
"format": "png",
"path": "/tmp/nutribase/doctoralia-madrid-20260618.png"
},
"session": "nutribase-scraping"
}'
Screenshot guardado
145ms
{
"format": "png",
"path": "/tmp/nutribase/doctoralia-madrid-20260618.png",
"sizeBytes": 284651,
"mimeType": "image/png"
}
6
Leads capturados — filtrados por prioridad NutriPulse
23 registros
17 leads calificados sin web propia — candidatos ideales para el pitch de NutriPulse SaaS. Puntuacion calculada como: rating × 10 + (sin_web ? 20 : 0) + (telefono ? 10 : 0).
| # | Nombre | Ciudad | Rating | Telefono | Tiene web | Score lead |
|---|---|---|---|---|---|---|
| 01 | Dra. Carmen Ruiz Molina | Madrid | ★★★★★ 4.9 | +34 910 44 55 21 | No ✓ | 79 |
| 02 | Dra. Isabel Torres Vega | Madrid | ★★★★★ 4.8 | +34 914 67 88 03 | No ✓ | 78 |
| 03 | Dr. Marcos Alonso Prieto | Barcelona | ★★★★★ 4.8 | +34 932 11 44 76 | No ✓ | 78 |
| 04 | Dra. Lucia Fernandez Gil | Barcelona | ★★★★½ 4.7 | +34 931 22 89 45 | Si | 57 |
| 05 | Dra. Ana Maria Soler Roca | Valencia | ★★★★★ 4.9 | +34 963 54 17 22 | No ✓ | 79 |
| 06 | Dr. Roberto Perez Cuenca | Madrid | ★★★★½ 4.6 | — | No ✓ | 66 |
| 07 | Dra. Patricia Gomez Lara | Valencia | ★★★★★ 4.8 | +34 960 33 21 98 | Si | 58 |
| 08 | Dra. Sofia Navarro Blanco | Madrid | ★★★★★ 4.7 | +34 915 88 62 41 | No ✓ | 77 |
| 09 | Dr. Javier Moreno Santos | Barcelona | ★★★★½ 4.5 | +34 933 77 55 14 | No ✓ | 75 |
| 10 | Dra. Elena Castro Mora | Madrid | ★★★★★ 4.9 | +34 910 12 34 56 | No ✓ | 79 |
| + 13 registros mas en el CSV completo (leads_nutribase_20260618.csv) | ||||||
7
Script cron completo — ejecucion diaria automatizada
#!/bin/bash
# NutriPulse — Scraping diario Doctoralia via Kimi WebBridge
# Cron: 0 8 * * * /home/nutribase/scripts/scrape_nutribase.sh
BASE="http://127.0.0.1:10086/command"
SESSION="nutribase-$(date +%Y%m%d)"
OUTPUT="/data/leads/leads_$(date +%Y%m%d).csv"
CIUDADES=("madrid" "barcelona" "valencia")
# 1. Health check
STATUS=$(~/.kimi-webbridge/bin/kimi-webbridge status)
if [[ $(echo $STATUS | jq -r .running) != "true" ]]; then
echo "Daemon no activo — abortando"; exit 1
fi
# 2. Iterar ciudades
echo "nombre,ciudad,rating,telefono,tiene_web,score" > $OUTPUT
for CIUDAD in ${CIUDADES[@]}; do
# Navegar
curl -s -X POST $BASE -H 'Content-Type: application/json' \
-d "{\"action\":\"navigate\",\"args\":{\"url\":\"https://www.doctoralia.es/nutricionistas/$CIUDAD\",\"newTab\":true},\"session\":\"$SESSION\"}"
sleep 1 # esperar carga
# Extraer datos con evaluate
DATOS=$(curl -s -X POST $BASE -H 'Content-Type: application/json' \
-d "{\"action\":\"evaluate\",\"args\":{\"code\":\"(() => { ... })()\" },\"session\":\"$SESSION\"}" \
| jq -r .value)
# Filtrar y calcular score
echo $DATOS | python3 /home/nutribase/scripts/parse_leads.py >> $OUTPUT
done
# 3. Cerrar sesion limpiamente
curl -s -X POST $BASE -d "{\"action\":\"close_session\",\"args\":{},\"session\":\"$SESSION\"}"
echo "Completado: $(wc -l < $OUTPUT) leads en $OUTPUT"
8
close_session + resumen final
08:01:57
🔒curl
ACTION: close_session
curl -s -X POST http://127.0.0.1:10086/command \
-d '{
"action": "close_session",
"args": {},
"session": "nutribase-scraping"
}'
Session cerrada
88ms
{
"success": true,
"closed": 3
}
📊 Breakdown por ciudad
Madrid
9 leads
Barcelona
7 leads
Valencia
7 leads
🎯 Calidad leads
Score > 75
8 leads
Score 60–75
9 leads
Score < 60
6 leads
⏱ Tiempos de ejecucion
navigate (×3)
1.14s
snapshot (×3)
276ms
evaluate (×3)
630ms
screenshot (×3)
435ms
close_session
88ms
Total
4.2s
✓
Timeline de la sesion completa
08:01:53
Health check OK
running: true + extension_connected: true — daemon v2.4.1 activo08:01:54
navigate x3 — Madrid, Barcelona, Valencia
Sesion
nutribase-scraping abre 3 tabs en un mismo grupo visible en Chrome08:01:55
snapshot x3 — arbol de accesibilidad
Extrae refs
@e12..@e35 para cada card de especialista sin depender de CSS08:01:55
evaluate x3 — extraccion JS con IIFE
23 objetos JSON extraidos: nombre, ciudad, rating, telefono, tiene_web. IIFE evita SyntaxError de redeclaracion entre llamadas
08:01:56
screenshot x3 — evidencia visual PNG
Guardado en
/tmp/nutribase/doctoralia-{ciudad}-20260618.png — ruta personalizada, no base6408:01:57
close_session — 3 tabs cerradas
Grupo "NutriPulse — Captacion leads" eliminado del navegador del usuario