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.yamlnews 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.pyimport yaml
_config =None# cache en memoriadefconfig():global _config
if _config isNone:withopen('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.pyimport argparse
from common import config
defmain(): 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
defnews_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.