2026-09-22 — Review de engines y plan de merging del scrapping
Objetivo: consolidar TODO el scrapping de ~/nef en un solo core con cuatro
perfiles nombrados: engine:editorial, engine:gartner-type-for-bikes,
engine:google-places-reviews y engine:ideas-for-second-brain.
Regla: el core es uno (captura → normaliza → dedup → almacén → búsqueda → salud). Los cuatro nombres son perfiles de fuentes + salida + consumidor, no cuatro codebases.
1. Review: qué existe hoy (scrapping)
| Proyecto | Qué scrapea | Dónde corre | Salida | Estado |
|---|---|---|---|---|
nef-silo (silo_engine.py) | 122 fuentes: 65 RSS + 51 X + 6 TG vía RSSHub | Linode /opt/silo, cron */30 | silo.db (SQLite), silo.jsonl, estado.json, silo-textos.json | core vivo; batería hoy: solape 100% con surtido, profundidad 50%→90% |
surtido | feed.py (RSS/X/YT/TG/HN), scripts/prensa_noche.py (prensa indep. AR/MX), likes_*.py (X likes) | Vercel (asgi.py) + cron Mac + radio→Linode | reporte/feed*.json, home.json, candidatas/, terna, boletín | producto vivo; fix DNS sin commitear |
news-silo | NYT/WaPo/Atlantic texto completo (RSS+sitemap, cookies/browser, boilerplate) | Mac (local-only) | data/corpus-mlai.jsonl, silos, infografías | 128 docs; sin commitear |
cf-crawl | CF Worker: /rss (gratis) + `/scrape | /links | /markdown | /read` (Browser Run) |
estado_turismo/spab-retrieval | reseñas (Apify memo23/scrapesmith), Booking (Playwright), SerpApi, Airbnb, BigQuery Places, Reddit, YouTube, imágenes | Mac + Vercel (Next.js) | corpus reseñas/precio/ocupación | vivo; sesión activa hoy |
estado_turismo/engine | no scrapea: consume corpus | CF Workers (engine.nef.workers.dev) | ranking JSON (RAG+personas) | eval Gemini/Workers AI ok |
motor_estado_turismo | no scrapea: seed faker | CF Workers | ranking JSON | precursor del anterior |
second-brain-twitter | exports claude/chatgpt, X likes, X/RSS, YouTube | Mac + worker CF | reports/extraccion-*.md → nodos | corrida HF en planeación |
second-brain | no scrapea: publica | Mac/quartz | notas _enrich/ | vivo |
| periféricos | infoq-clone, heraldodemexico.com, datastori-es, yt-extract/whisper-videos, marvelous, church-scanner, public_domain_gem, ckan-datos | — | corpus ad-hoc | congelados |
Lectura: ya hay un core (nef-silo) y tres familias de scraping fuera de él
(prensa local de surtido, places/reviews de turismo, exports personales).
engine:gartner-type-for-bikes no existe: es un perfil nuevo.
2. Los cuatro engines (destino)
| Engine | Fuentes (perfil) | Salida | Consumidor |
|---|---|---|---|
engine:editorial | RSS/X/TG (122) + prensa indep. + NYT/WaPo/Atlantic (tiers) | items + silos + export | surtido (home/boletín/radio), news-silo (infografía) |
engine:gartner-type-for-bikes | sector bici: medios, marcas, foros, reviews, reportes de mercado | dossier + informe tipo Gartner (MD/HTML) | cliente/portafolio (nuevo) |
engine:google-places-reviews | Apify (memo23/scrapesmith), SerpApi, Booking Playwright, BigQuery Places, Airbnb, Reddit | reseñas/precio/ocupación normalizados | estado_turismo/engine (RAG/ranking), rutas web |
engine:ideas-for-second-brain | exports claude/chatgpt, X likes, X/RSS, YouTube | nodos candidatos (extraccion-*.md) | second-brain (quartz) |
3. Arquitectura de fusión: un core, cuatro perfiles
nef-engine (core)
fuentes/ registro con `perfil` ∈ {editorial, gartner-bikes, places, ideas}
captura/ RSS · X · TG (RSSHub) · web (trafilatura T1) · browser (T2/T3)
normaliza/ canonical URL, lang/region, dedup MinHash + simhash
almacén/ SQLite + jsonl + FTS5 (columna `perfil`)
busca/ BM25 + embeddings + RRF + silos incrementales
salud/ scheduler, backoff, topes, alertas, dry-run
export/ JSON/RSS por perfil (nginx Linode) + SQLite local
perfiles/
editorial/ fuentes + tiers de pago + adapter para surtido
gartner-bikes/ fuentes del vertical + prompt de informe
places/ adaptadores Apify/SerpApi/Booking/BigQuery → items
ideas/ extractores de exports/likes → nodos (local-only)
Tiers de privacidad (ya validados por la batería F2.5):
- T0 contenido del feed, universal (server).
- T1 texto público en el server (trafilatura).
- T2/T3 local-only: paywall (NYT/WaPo/Atlantic) y personales (chats/likes).
Interfaz: cada perfil exporta JSON con shape único
({generado, perfil, items:[{url,titulo,medio,tema,publicado,capturado,lang,region,texto?,extra?}]}),
servido por nginx del Linode o artefacto Supabase. Los productos no leen la DB
del engine: leen el export (o SQLite en local).
4. Mapeo scraper → destino
| Hoy | Destino |
|---|---|
nef-silo/silo_engine.py | core (se generaliza: perfil en fuentes/items) |
surtido/feed.py | editorial (fuente ya cubierta; queda adapter delgado) |
surtido/scripts/prensa_noche.py | editorial (añadir Página 12, Periodistas Unidos, Revista Espejo) |
news-silo/scrape_mlai.py | editorial tier T2/T3 (paywall local) + boilerplate |
cf-crawl | captura/browser del core (Browser Run opcional) |
spab-retrieval/{corpus_resenas,reviews_airbnb,corpus_social,corpus_x_qroo,corpus_youtube} | places (adaptador → items) |
spab-retrieval/{precio_booking,precio_serpapi} | places (extra.precio) |
spab-retrieval/{datatur,ocupacion_*} | places (extra.ocupacion) |
second-brain-twitter/{extract_exports,claude_export_split,chatgpt_export_split} | ideas (local-only) |
second-brain-twitter/{likes,likes_deep,likes_hdbscan,likes_graph} | ideas (local-only) |
second-brain-twitter/{mine,distill,units,graph} | ideas (capa LLM/salida) |
estado_turismo/engine, motor_estado_turismo | consumidores (no se fusionan) |
surtido/{proponer,mailing,asgi,cartel,radio} | consumidores (no se fusionan) |
second-brain (quartz) | consumidor (no se fusiona) |
gartner-bikes | nuevo perfil (fuentes por definir) |
5. Fases (cada una termina en artefacto verificable)
F0 — core generalizado (nef-silo, dueño: sesión nef-silo)
perfilenfuentes/items+exportar --perfilcon shape único.- Artefacto:
export-editorial.json+export-places.jsonverificables porcurl.
F1 — engine:editorial (detalle: [CREDENCIAL].md)
- Añadir prensa indep. faltante; export → adapter
feed.py --desde-engine;/api/proponery/api/cronconFEED_SOURCE=engine; retirar cron local. - Artefacto: una edición completa generada 100% desde el engine.
F2 — engine:google-places-reviews
- Envolver los scrapers de
spab-retrievalcomo fuentesperfil=places(adaptador que escribe items +extra), corriendo donde ya corren (Mac/Vercel). - Artefacto:
places.jsoncon N reseñas/precios y elestado_turismo/engineconsumiéndolo sin cambios de contrato.
F3 — engine:ideas-for-second-brain
- Perfil
ideaslocal-only: exports + likes → items → extractor LLM → nodos. - Artefacto:
extraccion-*.mdregenerados desde el engine +_enrich/actualizado.
F4 — engine:gartner-type-for-bikes (nuevo)
- 15–25 fuentes semilla del vertical (medios especializados, marcas, foros, reviews, reportes) + prompt de síntesis tipo Gartner (mapa de mercado: categorías, jugadores, fortalezas, huecos).
- MVP: dossier de 1 vertical → informe MD/HTML con fuentes citadas.
- Artefacto: primer informe con fuentes trazables.
6. Riesgos / lista de NO
- NO un repo monolítico que rompa los deploys (Vercel/CF/Linode): core único + perfiles, consumidores en sus repos.
- NO subir T3 (paywall/personal) al server; NO mezclar
perfil=ideasconeditorialen un mismo export público. - NO duplicar captura (dos scrapers de la misma fuente = doble costo y dedup inconsistente).
- NO fusionar los consumidores (proponer/mailing/web/radio, estado_turismo/engine, quartz): solo consumen.
- NO inventar fuentes para
gartner-bikessin verificar (regla MBFC/credibilidad). - Un solo core = punto único de falla → se heredan salud/alertas + failsafes.
7. Coordinación
Cuatro sesiones abiertas hoy (nef-silo, news-silo, second-brain-twitter, surtido). Dueño del core: nef-silo. Este plan es la propuesta de consolidación; el punto de contacto entre perfiles es el shape del export.
8. Estado de ejecución (2026-09-22, misma sesión)
F0 — core generalizado: HECHO y desplegado.
silo_engine.py:perfilenfuentes/items(migración idempotente, defaulteditorial);construir_recursosescribeperfilpor fuente;capturarlo propaga al item;exportar --perfilcon shape único (url/titulo/medio/tema/perfil/publicado/capturado/lang/region/tipo/fuente).- Verificado en local (DB temporal) y en el Linode: 4660 items con
perfil=editorial;data/export-editorial.json(600 items, 347 KB). - Commit:
8a77fea(nef-silo).
F1a — prensa independiente al registro: HECHO y capturado.
recursos.json: 122 → 132 fuentes (75 RSS + 51 X + 6 TG) tomandoprensa_noche.FUENTES.- Captura real en el Linode: Página 12 37, Revista Espejo 10, Chiapas Paralelo 10, Periodistas Unidos 7, Contralínea 6. (Río Doce RSS da 500; Rompeviento TV usa YouTube y da 0 — ambos ya conocidos.)
Pendiente inmediato (F1b): servir export-editorial.json por nginx y hacer
feed.py --desde-engine en surtido; luego F2 (places), F3 (ideas), F4 (gartner-bikes).