Resumen

Conecta Python a News API de forma segura y clara: usa parámetros dinámicos, construye un query string fiable con las utilidades estándar de Python y procesa la respuesta en json sin perder tiempo en errores típicos. Aquí verás cómo incorporar tu API key, realizar un request robusto con urllib y convertir los bytes en un diccionario listo para usar.

¿Cómo obtener y proteger tu API key de News API?

Obtener la API key es el primer paso. Se solicita en newsapi.org completando un formulario y pulsando submit. Cópiala y úsala por ahora como constante en el código.

  • No hacerla pública ni subirla al repositorio.
  • Tratarla como una llave de acceso.
  • Guardarla temporalmente como constante para fines educativos.

La documentación oficial (Get Started, Searching for news articles) indica la URL base y que la API key se pasa como parámetro. Esa guía define el formato correcto del request.

¿Cómo construir la URL y el query string en Python?

La recomendación es evitar concatenar cadenas a mano. Usa las herramientas de Python: urllib.parse.urlencode para formatear parámetros y urllib.request para abrir la URL con un timeout controlado. Así la URL final es válida y el servidor entiende el GET.

  • Usar urllib.parse para generar el query string.
  • Añadir parámetros como la q de búsqueda y la apiKey.
  • Construir la URL final uniendo base y parámetros.

¿Qué hace urllib.parse.urlencode?

Convierte un diccionario de parámetros en un query string seguro para una URL. Evita errores de encoding y respeta el formato esperado por la API.

import json
from urllib import parse, request

API_KEY = "TU_API_KEY"
BASE_URL = "BASE_URL_DE_NEWS_API"  # URL base indicada en la documentación de búsqueda.

def fetch_news(api_key: str, query: str, timeout: int = 10):
    params = {
        "q": query,
        "apiKey": api_key,
    }
    query_string = parse.urlencode(params)
    url = f"{BASE_URL}?{query_string}"

    # Enviar el request con administrador de contexto.
    with request.urlopen(url, timeout=timeout) as resp:
        data_bytes = resp.read()  # Respuesta cruda en bytes.

    # Decodificar y parsear json.
    data_text = data_bytes.decode("utf-8")
    data = json.loads(data_text)
    return data

¿Cómo enviar el request con urllib.request y with?

Con el administrador de contexto with se maneja el response y se lee el contenido con seguridad. El timeout evita esperas indefinidas.

  • Abrir la URL con request.urlopen y pasar timeout.
  • Leer los bytes con .read().
  • Mantener el código claro y cercano a la función de fetch.

¿Cómo decodificar la respuesta y procesar artículos en json?

La respuesta llega como bytes. Hay que aplicar decode('utf-8') y luego json.loads para obtener un diccionario. Desde ahí, acceder a llaves como status, totalResults y especialmente articles para listar títulos.

  • Decodificar a texto con UTF-8.
  • Convertir a diccionario con json.loads.
  • Inspeccionar llaves con keys() para entender la estructura.
  • Iterar articles y mostrar title.
# Ejecución de prueba
response_data = fetch_news(API_KEY, "Python")
print(list(response_data.keys()))  # Ver llaves disponibles.

articles = response_data["articles"]  # Acceso a la lista de artículos.
for article in articles:
    print(article["title"])  # Imprimir solo el título.

Consejos prácticos que marcan diferencia:

  • Imprimir solo los primeros caracteres al inicio para validar el formato.
  • Mostrar el query string y la URL final para depurar.
  • Usar herramientas estándar de Python en lugar de armar URLs a mano.
  • Limpiar prints una vez que el flujo funcione.

¿Quieres profundizar o adaptar filtros de búsqueda? Explora la documentación de la API y comenta qué parámetros te gustaría incorporar a la función.