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 --status

Flags: --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.py con 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.html

Salidas: 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).