Obtener imágenes satelitales y telescópicas de la NASA (APOD)

Obtener imágenes satelitales y telescópicas de la NASA (APOD)



La Administración Nacional de la Aeronáutica y del Espacio (NASA) provee un servicio llamado Astronomy Picture of the Day (imagen astronómica del día, APOD) en el que diariamente publica una imagen o video de índole astronómica, generalmente capturas satelitales y telescópicas (o alguna tecnología similar) o bien simulaciones de algún fenómeno cosmológico, junto con un epígrafe redactado por un erudito del tema.

Por ejemplo, la siguiente es la fotografía publicada el 4 de junio de 2017:

Imagen astronómica (APOD)

El archivo íntegro de imágenes y videos desde la primera publicación el 16 de junio de 1995 hasta el día de la fecha puede ser accedido vía una API web. La conexión a la API desde Python puede realizarse con el módulo estándar urllib (o urllib2 en Python 2), a través del paquete Requests (aquí ejemplificaremos ambos casos) o bien cualquier otra librería que funcione como un cliente HTTP.

Generalmente Requests es la forma recomendada y puede ser instalado vía pip ejecutando:

pip install requests

Una vez instalado, obtenemos la publicación del día con el siguiente código.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests

params = {
    "api_key": "DEMO_KEY"
}
r = requests.get("https://api.nasa.gov/planetary/apod", params=params)

if r.status_code == 200:
    results = r.json()
    url = results["url"]
    # Si es una imagen guardar el archivo.
    if results["media_type"] == "image":
        with open("apod.jpg", "wb") as f:
            f.write(requests.get(url).content)
    else:
        print(url)
else:
    print("No se pudo obtener la imagen.")

Con este pequeño script accedemos a la API web para obtener la publicación del día. Si se trata de una imagen, la guardamos como apod.jpg, mientras que si se trata de un video simplemente imprimimos su URL en pantalla (generalmente una dirección de YouTube).

El servicio nos permite usar la clave "DEMO_KEY" para probar la API antes de tener que registrarnos para una clave real. No obstante ésta tiene bastantes limitaciones: no más de 30 peticiones por hora y un máximo de 50 por día. Por ende, si quieres hacer un uso más o menos intensivo de la API tendrás que obtener una clave totalmente gratuita registrándote en este enlace. En ese caso los límites se extienden a un máximo de 1000 peticiones por hora. (La NASA provee una clave con menores o nulas restricciones para casos particulares, poniéndote en contacto con ellos).

Para quienes quieran usar el módulo estándar urllib en lugar de Requests, el código es el siguiente:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from urllib.request import urlopen
import json

API_KEY = "DEMO_KEY"

r = urlopen("https://api.nasa.gov/planetary/apod?api_key=" + API_KEY)

if r.getcode() == 200:
    results = json.loads(r.read().decode("utf-8"))
    url = results["url"]
    if results["media_type"] == "image":
        with open("apod.jpg", "wb") as f:
            f.write(urlopen(url).read())
    else:
        print(url)
else:
    print("No se pudo obtener la imagen.")

Para acceder a la publicación de una fecha en particular debemos llamar a la API con el parámetro date (una fecha con el formato YYYY-MM-DD). Por ejemplo, para descargar la imagen del 8 de mayo de 2016:

# En Requests.
params = {
    "api_key": "DEMO_KEY",
    "date": "2016-05-08"
}

# En urllib.
API_KEY = "DEMO_KEY"
date = "2016-05-08"

r = urlopen(
    "https://api.nasa.gov/planetary/apod?api_key={}&date={}".format(
        API_KEY, date
    )
)

En caso de tratarse de una imagen, an ambos códigos puede reemplazarse la siguiente línea para descargar el archivo en alta definición.

# Definición normal.
url = results["url"]

Por:

# Alta definición.
url = results["hdurl"]

Además, el diccionario results incluye las siguientes claves:

  • "title": título de la publicación.
  • "copyright": nombre del/los autor(es).
  • "explanation": explicación de la imagen o video.
  • "date": fecha de la publicación.
  • "media_type": "image" o "video" segun corresponda.


Deja un comentario