Простое руководство по использованию API для получения данных с помощью Python

Интерфейс прикладного программирования (API) стал основным компонентом многих продуктов и услуг, к которым мы привыкли.

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

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

Формы сбора данных

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

1. Сбор собственных данных

Это кажется легкой задачей; если вам нужны какие-то данные, почему бы не собрать свои собственные? Ведь никто не понимает ваши требования лучше, чем вы сами. Итак, просто выйти там можно начать собирать, не так ли?

Неправильный.

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

Это неосуществимое (если не невозможное) предприятие.

2. Использование готовых наборов данных

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

Готовые наборы данных могут быть привлекательными, поскольку кто-то уже проделал за вас всю тяжелую работу по их созданию. Вы, несомненно, сталкивались с ними на таких сайтах, как Kaggle.com и Data.gov.

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

Скорее всего, некоторые из записей или функций, которые были бы вам полезны, были отброшены источником.

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

3. Парсинг в Интернете

Веб-скрапинг — это что-то среднее между сбором собственных данных и использованием чужих.

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

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

Во-первых, извлечение данных с веб-сайтов с помощью парсинга может оказаться сложной задачей. Инструменты веб-скрейпинга, такие как Selenium, требуют хорошего знания HTML и языка XML Path Language (XPath). Кроме того, сценарии, необходимые для навигации по веб-сайтам и получения необходимой информации, могут быть длинными, и для их написания может потребоваться много времени.

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

Веб-скрапинг без достаточной осторожности и осторожности может навлечь на вас неприятности.

Преимущества API

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

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

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

Наконец, лучшая часть этого ресурса заключается в том, что он может облегчить извлечение данных всего несколькими строками кода!

Кратко о том, что делают API

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

Когда клиенту требуется доступ к определенным данным с внешнего сервера, он делает запрос на этот сервер.

Когда сервер получает запрос, он создает ответ, который отправляет обратно клиенту.

API играет роль посредника в этом обмене. Он отвечает за доставку вашего запроса на сервер, а затем за доставку соответствующего ответа вам.

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

К сожалению, не существует универсального подхода к работе с API.

API разных источников различаются по доступности и реализации.

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

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

Тематическое исследование

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

Мы будем использовать API от New York Times под названием API поиска статей. Этот API позволяет искать статьи по запросу.

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

Во-первых, мы создаем функцию на Python, которая генерирует URI для API с учетом запроса, порядка сортировки, номера страницы и ключа API.

# obtain the URI for access to articles for a given query, page number, sorting order
def get_URI(query:str, page_num:int, sort_order:str, API_KEY:str) -> str:
# create a URI string
URI = 'https://api.nytimes.com/svc/search/v2/articlesearch.json?q='+query
# if a page number is mentioned, add it to the URI
if page_num:
add_to_URI = '&page='+str(page_num)
URI+= add_to_URI
# if the sorting order is mentioned, add it to the URI
if sort_order:
add_to_URI = '&sort='+sort_order
URI += add_to_URI
# add the given API key to the URI
add_to_URI = '&api-key='+API_KEY
URI += add_to_URI
# return the new URI
return URI
view raw URI function hosted with ❤ by GitHub

Примечание. Здесь переменная API_KEY хранит ключ API в виде строки символов. Вы можете получить ключ API, подав заявку через учетную запись разработчика New York Times.

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

# get the URI needed for the articles related to Winter Olympics in page 1 from newest to oldest
URI = get_URI(query='Winter Olympics', page_num=1, sort_order='newest', API_KEY=API_KEY)
view raw Get the URI hosted with ❤ by GitHub

Выполнение запросов в Python — это простая задача с пакетом «requests». После того, как вы сделаете запрос и получите ответ от сервера, вы должны проанализировать ответ в формате JSON (в данном случае).

Все это выполняется в следующем коде.

import requests
# make a request to the server
response = requests.get(URI)
# parse the response (only works for JSON format)
data = response.json()

Насколько это было просто?

Теперь давайте посмотрим на ответ.

# print response
print(data)
view raw print data hosted with ❤ by GitHub

Довольно многословно, правда? Это то, что вы обычно можете ожидать от ответа.

В нашем случае API возвращает данные в виде вложенного объекта JSON.

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

К счастью, функция Pandas json_normalize позволяет нам легко работать с вложенными объектами JSON.

from pandas.io.json import json_normalize
# convert JSON response to a data frame
df = json_normalize(data['response'], record_path=['docs'])

Вот заголовки и даты публикации первых 5 статей:

# show the headline and publication date
df[['headline.main', 'pub_date']].head(5)

Подробная информация обо всей информации, предоставленной в ответах, содержится в документации по API.

Теперь давайте посмотрим, сколько статей было получено из ответа:

# number of articles stored in data frame
print('Number of articles in dataframe: {}'.format(df.shape[0]))

Как видите, во фрейме данных всего 10 записей, что меньше 1000 статей, которые мы хотим собрать. Итак, что происходит?

Это просто, правда. API New York Times поддерживает ограничение в 10 статей на каждый запрос.

Получить 1000 статей легко; мы просто делаем несколько запросов (с разным номером страницы в каждом запросе), пока не получим желаемое количество данных.

import time
import pandas as pd
# create a dataframe that will store all articles
df = pd.DataFrame()
# collect the data for articles in the first 100 pages
for page_num in range(1,101):
try:
# get the URI needed for the articles related to Winter Olympics from newest to oldest
URI = get_URI(query='Winter Olympics', page_num=page_num, sort_order='newest', API_KEY=API_KEY)
# make a request with the url
response = requests.get(URI)
# collect the data from the response in JSON format
data = response.json()
# convert data to a data frame
df_request = json_normalize(data['response'], record_path=['docs'])
# append df_request to the dataframe
df = pd.concat([df, df_request])
# pause to stay within the limit of number of requests
time.sleep(6)
# if there isn't a page number for the query, stop the loop
except:
print('There is no page number {} for this query.'.format(page_num))
break

Примечание: команда time.sleep(6) в строке 26 используется для увеличения времени между каждым запросом. Эта строка добавлена, потому что API New York Times накладывает ограничение на количество запросов, которые вы можете делать в минуту.

Теперь давайте посмотрим, сколько статей хранится в новом фрейме данных.

# number of articles
print('Number of articles in the new data frame: {}'.format(df.shape[0]))

Вуаля! Мы получили последние 1000 статей о зимних Олимпийских играх, опубликованных в New York Times.

Заключение

В общем, API — бесценный ресурс для тех, кто хочет создавать приложения или проводить исследования на основе данных.

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

Желаю вам удачи в ваших начинаниях в области науки о данных!