Использование API

Начало работы с API в Python для сбора данных

Дружественное (и совсем не страшное) введение в API в Python

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

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

В реальном, абстрактном мире вы, вероятно, используете API каждый день, даже не подозревая об этом. Именно эта абстракция делает API такими полезными: веб-сайты могут полагаться на API Карт Google, чтобы связать вас с маршрутами, или ваш клиент Twitter позволяет вам публиковать данные непосредственно в вашей учетной записи.

Но как мы можем использовать API для сбора данных?

В этом руководстве мы сначала рассмотрим сбор данных без аутентификации, а затем еще один API, который требует от нас аутентификации. Мы начнем с того, что определим, где Международная космическая станция (МКС) в настоящее время использует Open Notify API, а затем воспользуемся аутентификацией в погодном API Dark Sky для сбора интересных данных о погоде. В заключение мы рассмотрим, как добавить данные о Франкфуртской фондовой бирже в Pandas DataFrame!

Хорошо… но как они работают?

Как и при взаимодействии с обычными веб-сайтами, когда вы хотите получить данные из API, вам необходимо сделать запрос с сервера. Чтобы иметь возможность извлекать данные из API с помощью Python, нам нужно будет использовать библиотеку запросов (см. Рисунок!). Requests - это более или менее стандартный пакет для выполнения HTTP-запросов в Python. Он чрезвычайно прост в использовании благодаря своей абстракции, особенно при работе с API.

Для начала вам может потребоваться установить библиотеку запросов, поскольку она не входит в стандартный пакет Python. Это можно сделать через pip или conda.

pip install requests
conda install requests

Запрос состоит из четырех частей:

  1. конечная точка, которая выглядит как URL-адрес данных.
  2. метод - GET, PUT, POST или DELETE. В этом посте мы будем рассматривать только запросы GET.
  3. заголовки, которые предоставляют такую ​​информацию, как ключи аутентификации.
  4. data / body, который не является частью запроса GET (так что представьте, что я не упомянул его сейчас)

Когда мы запускаем запрос с использованием библиотеки запросов, он возвращает объект запроса, который включает данные, которые мы надеемся извлечь, а также запрос код состояния. Код состояния сообщает нам, что произошло с запросом, и они являются частью каждого запроса, который мы делаем. Мы будем работать с GET-запросами, и есть несколько кодов ответов, которые важны для нашей работы. Коды разбиты на разные значения в сотнях, в зависимости от информации, которую они возвращают:

  • 1xx: Предоставьте информацию
  • 2xx: в целом успешно
  • 3xx: Предоставьте информацию о переадресации.
  • 4xx: ссылка на ошибку клиента (наше плохое)
  • 5xx: ссылка на ошибку сервера (их плохо)

Возможно, вы видели (иногда смешную) страницу 404, когда страница не может быть найдена. Вот что это за код состояния.

Точно так же код состояния 200 сообщает нам, что все в порядке! Это то, к чему мы стремимся и, надеюсь, получим!

API 101 - текущее местоположение ISS

В первой части этого руководства мы рассмотрим Open Notify API, который предоставляет данные о Международной космической станции. Вы можете найти более подробную информацию об API, посетив их документацию.

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

Начнем с создания URL-запроса с помощью библиотеки запросов и доступа к его атрибуту кода состояния.

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

Функция .get () запрашивает объект запроса. Здесь мы можем использовать атрибут .status_code, чтобы узнать, что возвращает код состояния. В этом примере возвращено значение status_code 200, что означает, что мы готовы двигаться вперед!

Данные, которые мы получаем, возвращаются в так называемом формате JSON. Файл JSON похож на словарь Python и гарантирует, что данные легко читаются машинами. Простой способ понять файлы JSON - представить их как словари Python, представленные в виде строк.

Чтобы начать работу с файлами JSON, давайте импортируем библиотеку JSON, которая является частью стандартного пакета (поэтому нам не нужно ничего устанавливать). Я поместил вывод кода под пунктирной линией для удобства чтения.

Строка, возвращаемая этим ответом, довольно короткая и легко читается. Однако многие ответы API будут длинными и могут потребовать небольшого анализа, чтобы определить, где вы хотите искать свои данные (если вас интересует конкретная часть). Давайте воспользуемся функцией .dumps () для преобразования строки JSON в объект Python. Мы повторим часть кода для непрерывности.

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

Здесь важно отметить, что мы вызываем здесь объект response.json (), а не тот, который мы вернули с помощью функции .dumps ().

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

Теперь давайте обратим наше внимание на API Dark Sky, который требует некоторой настройки, прежде чем мы сможем начать работу.

API 201 - API темного неба и добавление аутентификации

Давай запишемся!

Для начала нам понадобится так называемый секретный ключ API. Ключи - это способы, позволяющие аутентифицировать пользователя без необходимости указывать имя пользователя и пароль. Таким образом, с ними следует обращаться безопасно и не разглашать. Чтобы получить свой собственный секретный ключ Dark Sky, зарегистрируйтесь в учетной записи Dark Sky на странице https://darksky.net/dev/register. Уровень бесплатного пользования подойдет для экспериментов.

После регистрации перейдите на страницу учетной записи https://darksky.net/dev/account, где вы получите ваш API-ключ. Запишите этот ключ и держите его в секрете.

В рамках уровня бесплатного пользования вы можете совершать до 1000 звонков в день.

Что есть в Dark Sky API?

Dark Sky предоставляет подробный ресурс о том, какие данные включены в их API, к которому вы можете получить доступ, посетив: https://darksky.net/dev/docs

Существует два основных типа вызовов: (1) запрос прогноза и (2) запрос Time Machine. Первый предоставляет текущую погоду (до следующей недели), а второй предоставляет данные за прошлое и будущее.

Предположим, мы хотели получить текущие погодные условия (сводные данные, температуру и скорость ветра) для Торонто, Онтарио.

Запросы прогнозов имеют следующий формат: https://api.darksky.net/forecast/ [ключ] / [широта], [долгота ]

Значит, нам нужны три вещи:

  1. Наш ключ API,
  2. Наша широта и
  3. Наша долгота.

Чтобы легко определить свою широту и долготу, вы можете поместить искомый адрес в Карты Google. Например, я искал CN Tower в Торонто. Возвращенный URL будет содержать координаты: https://www.google.com/maps/place/CN+Tower/@ 43.6425701, -79.3892455, 17z /

После знака @ сначала идет долгота (43,6425701), а затем широта (-79,3892455).

Давайте напишем код подробным, но простым для понимания образом. Мы будем использовать f-строки, чтобы код было еще проще читать. Если вы не знакомы с f-строками, ознакомьтесь с документацией Python для них.

Основываясь на документации, мы видим, что общий запрос извлекает больше данных, чем нам нужно. Хотя это и не обязательно, мы можем сократить это количество с помощью блока исключения Dark Sky, который уменьшит задержку запроса. Мы будем использовать только блок в настоящее время, поэтому мы исключим все остальные.

Ранее мы упоминали, что нас будут интересовать текущие условия (в частности, сводка, температура и скорость ветра). Просматривая приведенную выше структуру, мы видим, что мы можем легко извлечь эти данные, обратившись к парам «ключ-значение» для этих элементов.

API Dark Sky позволяет также устанавливать единицы измерения. Прямо сейчас в нашем заявлении не ясно, в каких единицах находятся извлекаемые нами данные. Давайте будем более точными. Поскольку мы получаем данные для местоположения в Канаде, давайте укажем его регион. Документация по API Dark Sky сообщает u, что мы должны установить units = si.

До сих пор мы узнали, как выполнять вызовы API с аутентификацией и без нее. Давайте сделаем еще один шаг, добавив это в фреймворк Pandas.

По-настоящему фантазируйте: добавление данных во фрейм данных Pandas

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

Для этого мы будем использовать финансовый API Quandl. В частности, мы будем использовать бесплатный API для Франкфуртской фондовой биржи, документацию по которой можно найти здесь.

Давайте немного исследуем данные. Мы загрузим данные, следуя инструкциям по созданию URL-адреса на веб-сайте, и распечатаем данные с помощью функции json.dumps (), описанной выше. Нам нужно будет импортировать те же библиотеки, что и раньше, а также Pandas.

На самом деле данные хранятся очень-очень долго, но здесь они усечены.

Из этого мы видим, что:

  • Имена столбцов находятся в [‘dataset’] [‘column_names’].
  • Данные находятся в [‘dataset’] [‘data’]

Давайте создадим фрейм данных, используя эти знания:

Заключение: что мы узнали?

В этом посте мы изучили, что такое API, как использовать их в Python, как с аутентификацией, так и без нее, и как добавлять данные из API в фреймы данных pandas. Есть еще много чего, что мы здесь не рассмотрели, API-интерфейсы, но, надеюсь, это даст вам хорошее представление о том, откуда можно извлечь уроки!