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:
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.
Curso online 👨💻
¡Ya lanzamos el curso oficial de Recursos Python en Udemy!
Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter
en 2024.
Consultoría 💡
Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.