Как использовать API: получать ежедневные изображения с помощью открытого API НАСА

получать ежедневные изображения с помощью открытого API НАСА Изучение

Национальное управление по аэронавтике и исследованию космического пространства (НАСА) предоставляет потрясающие астрономические изображения через службу Astronomy Picture of the Day. В этом руководстве мы собираемся использовать NASA API и библиотеку nasa.py для получения этих изображений.

Интерфейс прикладного программирования (API) — это набор инструкций и стандартов, используемых для доступа к веб-приложению. API-интерфейсы — очень полезный инструмент, который позволяет нам обмениваться информацией публично. Лучший способ научиться использовать API — это запрограммировать себя.

Сегодня мы узнаем, как загружать и отображать ежедневные астрономические изображения. Сначала мы возьмем сегодняшний день. изображение. Затем мы внесем несколько изменений в наш код, чтобы автоматически получать изображение любой даты.

Получите астрономическую картину дня с помощью API НАСА

В следующей программе. мы собираемся загрузить сегодняшнюю астрономическую картинку дня (APOD) с помощью открытого API НАСА. Программа загрузит только файлы изображений. Если на сегодняшний день нет доступного файла изображения, он просто напечатает сообщение с надписью «Изображение недоступно».

Если файл образа доступен, он будет загружен в локальную систему. Затем наш код получит изображение из локальной системы и отобразит его вместе с любой дополнительной информацией (например, заголовком, URL-адресом).

Затем наш код спросит пользователя, хотят ли они услышать звуковое объяснение изображения. Если пользователь желает услышать звуковое объяснение, мы воспользуемся библиотекой Google Text to Speech (GTTS), чтобы преобразовать текстовое объяснение в аудиофайл и воспроизвести его.

Примечание. Чтобы получить доступ к услугам, предоставляемым НАСА, нам нужен зарегистрированный ключ API. Чтобы получить ключ API, нам просто нужно заполнить форму на веб-сайте NASA API. Мы также можем использовать demo_key.

Мы можем размещать 1000 запросов в час с помощью зарегистрированного api, а с помощью demo_keyмы можем размещать только 50 запросов в день.

Читайте также:  Разделение данных в PySpark

После успешной регистрации вы получите ключ API на указанный адрес электронной почты. Мы будем использовать этот ключ позже в этом руководстве.

Спутник фиксирует активные пожары на западе США

Спутник фиксирует активные пожары на западе США

Наш спутник Aqua сделал это составное изображение в видимой и инфракрасной области 29 сентября 2020 года, которое показывает, что пожары и дым продолжают доминировать над ландшафтом западной части США.

С сайта NASA Image of the Day

Реализация Python (5 шагов)

Шаг 1. Импортируйте необходимые библиотеки

#Import required libraries:
import nasapy
import os
from datetime import datetime
import urllib.request
from IPython.display import Image,display,Audio
from gtts import gTTS
  • nasapy: Мы собираемся использовать библиотеку nasapy для доступа к информации, предоставляемой API НАСА.
  • os: Чтобы сохранить изображение в определенном каталоге, мы используем библиотеку os.
  • datetime: Мы используем дату при отправке запроса в NASA API для доступа к информации. Чтобы получить дату в определенном формате, мы воспользуемся библиотекой datetime.
  • urllib: Изображение, которое мы получаем из NASA API, будет в форме URL-адреса, поэтому мы используем urllib для его получения.
  • Ipython: Нам нужно отобразить изображение в блокноте jupyter, используя библиотеку Ipython. Мы также будем воспроизводить аудио-объяснение изображения с помощью аудиомодуля.
  • gtts: Мы используем библиотеку Google Text to Speech, чтобы преобразовать текстовое объяснение изображения в аудиофайл.

Шаг 2. Создайте объект класса НАСА.

Здесь мы собираемся создать объект с именем nasa. Мы используем nasapyбиблиотеку и зарегистрированный ключ API. Мы будем использовать этот объект для вызова метода Nasaкласса для получения информации об астрономических изображениях.

#Initialize Nasa class by creating an object:
k = «523p5hPYHGzafYGLCkqa54kKMTV2vbP0XcPxkcLm»
nasa = nasapy.Nasa(key = k)

Шаг 3. Получите дату в нужном формате.

Теперь, чтобы получить изображение для определенной даты, нам нужно передать дату в определенном формате. Требуемый формат даты — YYYY-MM-DDиспользование datetime.today()функции. Итак, нам нужно преобразовать этот кортеж в строку с помощью strftime(%Y-%m-%d)функции.

#Get today’s date in YYYY-MM-DD format:
d = datetime.today().strftime(‘%Y-%m-%d’)

Шаг 4. Получите информацию из API НАСА

Теперь, когда у нас есть сегодняшняя дата в правильном формате, мы можем разместить запрос на сегодняшнее астрономическое изображение. Здесь мы используем picture_of_the_day()метод для получения данных изображения.

#Get the image data:
apod = nasa.picture_of_the_day(date=d, hd=True)

Наша переменная apod — это словарь различных ключей и значений. Давайте посмотрим на ключи этой переменной:

  • date
  • title
  • copyright
  • explanation
  • url
  • hdurl
  • media_type
  • service_version

Наша переменная apod — это словарь различных ключей и значений

Шаг 5. Отображение изображения и другой информации

#POINT A:
#Check the media type available:
if(apod[«media_type»] == «image»):
    #POINT B:
    #Displaying hd images only:
    if(«hdurl» in apod.keys()):
        #POINT C:
        #Saving name for image:
        title = d + «_» + apod[«title»].replace(» «,»_»).replace(«:»,»_») + «.jpg»
        #POINT D:
        #Path of the directory:
        image_dir = «./Astro_Images»
        #Checking if the directory already exists?
        dir_res = os.path.exists(image_dir)
        #If it doesn’t exist then make a new directory:
        if (dir_res==False):
            os.makedirs(image_dir)
        #If it exist then print a statement:
        else:
            print(«Directory already exists!\n»)
        #POINT E:
        #Retrieving the image:
        urllib.request.urlretrieve(url = apod[«hdurl»] , filename = os.path.join(image_dir,title))
        #POINT F:
        #Displaying information related to image:
        if(«date» in apod.keys()):
            print(«Date image released: «,apod[«date»])
            print(«\n»)
        if(«copyright» in apod.keys()):
            print(«This image is owned by: «,apod[«copyright»])
            print(«\n»)
        if(«title» in apod.keys()):
            print(«Title of the image: «,apod[«title»])
            print(«\n»)
        if(«explanation» in apod.keys()):
            print(«Description for the image: «,apod[«explanation»])
            print(«\n»)
        if(«hdurl» in apod.keys()):
            print(«URL for this image: «,apod[«hdurl»])
            print(«\n»)
        #POINT G:
        #Displaying main image:
        display(Image(os.path.join(image_dir,title)))
        #Point H:
        #Text to Speech Conversion:
        #Take input from user:
        print(«\n»)
        choice = input(«Press * to hear the audio explanation : «)
        if(choice==»*»):
            #Text to be converted:
            mytext = apod[«explanation»]
            #mytext=»Good Evening Pratik.»
            #Creating an object:
            myobj = gTTS(text=mytext, lang=»en», slow=False)
            #Generating audio file name:
            audio_title = d + «_» + apod[«title»] + «.mp3»
            #Save the converted file:
            myobj.save(os.path.join(image_dir,audio_title))
            #Name of sound file:
            sound_file = os.path.join(image_dir,audio_title)
            # Playing the converted file
            display(Audio(sound_file, autoplay=True))
#POINT I:
#If media type is not image:
else:
    print(«Sorry, Image not available!»)

Теперь разберемся с кодом блок за блоком.

Отображение изображений:

  • Прежде всего, мы будем отображать только изображения.
  • Далее нас интересуют только изображения высокой четкости. Итак, если наше изображение имеет стандартную четкость, мы не входим в цикл.
  • Теперь мы должны поддерживать определенную структуру имен для сохранения изображений. Здесь мы будем использовать дату изображения, за которой следует заголовок изображения, за которым следует расширение изображения.
  • Мы также заменяем двоеточия и пробелы подчеркиванием.

Создание каталога:

  • Теперь у нас должен быть определенный каталог для хранения изображений. Создаем каталог с помощью библиотеки os. Чтобы проверить, существует ли каталог или нет, мы используем.exist()функцию. Если каталог не существует, мы создаем его с помощью.makedirs()функции.
  • Теперь мы получаем изображение, используя URL-адрес, полученный в переменной apod. Чтобы получить изображение, мы используем urllib.request.urlretrieve()функцию.
  • Мы также используем os.path.join()для хранения изображения во вновь созданном каталоге с указанным названием заголовка.
  • Используем apod[«hdurl«]для загрузки изображения.

Показать другую информацию:

Теперь, когда мы загрузили изображение в определенный каталог, мы собираемся отобразить другую связанную информацию с изображением. Мы проверяем, существует ли конкретная информация о ключе. Если ключ существует, мы отобразим его значение.
Затем выводим основное изображение с помощью Image()функции библиотеки Ipython.

Аудио Пояснение:

  • Теперь, когда отображается наше изображение и другая информация, мы спросим пользователя, хотят ли они услышать объяснение изображения или нет. Если пользователь нажимает *, мы будем использовать gttsбиблиотеку Google Text to Speech ( ) для преобразования текста в аудиофайл.
  • Мы создаем объект, который будет принимать текст для преобразования, скорость речи и язык в качестве входных данных. Затем мы сохраняем эту информацию в определенном каталоге с.mp3расширением.
  • Затем мы используем Audio()функцию для воспроизведения аудиофайла в нашей записной книжке jupyter.
  • Если типом носителя не является изображение, мы печатаем короткое сообщение о том, что «Изображение недоступно».

Запустите следующий файл Google Collaboratory, чтобы просмотреть правильные результаты. Вы можете загрузить и запустить этот файл кода в Интернете на сайте Google Collaboratory.

Получите астрономическое изображение на основе значения даты

Но что, если пользователь хочет получить изображение на определенную дату ? Все очень просто! Вместо использования сегодняшней даты мы получим дату от пользователя в указанном формате и передадим ее в качестве аргумента. Это единственная разница в коде. Ознакомьтесь с полным списком ниже.

#Import required libraries:
import nasapy
import os
from datetime import datetime
import urllib.request
from IPython.display import Image,display,Audio
from gtts import gTTS
#Initialize Nasa class by creating an object:
nasa = nasapy.Nasa(key=»523p5hPYHGzafYGLCkqa54kKMTV2vbP0XcPxkcLm»)
#Get today’s date in YYYY-MM-DD format:
d = input(«Enter date in YYYY-MM-DD format : «)
#Get the image data:
apod = nasa.picture_of_the_day(date=d, hd=True)
#POINT A:
#Check the media type available:
if(apod[«media_type»] == «image»):
    #POINT B:
    #Displaying hd images only:
    if(«hdurl» in apod.keys()):
        #POINT C:
        #Saving name for image:
        title = d + «_» + apod[«title»].replace(» «,»_»).replace(«:»,»_») + «.jpg»
        #POINT D:
        #Path of the directory:
        image_dir = «Astro_Images»
        #Checking if the directory already exists?
        dir_res = os.path.exists(image_dir)
        #If it doesn’t exist then make a new directory:
        if (dir_res==False):
            os.makedirs(image_dir)
        #If it exist then print a statement:
        else:
            print(«Directory already exists!\n»)
        #POINT E:
        #Retrieving the image:
        urllib.request.urlretrieve(url = apod[«hdurl»] , filename = os.path.join(image_dir,title))
        #POINT F:
        #Displaying information related to image:
        if(«date» in apod.keys()):
            print(«Date image released: «,apod[«date»])
            print(«\n»)
        if(«copyright» in apod.keys()):
            print(«This image is owned by: «,apod[«copyright»])
            print(«\n»)
        if(«title» in apod.keys()):
            print(«Title of the image: «,apod[«title»])
            print(«\n»)
        if(«explanation» in apod.keys()):
            print(«Description for the image: «,apod[«explanation»])
            print(«\n»)
        if(«hdurl» in apod.keys()):
            print(«URL for this image: «,apod[«hdurl»])
            print(«\n»)
        #POINT G:
        #Displaying main image:
        display(Image(os.path.join(image_dir,title)))
        #Point H:
        #Text to Speech Conversion:
        #Take input from user:
        print(«\n»)
        choice = input(«Press * to hear the audio explanation : «)
        if(choice==»*»):
            #Text to be converted:
            mytext = apod[«explanation»]
            #mytext=»Good Evening Pratik.»
            #Creating an object:
            myobj = gTTS(text=mytext, lang=»en», slow=False)
            #Generating audio file name:
            audio_title = d + «_» + apod[«title»] + «.mp3»
            #Save the converted file:
            myobj.save(os.path.join(image_dir,audio_title))
            #Name of sound file:
            sound_file = os.path.join(image_dir,audio_title)
            # Playing the converted file
            display(Audio(sound_file, autoplay=True))
#POINT I:
#If media type is not image:
else:
    print(«Sorry, Image not available!»)

Запустите следующий файл Google Collaboratory, чтобы просмотреть правильные результаты. Вы можете загрузить и запустить этот файл кода в Интернете на сайте Google Collaboratory.

Загрузка астрономических изображений за разные даты

Теперь, когда мы знаем, как загружать и отображать изображение для определенной даты, пора пойти немного дальше. Мы будем загружать изображения для разных дат и отображать случайные изображения из наших загрузок. Давайте разберемся, как этого добиться, ниже.

Реализация Python (9 шагов)

Шаг 1. Импортируйте необходимые библиотеки

Это те же библиотеки, которые мы использовали ранее.

These are the same libraries we used previously.
#Import required libraries:
import nasapy
import os
import pandas as pd
import urllib.request
from IPython.display import Image,display

Шаг 2: Создание объекта класса НАСА

Здесь мы собираемся создать объект с именем nasa. Мы используем библиотеку nasapy и зарегистрированный ключ api. Мы будем использовать этот объект для вызова метода класса Nasa для получения информации о наших астрономических изображениях.

#Initialize Nasa class by creating an object:
k = «523p5hPYHGzafYGLCkqa54kKMTV2vbP0XcPxkcLm»
nasa = nasapy.Nasa(key = k)

Шаг 3. Получите список дат

Мы хотим загрузить более одного изображения на более чем одно свидание. Итак, мы собираемся использовать date_range()функцию библиотеки pandas. Эта функция выдаст нам список дат в нужном формате. Здесь значение периода определяет диапазон списка.

Мы собираемся загрузить 5 изображений, но вы можете загрузить столько изображений, сколько захотите, настроив периоды и конечные значения.

#Get a list of dates:
dates = pd.date_range(end = ‘2020-08-15’, periods=5)

Шаг 4. Получите данные

В предыдущем случае у нас было только одно изображение. Но здесь мы собираемся загрузить много изображений. Для этого мы создаем пустой список для хранения всех значений для всех изображений в виде словаря.

Прежде всего, мы возьмем значение даты и сохраним его в переменной apod. Затем мы получим необходимую информацию в виде словаря и добавим ее в список.

#Empty list to store dictionary keys and values:
data = []
#Getting all the data:
for d in dates:
    apod = nasa.picture_of_the_day(d, hd=True)
    if apod[‘media_type’] == ‘image’:
        if ‘hdurl’ in apod.keys():
            data.append({‘date’:apod[‘date’], ‘title’: apod[‘title’],’hdurl’: apod[‘hdurl’]})

Шаг 5. Задайте место для хранения изображений.

Теперь мы собираемся создать каталог для хранения изображений, как мы это делали ранее.

#Path of the directory:
image_dir = «AAA_Images_1»
#Checking if the directory already exists?
dir_res = os.path.exists(image_dir)
#If it doesn’t exist then make a new directory:
if (dir_res==False):
    os.makedirs(image_dir)
#If it exist then print a statement:
else:
    print(«Directory already exists!\n»)

Шаг 6: загрузка изображений

Теперь, когда у нас есть вся информация об изображении и каталоге, мы собираемся загрузить изображения. Мы используем a for loopдля просмотра всех данных в нашем списке.

#Retrieving the image:
for img in data:
    #Creating title for image:
    title = img[«date»]+»_»+img[«title»].replace(» «,»_»).replace(«:»,»_»)+».jpg»
    #Downloading the image:
    urllib.request.urlretrieve(img[‘hdurl’],
os.path.join(image_dir,title))

Шаг 7. Получите список изображений

Теперь, когда мы загрузили все изображения, пришло время их отобразить. В каталоге будет много изображений, поэтому мы можем получить список изображений, используя следующий код.

#Get a list of images:
astro_images = os.listdir(image_dir)

Шаг 8: отображение изображения

Теперь мы можем легко отобразить изображение, используя Image(). Мы собираемся использовать, os.path.join()чтобы найти местоположение изображения. Здесь мы собираемся отобразить0-е0 т ч изображение из списка доступных изображений.

#Displaying an image:
Image(os.path.join(image_dir, astro_images[0]))

Шаг 9: отображение случайного изображения из списка

Мы можем использовать случайную библиотеку Python, чтобы получить случайное изображение из списка доступных изображений.

#Get random image:
import random
Image(os.path.join(image_dir, astro_images[random.randint(0,len(astro_images)-1)]))

Собираем все вместе

#Import required libraries:
import nasapy
import os
import pandas as pd
import urllib.request
from IPython.display import Image,display
#Initialize Nasa class by creating an object:
k = «523p5hPYHGzafYGLCkqa54kKMTV2vbP0XcPxkcLm»
nasa = nasapy.Nasa(key = k)
#Get a list of dates:
dates = pd.date_range(end = ‘2020-08-15’, periods=5)
#Empty list to store dictionary keys and values:
data = []
#Getting all the data:
for d in dates:
    apod = nasa.picture_of_the_day(d, hd=True)
    if apod[‘media_type’] == ‘image’:
        if ‘hdurl’ in apod.keys():
            data.append({‘date’:apod[‘date’], ‘title’: apod[‘title’],’hdurl’: apod[‘hdurl’]})
#Path of the directory:
image_dir = «AAA_Images_1»
#Checking if the directory already exists?
dir_res = os.path.exists(image_dir)
#If it doesn’t exist then make a new directory:
if (dir_res==False):
    os.makedirs(image_dir)
#If it exist then print a statement:
else:
    print(«Directory already exists!\n»)
#Retrieving the image:
for img in data:
    #Creating title for image:
    title = img[«date»]+»_»+img[«title»].replace(» «,»_»).replace(«:»,»_»)+».jpg»
    #Downloading the image:
    urllib.request.urlretrieve(img[‘hdurl’], os.path.join(image_dir,title))
#Get list of images:
astro_images = os.listdir(image_dir)

Шаг 1

#Displaying an image:
Image(os.path.join(image_dir, astro_images[0]))

Изображение ( os.path.join ( image_dir, astro_images [ 0 ]))

Шаг 2

#Get random image:
import random
Image(os.path.join(image_dir, astro_images[random.randint(0,len(astro_images)-1)]))

Заключение

Поздравляем с завершением этого увлекательного занятия с API НАСА и Python. Я надеюсь, что это упражнение научило вас некоторым новым вещам, которые вы можете делать с Python, и вдохновило вас на дальнейшее обучение.

Оцените статью
bestprogrammer.ru
Добавить комментарий