Сбор данных по API
Знакомство с API
API (Application Programming Interface) – это набор правил, которые позволяют одной программе взаимодействовать с другой. API часто используется для доступа к веб-сервисам, чтобы получать или отправлять данные. Такой набор правил описывает спецификация API. Как несложно догадаться - разработчики создают функции, необходимые для конкретной программы, поэтому для каждой программы нужно изучать спецификацию.
- Базовый URL: Это адрес, к которому будут отправляться все запросы. А именно, https://yupest2.pythonanywhere.com
- Методы HTTP: Определяют тип запроса. Основные методы:
- GET (получение данных) - все функции предложенного API реализованы этим методом.
- POST (отправка данных)
- PUT (обновление данных)
- DELETE (удаление данных)
- Эндпоинты (Адрес API): Это конкретные адреса, к которым можно отправлять запросы. Например,
/api/v1.0/movies/<code>
. Такой адрес можно добавить к базовому URL и открыть во вкладке браузера или отправить запрос программно. - Параметры запросов: Данные, которые нужно передать в запросе (могут отсутствовать). Они могут быть в URL (для GET запросов). Существуют 2 вида параметров:
- Если описанный параметр отсутствует в эндпоинте, то он добавляется в конец эндпоинтов через «
?
». Далее следует название параметра (атрибута), знак «=
» и само значение параметра. Например, «?genre=мелодрама
». Если параметров несколько, они записываются через знак «&
»:?genre=мелодрама&country=Россия
- Если указаны - такие параметры называют параметрами пути, например <code>. Вместо него нужно указать необходимое значение.
- Ответ: результат запроса. Здесь описываются атрибуты и их значения в формат 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, их необходимо импортировать:
После чего к ним можно обращаться и использовать доступные методы через точку:
<название_библиотеки>.<название_метода>(<необходимые_параметры>)
Библиотека предназначена для работы с запросами. Вспомним: чтобы получить ответ от API, нужно сформировать запрос. В нашем случае в качестве запроса мы будем передавать только ссылку url с использованием метода get() и записывать ответ в переменную r
url = '<ссылка на ресурс>' r = requests.get(url)
Чтобы получить содержимое ответа запишем его в переменную result в формате json:
result = r.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)