Scraping ML/AI/Data de NYT + WaPo → news-silo (2026-09-18)
Artefacto: ~/nef/news-silo/scrape_mlai.py (nuevo) + data/corpus-mlai.jsonl.
Qué hace
Scraper ampliado de temas ML/AI/Data desde The New York Times y The Washington Post,
con salida JSONL compatible con silo.py y silo_medios.py
(texto, destino, fuente, titulo, url, fecha, seccion, capturado).
Flujo en 4 subcomandos:
cd ~/nef/news-silo
.venv/bin/python scrape_mlai.py --discover # RSS + sitemap -> data/candidatos.jsonl
.venv/bin/python scrape_mlai.py --login # una vez: sesión en Brave perfil dedicado
.venv/bin/python scrape_mlai.py --captura-cookies # cookies -> data/prensa-cookies.json
.venv/bin/python scrape_mlai.py --fetch # texto completo -> data/corpus-mlai.jsonl
.venv/bin/python scrape_mlai.py --statusFlags: --sitio nyt|wapo, --metodo auto|cookies|browser, --limit-sitio N,
--headless, --sleep-min/max, --minimo (chars mínimos).
Credenciales
Se leen de .env local o de ~/nef/surtido/.vercel/.env:
WAPO_EMAIL/WAPO_PASSWORD, NYT_USER/NYT_PASS. El perfil de navegador es
data/prensa-perfil (override con PRENSA_PERFIL; el de surtido está en
~/nef/surtido/data/prensa-perfil). El texto completo vive SOLO en data/.
Estado verificado (2026-09-18)
--discover: ~70 candidatos por corrida (NYT vía 5 RSS + sitemap diario; WaPo vía RSS).--fetch: 68 artículos con texto completo (NYT 58 · WaPo 10; 552 mil palabras).- NYT y WaPo funcionan con navegador VISIBLE + perfil logueado. Headless es detectado (NYT/PollWatcher devuelve pared anti-bot); visible + sesión fresca es lo que funciona.
- Clustering:
silo.pycon k fijo (KMeans) separa mejor que HDBSCAN aquí; epsilon no movía la estructura (todo AI es un solo blob semántico).
Infografías
infografia.py genera HTML autocontenido desde el corpus (embeddings Qwen3 + KMeans
- c-TF-IDF):
.venv/bin/python infografia.py --k 8 --estilo dark -o infografia.html
.venv/bin/python infografia.py --k 8 --estilo luz -o infografia-luz.htmlSalidas: infografia.html/.png (oscuro, data-forward) e
infografia-luz.html/.png (claro, editorial). PNG vía Brave headless --screenshot.
Restricciones
- Local-only: el texto completo nunca se publica ni se copia a
reporte/. - Ritmo cortés (
--sleep-min/max), sin paralelismo, un navegador a la vez. vistos.json+ URLs del corpus evitan re-scrapear.
Siguiente paso natural
Correr --fetch periódico (cron) y alimentar silo_medios.py --dir data para
silos por tema; ampliar discovery de WaPo (su sitemap no responde fuera del
navegador; las secciones RSS son pocas).