Найти в Дзене
Zoomify

Python: как взаимодействовать с API

Оглавление

Узнайте, как взаимодействовать с API, используя Python, о библиотеке Requests и распространенных методах HTTP. Плюс несколько продвинутых техник и рекомендации по устранению неполадок.

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

Python - отличный вариант для взаимодействия с API

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

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

Существует множество методов HTTP и кодов состояния для API. Методы HTTP сообщают API о типе действия, которое нужно выполнить с данными. После того как API обработает HTTP-запрос, сделанный с использованием методов HTTP, он возвращает ответ с кодом состояния HTTP. Этот код состояния сообщает нам об успешности или неудаче запроса.

Коды состояния API и методы HTTP

Давайте рассмотрим некоторые из наиболее распространенных кодов состояния и методов HTTP.

Коды состояния

Код состояния возвращается при каждом вызове к веб-серверу. Вот некоторые из наиболее распространенных из них:

- 200 - OK: Запрос был успешным.

- 201 - Created: Ресурс был создан, например, новый пользователь или новый файл.

- 204 - No Content: Запрос был успешным, но контента для возврата нет.

- 301 - Moved Permanently: Запрашиваемый ресурс был перемещен в новое местоположение.

- 400 - Bad Request: Сервер не может обработать запрос из-за ошибки или отсутствия некоторой информации.

- 401 - Unauthorized: Запрос требует аутентификации, потому что вы не отправили правильные учетные данные для доступа к API.

- 403 - Forbidden: У вас нет прав на доступ к ресурсу. Подробнее о том, как решить эту ошибку в этой статье.

- 404 - Not Found: Запрошенный ресурс не найден на сервере.

- 405 - Method Not Supported: Метод, использованный в запросе, не поддерживается ресурсом.

- 500 - Internal Server Error: На стороне сервера произошла неизвестная ошибка.

- 503 - Service Unavailable: Сервер перегружен или находится в режиме обслуживания.

Методы HTTP

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

- GET: Этот метод используется для получения данных (например, содержимого веб-страницы) с сервера.

- POST: Этот метод используется для отправки данных на сервер или добавления новых данных на сервер.

- PUT: Этот метод используется для обновления данных на сервере или изменения существующей информации.

- PATCH: Этот метод используется для внесения частичных изменений в существующий ресурс на сервере.

- DELETE: Этот метод используется для удаления определенной информации с сервера.

Начало работы с библиотекой Python Requests

В Python 3 вам нужна всего лишь одна библиотека для выполнения HTTP-запросов и работы с API: библиотека Requests. Requests не является частью стандартной библиотеки Python, поэтому вам нужно установить ее, чтобы начать.

-2

Библиотека requests позволяет отправлять HTTP-запросы. HTTP-запрос возвращает объект ответа со всеми данными ответа (содержанием, кодом состояния, заголовками и т. д.). Две наиболее важные части данных ответа - это код состояния и тело ответа. Это универсальная библиотека, которую можно использовать даже для парсинга.

Код состояния указывает на успешность или неудачу запроса. Тело ответа содержит данные, возвращенные API. Данные могут быть представлены в виде словаря, строки или любого другого объекта.

python
pip install requests

После завершения установки импортируйте ее с помощью следующего кода:

python
import requests

Все готово, пришло время делать некоторые API-запросы с использованием Python. Мы будем использовать API REQRES.

Использование GET-запроса

Один из общих методов HTTP - GET. Метод GET позволяет извлекать данные из указанного ресурса.

Чтобы выполнить GET-запрос, вызовите метод requests.get().

python
import requests
response = requests.get('https://reqres.in/api/users')
print(response)

Код выводит следующее:

bash
<Response [200]>

Код генерирует код состояния 200, что означает, что URL доступен. Пришло время извлечь некоторые данные из URL.

python
import requests
import json

response = requests.get('https://reqres.in/api/users')
print(response.json())

Код выводит следующее:

JSON

{'id': 1, 'email': 'george.bluth@reqres.in', 'first_name': 'George', 'last_name': 'Bluth', 'avatar': 'https://reqres.in/img/faces/1-image.jpg'},

{'id': 2, 'email': 'janet.weaver@reqres.in', 'first_name': 'Janet', 'last_name': 'Weaver', 'avatar': 'https://reqres.in/img/faces/2-image.jpg'},

GET-запрос выполняется к конечной точке API /users, и будет возвращен список всех пользователей. Затем вызывается функция .json(), чтобы получить вывод в формате JSON (JavaScript Object Notation), как показано выше. Вывод JSON выглядит как словарь Python, который легко читать.

Чтобы прочитать данные одного пользователя, можно сделать вызов API с id =1.

python
import requests
import json

response = requests.get('https://reqres.in/api/users/1')
print(response.json())

Вот вывод кода:

JSON
{'data': {'id': 1, 'email': 'george.bluth@reqres.in', 'first_name': 'George', 'last_name': 'Bluth', 'avatar': 'https://reqres.in/img/faces/1-image.jpg'}, 'support': {'url': 'https://reqres.in/#support-heading', 'text': 'To keep ReqRes free, contributions towards server costs are appreciated!'}}

Если вы попытаетесь выполнить вызов API с id, которого не существует, вы получите ответ 404, что означает, что пользователь с этим конкретным id не найден. Например, запустите следующий код, и вы получите ответ 404.

python
import requests

response = requests.get('https://reqres.in/api/users/22')
print(response)

Использование POST-запроса

POST-запрос добавит новые данные в API. Сначала создайте данные API в формате JSON, а затем добавьте их, используя метод POST.

python
import requests
new_user = {
"name": "morpheus",
"job": "leader"
}
response = requests.post("https://reqres.in/api/users", json=new_user)

print(response)
print(response.json())

Вот вывод кода:

bash
<Response [201]>
{'name': 'morpheus', 'job': 'leader', 'id': '781', 'createdAt': '2023-08-05T16:23:14.034Z'}

Новый пользователь создан, возвращаются данные API, показанные выше.

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

python
import requests

new_user = {
"email": "eve.holt@reqres.in",
"password": "pistol"
}
response = requests.post("https://reqres.in/api/register", json=new_user)

print(response)
print(response.json()

Вот вывод кода:

bash
<Response [200]>
{'id': 4, 'token': 'QpwL5tke4Pnpja7X4'}

Новый пользователь зарегистрирован, и id нового пользователя - 4.

Если вы попытаетесь зарегистрироваться, указав только адрес электронной почты, то вы получите ответ 400, что означает неверный запрос.

python
import requests

new_user = {
"email": "eve.holt@reqres.in"
}
response = requests.post("https://reqres.in/api/register", json=new_user)

print(response)
print(response.json())

Вот вывод кода:

bash
<Response [400]>
{'error': 'Missing password'}

Использование PUT-запроса

PUT-запрос используется для обновления существующих данных, что означает, что старые данные заменяются новыми данными. Ниже приведен пример обновления нового пользователя с id = 2.

python
import requests

update_user = {
"name": "morpheus",
"job": "zion resident"
}
response = requests.put("https://reqres.in/api/users/2", json=update_user)

print(response)
print(response.json())

Вот вывод кода:

bash
<Response [200]>
{'name': 'morpheus', 'job': 'zion resident', 'updatedAt': '2023-08-05T17:03:18.934Z'}

Информация обновлена, как показано выше, и вы также можете увидеть время и дату обновления.

Использование PATCH-запроса

Для частичных обновлений вы можете сделать PATCH-запрос к API.

python
import requests

update_user = {
"name": "morpheus",
"job": "zion resident"
}
response = requests.patch("https://reqres.in/api/users/2", json=update_user)

print(response)
print(response.json())

Вот вывод кода:

bash
<Response [200]>
{'name': 'morpheus', 'job': 'zion resident', 'updatedAt': '2023-08-06T05:24:22.972Z'}

Использование DELETE-запроса

Чтобы удалить ресурсы из API, используйте DELETE-запрос.

python
import requests
response = requests.delete("https://reqres.in/api/users/2")
print(response)

Вот вывод кода:

bash
<Response [204]>

Пользователь удален, поэтому сервер возвращает код 204. Это означает, что запрос был успешным, но нет контента для возврата.

Параметры запроса

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

Например, когда вы выполняете поиск в Google, URL выглядит примерно так: https://www.google.com/search?q=apify. q=apify - это параметр запроса. Чтобы добавить параметр запроса к URL, вы должны использовать вопросительный знак (?). Для нескольких параметров запроса их можно разделять амперсандом (&).

Добавим некоторые параметры запроса к вызову API Python. Здесь мы добавляем два параметра запроса, которые показывают, что вы хотите получить всех пользователей со второй страницы с задержкой в 3 секунды. Конечный запрос будет выглядеть так: https://reqres.in/api/users?page=2&delay=3.

python
import requests

query_para={
'page': 2,
'delay': 3
}

response = requests.get('https://reqres.in/api/users', params=query_para)
print(response.json())

Вот вывод кода:

JSON
{'page': 2, 'per_page': 6, 'total': 12, 'total_pages': 2, 'data': [

{'id': 7, 'email': 'michael.lawson@reqres.in', 'first_name': 'Michael', 'last_name': 'Lawson', 'avatar': 'https://reqres.in/img/faces/7-image.jpg'},

{'id': 8, 'email': 'lindsay.ferguson@reqres.in', 'first_name': 'Lindsay', 'last_name': 'Ferguson', 'avatar': 'https://reqres.in/img/faces/8-image.jpg'},

{'id': 9, 'email': 'tobias.funke@reqres.in', 'first_name': 'Tobias', 'last_name': 'Funke', 'avatar': 'https://reqres.in/img/faces/9-image.jpg'},

{'id': 10, 'email': 'byron.fields@reqres.in', 'first_name': 'Byron', 'last_name': 'Fields', 'avatar': 'https://reqres.in/img/faces/10-image.jpg'},

{'id': 11, 'email': 'george.edwards@reqres.in', 'first_name': 'George', 'last_name': 'Edwards', 'avatar': 'https://reqres.in/img/faces/11-image.jpg'},

{'id': 12, 'email': 'rachel.howell@reqres.in', 'first_name': 'Rachel', 'last_name': 'Howell', 'avatar': 'https://reqres.in/img/faces/12-image.jpg'}],

'support': {'url': 'https://reqres.in/#support-heading', 'text': 'To keep ReqRes free, contributions towards server costs are appreciated!'}}

Все пользователи на второй странице будут показаны после задержки в 3 секунды.

Устранение неполадок в Python и API

Устранение неполадок имеет важное значение при работе с API. Многое может пойти не так (например, сервер API может быть недоступен, или вы можете отправить неверные параметры). Вот несколько важных советов, которые могут помочь вам устранять ошибки:

1. Определите проблему: определите, связана ли проблема с вашим кодом или внешним фактором. Например, если вы используете API Google Maps и не заполнили информацию о биллинге, то при выполнении запроса с использованием вашего ключа API вы получите ошибку.

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

3. Проверьте ввод: дважды проверьте ваш ввод, такой как URL конечной точки API, учетные данные, заголовки, параметры запроса и так далее.

4. Обработка исключений: вы можете использовать обработку исключений (блоки try/except) для перехвата исключений.

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

Подробный гайд о том, как обойти блокировки при парсинге здесь.

Чтобы лучше понять данные пункты, углубимся в детали. Сейчас мы будем использовать API GitHub для получения репозиториев с помощью GET-запроса.

В данном коде мы используем метод requests.get() для чтения всех репозиториев с заданным именем пользователя. Затем мы проверяем статус ответа с использованием метода raise_for_status(). Этот метод вызывает исключение для статусных кодов, отличных от 200, и затем это исключение обрабатывается в блоке except для HTTPError.

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

python
import requests

def get_repos(username):
base_url = "https://api.github.com"
url = f"{base_url}/users/{username}/repos"

try:
response = requests.get(url)
response.raise_for_status()
repositories_data = response.json()
return repositories_data

except requests.exceptions.HTTPError as e:
print("HTTP Error:", e.response.status_code, e.response.json()["message"])
return None

except requests.exceptions.RequestException as e:
print("Network Error:", e)
return None
except Exception as e:
print("Unknown error: ", e)
return None

username = "apify"
repos = get_repos(username)

if repos:
print(f"Repositories of {username}:")
for repo in repos:
print(repo["name"])
else:
print(f"Failed to retrieve repositories.")

Если вы измените имя репозитория на "apifyy", произойдет ошибка 404. Если потеряется сетевое соединение, произойдет сетевая ошибка, и вы не сможете получить репозитории.

Продвинутые советы

Если вы дочитали до этого момента, у вас должно быть крепкое понимание Python и API.

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

Аутентификация

Многие API требуют какую-то форму аутентификации для доступа к своим ресурсам. Некоторые API используют базовую аутентификацию, в то время как другие требуют более сложные техники, такие как OAuth.

Перед отправкой запроса вам нужно получить токен доступа у поставщика API. Это уникальный идентификатор, предоставляющий вам доступ к конкретным ресурсам или действиям.

python
headers = {
"Authorization": f"token {ВАШ ТОКЕН ДОСТУПА}
}

Пагинация

Пагинация - это процесс разделения большого объема данных на несколько меньших страниц. Это делается для предотвращения перегрузки сервера API слишком большим объемом данных. Например, если вы перейдете к репозиториям Apify, вы увидите что-то вроде этого внизу:

-3

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

Ограничение по количеству запросов (Rate limiting)

Любой может использовать общедоступные API, и иногда люди пытаются злоупотреблять ими, делая лишние запросы или используя ботов. Чтобы предотвратить подобные атаки, используется техника ограничения по количеству запросов (Rate limiting), которая ограничивает вас в определенном количестве запросов за единицу времени. Убедитесь, что вы не превышаете лимит, так как ваши запросы будут заблокированы на некоторое время.

Например, если вы используете API GitHub и делаете лишние запросы, вы будете заблокированы после 60 запросов и получите статусный код 403.

-4

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

Мы познакомили вас с основами использования библиотеки Python Requests для отправки запросов API, а также с некоторыми продвинутыми концепциями API и советами по устранению неполадок. Теперь вы должны быть знакомы с наиболее распространенными методами HTTP и статусными кодами, а также с тем, как они используются для извлечения или редактирования данных через API. Начиная с понимания статусных кодов, заканчивая манипулированием данными и даже управлением параметрами запроса с помощью параметров запроса, мы заложили основу для более продвинутого использования API.

Ещё больше полезной информации, готовых решений и ценных советов — в нашем блоге.

Статья переведена с сайта Apify

Наука
7 млн интересуются