2026Desarrollo completo — scraper y pipeline de datos
maps-gluten-rag — De lista de Maps a RAG
Convierte una lista compartida de Google Maps de lugares sin gluten en archivos listos para RAG.
- Python
- Playwright
- SQLite
- GitHub Actions
- Gemini
- LLM
- RAG
- Web scraping
Problema
Mantengo una lista de Google Maps de restaurantes sin gluten, pero una lista compartida es un link, no una base de conocimiento consultable: no puedo preguntarle a NotebookLM qué contiene, embeberla ni confiar en ella sin abrir Maps cada vez.
No hay API para una lista compartida de terceros, y exportar a mano no se mantiene actualizado. Quería la lista extraída, deduplicada y refrescada semanalmente, de forma totalmente automática.
Enfoque
Extracción vía endpoint interno, con fallback
El extractor abre la lista pública con Playwright y lee el endpoint interno `entitylist/getlist`, que devuelve cada lugar con nombre, dirección, coordenadas, `ftid` y fecha de guardado. Luego recorre las filas del DOM para agregar valoración y categoría, que el endpoint no incluye. Si el endpoint cambia, cae a leer las filas directamente.
Descarté scrapear el HTML público de búsqueda de Google: tiene límite de tasa, consent-gates e inestabilidad estructural — el endpoint interno más un fallback al DOM es una superficie menor de mantener.
Estado de deduplicación en SQLite, en el cache del workflow
La fuente de verdad local es un archivo SQLite. En GitHub Actions vive en el cache del workflow (ignorado por git), por lo que cada corrida hace upsert en vez de agregar: conserva la fecha `saved_on` de Google y solo marca como nuevos los lugares que no existían.
Descarté commitear la base de datos: un binario en el repo rompe la revisión por diff y crece sin límite; el cache mantiene el histórico sin ensuciar el repositorio.
Cron semanal, a prueba de horario de verano
Un workflow de GitHub Actions corre cada lunes a las 13:00 hora de Chile. Programa dos crons UTC (16:00 y 17:00) y un paso revisa la hora local, por lo que se mantiene a la 1 pm cruzando los cambios de horario de verano. Publica los archivos `.md`, `.jsonl` y de cartas como artefactos, commitea los datos si cambiaron, y puede copiar el resultado a un Google Doc como fuente de NotebookLM.
Descarté un único cron UTC fijo: dos veces al año dispararía a las 12:00 o a las 14:00, lo que rompe el caso de uso (decidir dónde almorzar) para el que lo construí.
Resultados
- Corre de forma totalmente automatizada y gratuita en un repo público: extracción, deduplicación, enriquecimiento y publicación, los lunes a las 13:00 hora de Chile.
- Tres salidas desde una lista: un Markdown listo para NotebookLM, `jsonl` para embeddings y un `_menus.jsonl` separado con platos, precios y alérgenos.