Отправка HTTP-запросов с библиотекой `requests`
На прошлом занятии вы узнали, что такое API и как программы «общаются» друг с другом. Теперь научимся отправлять запросы из Python. В этом поможет библиотека requests — одна из самых популярных.
Зачем нужна библиотека requests?
Когда вы открываете сайт, браузер отправляет HTTP-запросы на сервер. Сервер в ответ присылает данные (HTML, CSS, картинки), которые браузер отображает. requests делает то же самое, но программно, из вашего Python-кода. Это удобно для:
- Получения данных с сайтов или API (например, курсы валют, погода, новости).
- Отправки данных на серверы (например, регистрация, отправка форм).
- Автоматизации работы с веб-сервисами.
Важно:
requests— сторонняя библиотека. Она не входит в стандартную поставку Python. Её нужно установить отдельно.
Установка requests
Убедитесь, что у вас активировано виртуальное окружение, как мы изучали ранее. Затем выполните команду в терминале:
pip install requests
Успешно установили? Отлично, вы готовы к работе!
Основные типы HTTP-запросов
Вспомним методы HTTP-запросов и их назначение:
- GET: Получить данные. Самый частый запрос.
- POST: Отправить данные на сервер (например, заполнить форму, создать ресурс).
- PUT: Полностью обновить существующий ресурс.
- DELETE: Удалить ресурс.
- PATCH: Частично обновить существующий ресурс.
Библиотека requests предоставляет удобные функции для каждого метода.
Отправка GET-запросов
Начнём с простого — получения данных. Используем функцию requests.get().
import requests
# URL, к которому обращаемся
url = "https://jsonplaceholder.typicode.com/posts/1" # Это тестовый API для примеров
# Отправляем GET-запрос
response = requests.get(url)
# Проверяем статус ответа: 200 OK означает, что запрос успешен
print(f"Статус код: {response.status_code}")
# Получаем содержимое ответа как строку
print(f"Содержимое ответа (текст): {response.text}")
# Если ответ в формате JSON, используем .json()
# Это автоматически преобразует JSON-строку в Python-словарь или список
try:
data = response.json()
print(f"Содержимое ответа (JSON): {data}")
print(f"Тип данных: {type(data)}")
print(f"Заголовок поста: {data['title']}")
except requests.exceptions.JSONDecodeError:
print("Ответ не является JSON.")
Совет:
jsonplaceholder.typicode.com— отличный ресурс для тестирования HTTP-запросов. Он предоставляет фейковые API для разных операций.
Параметры запроса (Query Parameters)
Часто для фильтрации или уточнения запроса используют параметры. Они добавляются к URL после ? в формате ключ=значение&ключ2=значение2. requests позволяет передавать их словарем в параметре params.
import requests
url = "https://jsonplaceholder.typicode.com/posts"
# Параметры запроса: хотим получить посты пользователя с ID 1
params = {
"userId": 1
}
response = requests.get(url, params=params)
print(f"Статус код: {response.status_code}")
print(f"Количество постов для userId=1: {len(response.json())}")
Отправка POST-запросов
Для отправки данных на сервер используем requests.post(). Данные обычно передаются в теле запроса в формате JSON или как данные формы.
import requests
import json # Для работы с JSON-строками
url = "https://jsonplaceholder.typicode.com/posts"
# Данные, которые хотим отправить
new_post_data = {
"title": "Мой новый пост из Python",
"body": "Это тело моего первого поста, отправленного через requests.",
"userId": 1
}
# Отправляем POST-запрос
# data=... для данных формы (application/x-www-form-urlencoded)
# json=... для JSON-данных (application/json)
response = requests.post(url, json=new_post_data)
print(f"Статус код: {response.status_code}")
print(f"Ответ сервера: {response.json()}")
# Сервер присвоил новый ID созданному посту
print(f"ID нового поста: {response.json().get('id')}")
Заголовки запроса (Headers)
Заголовки HTTP-запроса содержат дополнительную информацию о запросе или клиенте (например, тип контента, авторизационные токены, информацию о браузере). Их можно передать словарем в параметре headers.
import requests
url = "https://jsonplaceholder.typicode.com/posts"
headers = {
"User-Agent": "My Python App/1.0", # Идентификация вашего приложения
"Accept": "application/json" # Указываем, что ожидаем JSON-ответ
}
response = requests.get(url, headers=headers)
print(f"Статус код: {response.status_code}")
print(f"Ответ сервера: {response.json()[0]['title']}") # Получаем заголовок первого поста
Обработка ошибок и исключений
При работе с сетью всегда есть риск ошибок: сервер недоступен, запрос неверный и т.д. requests может генерировать исключения при сетевых проблемах и позволяет проверять статус ответа.
import requests
try:
response = requests.get("https://несуществующий-сайт.com")
response.raise_for_status() # Вызывает исключение для статусов 4xx/5xx
except requests.exceptions.ConnectionError as e:
print(f"Ошибка подключения: {e}")
except requests.exceptions.HTTPError as e:
print(f"HTTP-ошибка: {e.response.status_code} - {e.response.reason}")
except requests.exceptions.RequestException as e:
print(f"Произошла другая ошибка requests: {e}")
else:
print("Запрос успешно выполнен!")
print(response.text[:100]) # Выводим первые 100 символов ответа
Замечание: Метод
response.raise_for_status()очень полезен. Он автоматически проверяет, был ли статус ответа 200 OK. Если нет (например, 404 Not Found или 500 Internal Server Error), он выбросит исключениеHTTPError, которое вы можете перехватить.
Практическое задание
Представьте, что вы хотите получить список всех пользователей с тестового API jsonplaceholder.typicode.com/users.
- Напишите Python-код, который отправляет GET-запрос по этому URL.
- Выведите статус-код ответа.
- Преобразуйте полученные данные в Python-объект (список словарей).
- Распечатайте имена всех пользователей из полученного списка.
Используйте requests.get(), response.status_code и response.json(). Затем пройдитесь по списку пользователей в цикле for.
import requests
url = "https://jsonplaceholder.typicode.com/users"
try:
response = requests.get(url)
response.raise_for_status() # Проверяем на HTTP-ошибки
print(f"Статус код: {response.status_code}")
users = response.json()
print(f"Получено {len(users)} пользователей.")
print("Имена пользователей:")
for user in users:
print(f"- {user['name']}")
except requests.exceptions.RequestException as e:
print(f"Произошла ошибка при запросе: {e}")
</details>
Теперь вы умеете отправлять HTTP-запросы из Python! Это открывает огромные возможности для взаимодействия с веб-сервисами и автоматизации задач. На следующем занятии мы углубимся в создание собственных REST API с использованием Django REST Framework. Вы научитесь не только потреблять, но и предоставлять данные другим приложениям.