НТО Джуниор
October 10

Сбор данных по API

Знакомство с API

API (Application Programming Interface) – это набор правил, которые позволяют одной программе взаимодействовать с другой. API часто используется для доступа к веб-сервисам, чтобы получать или отправлять данные. Такой набор правил описывает спецификация API. Как несложно догадаться - разработчики создают функции, необходимые для конкретной программы, поэтому для каждой программы нужно изучать спецификацию.

Как читать спецификацию API?

  1. Базовый URL: Это адрес, к которому будут отправляться все запросы. А именно, https://yupest2.pythonanywhere.com
  2. Методы HTTP: Определяют тип запроса. Основные методы:
    • GET (получение данных) - все функции предложенного API реализованы этим методом.
    • POST (отправка данных)
    • PUT (обновление данных)
    • DELETE (удаление данных)
  3. Эндпоинты (Адрес API): Это конкретные адреса, к которым можно отправлять запросы. Например, /api/v1.0/movies/<code>. Такой адрес можно добавить к базовому URL и открыть во вкладке браузера или отправить запрос программно.
  4. Параметры запросов: Данные, которые нужно передать в запросе (могут отсутствовать). Они могут быть в URL (для GET запросов). Существуют 2 вида параметров:
    • Если описанный параметр отсутствует в эндпоинте, то он добавляется в конец эндпоинтов через «?». Далее следует название параметра (атрибута), знак «=» и само значение параметра. Например, «?genre=мелодрама». Если параметров несколько, они записываются через знак «&»: ?genre=мелодрама&country=Россия
    • Если указаны - такие параметры называют параметрами пути, например <code>. Вместо него нужно указать необходимое значение.
  5. Ответ: результат запроса. Здесь описываются атрибуты и их значения в формат JSON.

Подытожим вышесказанное.

API - перечень доступных функций для получения информации в формате данных (JSON).

Спецификация API - содержит описание этих функций, так разработчик сможет определить какая функция будет нужна для той или иной задачи и как составить запрос.

Чтобы получить данные через API, нужно составить запрос:

Базовый URL + Эндпоинты + Параметры запросов

Например: https://yupest2.pythonanywhere.com/api/v1.0/movies/524

В этом примере параметр <code> был заменен на значение 524.

Ознакомьтесь со спецификацией API на сайте: https://yupest2.pythonanywhere.com/api/

Сбор данных

Мы уже научились формировать url ссылки и узнали набор функций API к данным фильмах. Теперь необходимо автоматизировать процесс сбора данных. Акитилана Кифарг подготовила для вас краткий экскурс в язык программирования Python и необходимые библиотеки, которые могут пригодиться при написании кода. В качестве среды разработки будем использовать trinket.

Чтобы использовать библиотеки в Python, их необходимо импортировать:

import <название библиотеки>

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

<название_библиотеки>.<название_метода>(<необходимые_параметры>)

Библиотека requests

Библиотека предназначена для работы с запросами. Вспомним: чтобы получить ответ от API, нужно сформировать запрос. В нашем случае в качестве запроса мы будем передавать только ссылку url с использованием метода get() и записывать ответ в переменную r

url = '<ссылка на ресурс>'
r = requests.get(url)

Чтобы получить содержимое ответа запишем его в переменную result в формате json:

result = r.json()

Формат json

Формат json имеет структуру ключ (key) и значение (value), записанные в фигурных скобках через :. При этом в качестве значений может быть задана последовательность в виде списка в [] через запятую или иметь вложенность, то есть в качестве значения также выступает ключ-значение, например:

{'key':['value1', 'value2'],
 'key1':'value',
 'key2':{'key3':'value'},
 'key4':[{'key5':'value'},{'key5':'value'}]
}

Чтобы получить значение по ключу, обратимся к нему в квадратных скобках:

result['key']

Если значение имеет вид списка, но может вернуться пустым, проверим это с помощью условия:

result['key']==[]

== - проверка на равенство значений, а != - проверка на неравенство

Чтобы получить значение key5 нулевого элемента из списка записей по ключу key4:

result['key4'][0]['key5']

То есть, берем значения по ключу, вернулся список в []. Далее получаем нулевую запись из списка и только теперь обращаемся к значению.

Циклы

Циклы позволяют выполнять один и тот же участок программного кода несколько раз. Например, нам необходимо получить записи о фильмах по нескольким жанрам. Чтобы не дублировать часть кода с получением данных по API воспользуемся циклом for, где будем использовать каждый жанр в отдельности из списка жанров. Каждый шаг цикла будет принимать значение соответствующего жанру в переменную genre.

Ввод данных пользователем осуществляется через метод input(). Ссылку сделаем шаблоном с помощью форматирования строки, для этого поставим f перед кавычками. В самой строке укажем в {} название переменной, которая будет подставляться в шаблон.

import requests

genre1 = input("Введите жанр: ")
genre2 = input("Введите другой жанр: ")

for genre in [genre1, genre2]:
  url = f'https://yupest2.pythonanywhere.com/api/v1.0/movies/?genre={genre}'
  print(url)
  r = requests.get(url)
  result = r.json()

Если мы не знаем количество шагов (последовательность значений), то будем использовать цикл while (пока). Такой цикл выполняется до тех пор, пока выполняется проверяемое условие.

while <условие>:
  pass

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

Списки и сохранение результата в файл

Создадим пустую переменную films = [], в которую будем добавлять список записей. Чтобы в итоге получить единый список, воспользуемся методом extend. Он принимает в качестве параметра последовательность значений и добавляет их в список по отдельности.

В конце выведем количество полученных записей через метод len, который возвращает количество элементов в последовательности.

import requests

genre1 = input()
genre2 = input()
films = []

for genre in [genre1, genre2]:
  url = f'https://yupest2.pythonanywhere.com/api/v1.0/movies/?genre={genre}'
  r = requests.get(url)
  result = r.json()
  print(result['records'])
  films.extend(result['records'])

print(len(films))

Чтобы сохранить результат в файл, воспользуемся конструкцией:

import json

with open('test.json', 'w', encoding='utf-8') as f:
  json.dump(films, f, ensure_ascii=False)

Здесь вы можете заменить название файла test на свое.