Implementando nuestro web scrapper: Configuración

Clase 16 de 38Curso de Ingeniería de Datos con Python

Contenido del curso

Web scraping

Pandas

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.