Библиотека Requests — это элегантный и простой инструмент для работы с HTTP-запросами в Python, ставший де-факто стандартом для миллионов разработчиков. Она превращает сложные сетевые операции в интуитивно понятные команды, позволяя взаимодействовать с веб-API, скачивать файлы и автоматизировать рутинные задачи в интернете буквально в несколько строк кода. В этой статье мы разберем библиотеку от основ до продвинутых техник с подробными практическими примерами.
Установка и первый запрос
Установить библиотеку можно через pip одной командой: pip install requests. После этого вы готовы к работе.
Ваш первый GET-запрос
Самый простой пример — получение содержимого веб-страницы:
import requests
response = requests.get('https://api.github.com')
print(response.status_code) # 200
print(response.json()) # Выведет JSON-ответ от GitHub API
Объект Response содержит всю информацию об ответе: статус, заголовки, кодировку и само тело ответа. Всегда проверяйте response.status_code перед обработкой данных.
Работа с параметрами и заголовками
Большинство API требуют передачи параметров или специальных заголовков.
Передача параметров в URL
params = {'q': 'python requests', 'page': 2}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url) # URL с автоматически добавленными параметрами
Установка пользовательских заголовков
headers = {'User-Agent': 'MyApp/1.0', 'Authorization': 'Bearer YOUR_TOKEN'}
response = requests.get('https://api.example.com/data', headers=headers)
Отправка данных: POST, PUT, DELETE
Requests упрощает отправку данных на сервер в различных форматах.
Отправка JSON данных
data = {'title': 'New Post', 'body': 'Content here', 'userId': 1}
response = requests.post('https://jsonplaceholder.typicode.com/posts', json=data)
print(response.json()) # Сервер вернет созданный объект с ID
Отправка форм и файлов
# Форма
form_data = {'username': 'admin', 'password': 'secret'}
response = requests.post('https://httpbin.org/post', data=form_data)
# Файл
files = {'file': open('report.pdf', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
При отправке JSON используйте параметр json=, а не data=. Библиотека автоматически сериализует словарь и установит правильный заголовок Content-Type: application/json.
Обработка ошибок и таймауты
Надежный код должен корректно обрабатывать сетевые проблемы.
try:
response = requests.get('https://example.com', timeout=5)
response.raise_for_status() # Вызовет исключение при статусе 4xx/5xx
data = response.json()
except requests.exceptions.Timeout:
print("Сервер не отвечает.")
except requests.exceptions.HTTPError as err:
print(f"HTTP ошибка: {err}")
except requests.exceptions.RequestException as err:
print(f"Ошибка запроса: {err}")
Продвинутые техники
Использование сессий
Сессии сохраняют куки и параметры между запросами, что полезно для авторизации.
with requests.Session() as session:
session.headers.update({'User-Agent': 'MyBot'})
session.get('https://example.com/login', auth=('user', 'pass'))
# Все последующие запросы в сессии будут использовать те же куки
response = session.get('https://example.com/dashboard')
Потоковая загрузка больших файлов
response = requests.get('https://example.com/large_video.mp4', stream=True)
with open('video.mp4', 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
FAQ: Часто задаваемые вопросы
Чем Requests лучше urllib из стандартной библиотеки?
Requests предлагает более человекочитаемый API, автоматическую обработку кодировок, JSON, сессии и упрощенную обработку ошибок. Код становится чище и понятнее.
Как обрабатывать SSL-сертификаты?
По умолчанию Requests проверяет SSL-сертификаты. Для отключения проверки (небезопасно!) используйте verify=False. Для использования собственного сертификата укажите путь в параметре verify.
Как ограничить время выполнения запроса?
Используйте параметр timeout в секундах: requests.get(url, timeout=10). Учитывайте, что это общее время на соединение и чтение ответа.
Как работает keep-alive в Requests?
При использовании сессии (requests.Session()) соединения переиспользуются автоматически, что ускоряет выполнение нескольких запросов к одному хосту.
Можно ли использовать асинхронные запросы?
Библиотека Requests синхронная. Для асинхронности рассмотрите aiohttp или httpx. Однако для большинства скриптов и автоматизации Requests более чем достаточно.