Contenido del curso

Web scraping

Pandas

Implementando nuestro web scrapper: Configuración

Resumen

Crear un web scraper sólido en Python inicia con una configuración clara, un CLI sencillo y un sistema de logging confiable. Aquí verás cómo estructurar un mapa de mapas en YAML, cargarlo eficientemente con PyYAML, definir un CLI con argparse y preparar el esqueleto con una función principal que podrás extender sin fricción.

¿Cómo iniciar el web scraper con configuración YAML y estructura en Python?

Para avanzar rápido y sin errores, primero se crea la configuración, luego el módulo común para cargarla, y al final el archivo principal que ejecuta el CLI. La configuración usa un mapa de mapas: las llaves internas funcionan como IDs de sitios y cada una guarda su URL. Además, se cachea la configuración en memoria para evitar leer de disco varias veces.

¿Qué contiene config.yaml para los news sites?

  • Mapa de mapas: cada sitio es una llave con su URL.
  • IDs reutilizables: se usan como referencia en todo el código.
  • Expansible: podrás añadir llaves nuevas a medida que el scraper crece.
# config.yaml news sites: el universal: url: http://www.eluniversal.com.mx el país: url: https://elpais.com

¿Cómo se carga y cachea la configuración con PyYAML?

  • Instala la librería: conda install pyyaml.
  • Una sola lectura a disco: se almacena en una variable global.
  • with open: abre el archivo en modo lectura.
# common.py import yaml _config = None # cache en memoria def config(): global _config if _config is None: with open('config.yaml', 'r', encoding='utf-8') as f: _config = yaml.load(f, Loader=yaml.FullLoader) return _config

Puntos clave:

  • Cacheo de configuración: evita lecturas repetidas de disco.
  • yaml.load: convierte el archivo en un diccionario usable.
  • Variable global: accesible desde cualquier parte del código.

¿Cómo definir el CLI con argparse y preparar el esqueleto?

  • Entry point: if name == 'main'.
  • Argumento posicional: news_site elegido por el usuario.
  • choices dinámicos: se leen desde la configuración.
# main.py import argparse from common import config def main(): parser = argparse.ArgumentParser() news_site_choices = list(config()['news sites'].keys()) parser.add_argument( 'news_site', help='The news site that you want to scrape.', type=str, choices=news_site_choices ) args = parser.parse_args() news_scraper(args.news_site) if __name__ == '__main__': main()

Claves del CLI:

  • Argumentos vs opciones: los argumentos son necesarios, las opciones son opcionales.
  • Ayuda útil: el parámetro help facilita el uso desde línea de comandos.

¿Cómo se registra actividad con logging e inicia el esqueleto del scraper?

Usar logging en lugar de print aporta niveles, formato y registros consistentes. Aquí se configura lo básico y se implementa la función inicial del scraper, tomando el host desde la configuración para informar el inicio del proceso.

# main.py (continuación) import logging from common import config def news_scraper(news_site: str): uid = news_site # se usa la llave como ID host = config()['news sites'][uid]['url'] logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # API con *CamelCase* logger.info(f'Beginning scraper for {host}')

Buenas prácticas aplicadas:

  • basicConfig con nivel INFO: configura un nivel de log adecuado para desarrollo.
  • getLogger(name): contexto del módulo en cada mensaje.
  • Diseño por API: primero se definen las funciones y sus parámetros, luego su implementación.

¿Quieres que ampliemos la API del scraper o la estructura de datos de salida? Deja tus preguntas o ideas en los comentarios y con gusto te apoyamos.