Published
- 5 min read
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:
- Clase
Noticia: Estructura simple para almacenar datos - Clase
BuscadorNoticias: Motor principal con la lógica de búsqueda - 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.