Узнайте, как взаимодействовать с 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, поэтому вам нужно установить ее, чтобы начать.
Библиотека 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, вы увидите что-то вроде этого внизу:
Пагинация обычно обрабатывается с использованием параметров запроса: page и size. Параметр page определяет, какую страницу вы запрашиваете, а параметр size определяет размер каждой страницы, например, сколько репозиториев вы хотите видеть на одной странице.
Ограничение по количеству запросов (Rate limiting)
Любой может использовать общедоступные API, и иногда люди пытаются злоупотреблять ими, делая лишние запросы или используя ботов. Чтобы предотвратить подобные атаки, используется техника ограничения по количеству запросов (Rate limiting), которая ограничивает вас в определенном количестве запросов за единицу времени. Убедитесь, что вы не превышаете лимит, так как ваши запросы будут заблокированы на некоторое время.
Например, если вы используете API GitHub и делаете лишние запросы, вы будете заблокированы после 60 запросов и получите статусный код 403.
Использование API и Python
Мы познакомили вас с основами использования библиотеки Python Requests для отправки запросов API, а также с некоторыми продвинутыми концепциями API и советами по устранению неполадок. Теперь вы должны быть знакомы с наиболее распространенными методами HTTP и статусными кодами, а также с тем, как они используются для извлечения или редактирования данных через API. Начиная с понимания статусных кодов, заканчивая манипулированием данными и даже управлением параметрами запроса с помощью параметров запроса, мы заложили основу для более продвинутого использования API.
Ещё больше полезной информации, готовых решений и ценных советов — в нашем блоге.
Статья переведена с сайта Apify