Published

- 5 min read

Cómo crear un buscador de noticias en 75 líneas de Python

img of Cómo crear un buscador de noticias en 75 líneas de Python

Recientemente me encontré con la necesidad de crear un buscador de noticias automatizado que pudiera obtener información actualizada sobre cualquier tema. Después de experimentar con varias librerías complejas, decidí crear algo más simple y efectivo: un buscador que funciona con solo 75 líneas de Python y únicamente librerías estándar.

El resultado es una herramienta que puede buscar noticias sobre cualquier tema, estructurar la información en JSON y guardarla automáticamente, todo en segundos.

¿Por qué crear nuestro propio buscador?

En lugar de usar librerías pesadas como Beautiful Soup o Scrapy, quería algo que:

  • Funcionara inmediatamente sin instalaciones complicadas
  • Fuera rápido y eficiente para obtener resultados al instante
  • Generara datos estructurados en formato JSON
  • Fuera fácil de modificar según necesidades específicas

Componentes principales

Nuestro buscador consta de tres partes fundamentales:

  1. Clase Noticia: Estructura simple para almacenar datos
  2. Clase BuscadorNoticias: Motor principal con la lógica de búsqueda
  3. Función main(): Interfaz de usuario e integración

Paso 1: Estructura de datos

Empezamos definiendo cómo queremos almacenar cada noticia:

   class Noticia:
    def __init__(self, titulo, contenido, url):
        self.titulo = titulo
        self.contenido = contenido
        self.url = url

Esta clase es deliberadamente simple. Solo almacena lo esencial: título, contenido (snippet) y URL de la fuente.

Paso 2: El motor de búsqueda

La magia ocurre en la clase BuscadorNoticias. Aquí usamos la API de Serper, que nos permite hacer búsquedas en Google de forma programática:

   class BuscadorNoticias:
    def __init__(self):
        self.api_key = os.getenv("SERPER_API_KEY", "tu_clave_aqui")

    def buscar(self, tema, limite=5):
        """Busca noticias usando la API de Serper"""
        print(f"🔍 Buscando: {tema}")

        url = "https://google.serper.dev/search"
        data = json.dumps({"q": f"{tema} noticias", "gl": "es", "hl": "es"}).encode()
        headers = {"X-API-KEY": self.api_key, "Content-Type": "application/json"}

¿Por qué Serper?

Serper es una API que permite realizar búsquedas en Google sin las complicaciones del scraping directo. Ventajas:

  • Resultados en tiempo real directamente de Google
  • Sin bloqueos ni problemas de IP
  • Datos estructurados listos para procesar
  • Soporte multiidioma (configurado para español)

Paso 3: Manejo de peticiones HTTP

Usamos urllib.request, que viene incluido en Python, para realizar las peticiones:

   try:
    req = urllib.request.Request(url, data=data, headers=headers, method='POST')
    with urllib.request.urlopen(req, timeout=10) as response:
        result = json.loads(response.read().decode())

    noticias = []
    for item in result.get("organic", [])[:limite]:
        noticias.append(Noticia(
            item.get("title", "Sin título"),
            item.get("snippet", "Sin contenido"),
            item.get("link", "")
        ))

Puntos importantes:

  • Timeout de 10 segundos para evitar bloqueos
  • Manejo de errores con try/except
  • Datos seguros con .get() para evitar KeyErrors
  • Límite configurable de resultados

Paso 4: Presentación de resultados

Para mostrar los resultados de forma clara y atractiva:

   def mostrar(self, noticias, tema, fecha):
    """Presenta los resultados"""
    print(f"\n📰 {tema.upper()}")
    print(f"📅 {fecha}")
    print("="*50)

    for i, n in enumerate(noticias, 1):
        print(f"\n{i}. {n.titulo}")
        print(f"   📝 {n.contenido}")
        print(f"   🔗 {n.url}")

Paso 5: Exportación a JSON

Una de las características más útiles es la capacidad de guardar los resultados:

   def guardar(self, noticias, tema, fecha, archivo=None):
    """Guarda en JSON"""
    if not archivo:
        archivo = f"noticias_{tema.replace(' ', '_')}.json"

    datos = {
        "tema": tema,
        "fecha": fecha,
        "total": len(noticias),
        "noticias": [{"titulo": n.titulo, "contenido": n.contenido, "url": n.url} for n in noticias]
    }

    with open(archivo, 'w', encoding='utf-8') as f:
        json.dump(datos, f, indent=2, ensure_ascii=False)

El resultado es un JSON limpio y estructurado:

   {
	"tema": "inteligencia artificial",
	"fecha": "06 de September de 2025",
	"total": 5,
	"noticias": [
		{
			"titulo": "IA revoluciona la medicina...",
			"contenido": "Los últimos avances en inteligencia artificial...",
			"url": "https://ejemplo.com/noticia"
		}
	]
}

Manejo de errores y casos edge

El buscador incluye un sistema de fallback para cuando la API no está disponible:

   except Exception as e:
    print(f"⚠️ Error de API: {e}")
    return self._ejemplo(tema), datetime.now().strftime("%d de %B de %Y")

def _ejemplo(self, tema):
    """Noticias de ejemplo si falla la API"""
    return [
        Noticia(f"Novedades en {tema}", f"Últimas actualizaciones sobre {tema}", "https://ejemplo.com/1"),
        Noticia(f"Análisis de {tema}", f"Perspectiva experta sobre {tema}", "https://ejemplo.com/2")
    ]

Interfaz de usuario flexible

La función main() permite usar el buscador de dos formas:

   # Desde línea de comandos
python buscador_noticias_final.py "machine learning"

# Interactivamente
python buscador_noticias_final.py
# Te pedirá el tema por consola

Ejemplo de uso en la vida real

   $ python buscador_noticias_final.py "ciberseguridad"

🌟 BUSCADOR DE NOTICIAS FINAL v1.0
========================================
🔍 Buscando: ciberseguridad
 5 noticias encontradas

📰 CIBERSEGURIDAD
📅 06 de September de 2025
==================================================

1. CyberSecurity News - Revista Líder en Ciberseguridad
   📝 Los ciberataques vía email se disparan: más de 100 millones...
   🔗 https://cybersecuritynews.es/

💾 Guardado: noticias_ciberseguridad.json
 Proceso completado

Ventajas de este enfoque

🚀 Velocidad: Sin dependencias pesadas, arranca en segundos

🔧 Simplicidad: Solo 75 líneas de código fácil de entender

📦 Portabilidad: Funciona en cualquier instalación de Python 3

🎯 Efectividad: Resultados reales de Google en segundos

💾 Flexibilidad: Salida tanto visual como JSON estructurado

Posibles mejoras

Este buscador base se puede extender fácilmente:

  • Filtros por fecha: Buscar solo noticias recientes
  • Múltiples fuentes: Combinar diferentes APIs
  • Análisis de sentimiento: Procesar el contenido encontrado
  • Base de datos: Almacenar historial de búsquedas
  • API REST: Convertirlo en un servicio web

Consideraciones de seguridad

Variables de entorno: La API key debería estar en variables de entorno:

   export SERPER_API_KEY="tu_clave_real_aqui"

Rate limiting: Serper tiene límites de uso, ideal para proyectos personales pero considera esto para uso intensivo.

Conclusión

Crear herramientas útiles no siempre requiere frameworks complejos. Con 75 líneas de Python y las librerías estándar, hemos construido un buscador de noticias completamente funcional que puede:

  • Buscar información actualizada sobre cualquier tema
  • Estructurar los datos en formato JSON
  • Manejar errores graciosamente
  • Funcionar tanto interactivamente como por línea de comandos

La clave está en elegir las herramientas adecuadas (como la API de Serper) y mantener el código simple pero robusto. El resultado es una herramienta que realmente puedes usar en proyectos reales.

¿Te animas a probarlo? El código completo está diseñado para funcionar inmediatamente. Solo necesitas obtener una clave gratuita de Serper y empezar a buscar noticias.