- Home »

Как использовать библиотеку requests в Python для HTTP-запросов
<
Если вы администрируете сервера, пишете скрипты для автоматизации или разрабатываете API, то работать с HTTP-запросами — это ваша повседневная реальность. Библиотека requests — это инструмент, который превращает муки работы с urllib в приятную прогулку. Она настолько популярна, что практически стала стандартом для HTTP-запросов в Python. И не зря — простота использования, мощный функционал и понятный API делают её идеальным выбором для серверных задач.
Эта статья поможет вам быстро освоить requests и начать использовать её в своих проектах. Мы разберём основы, покажем практические примеры и кейсы, которые пригодятся в повседневной работе с серверами. Плюс рассмотрим подводные камни и лучшие практики.
Как это работает?
Requests — это HTTP-библиотека для Python, которая скрывает всю сложность низкоуровневых операций за простым и интуитивным интерфейсом. Под капотом она использует urllib3, но предоставляет гораздо более удобный API.
Основные возможности:
- Поддержка всех HTTP-методов (GET, POST, PUT, DELETE и т.д.)
- Автоматическое декодирование ответов
- Поддержка cookies, сессий и аутентификации
- SSL/TLS поддержка
- Работа с прокси
- Таймауты и повторные попытки
- Загрузка файлов
Установка и быстрая настройка
Установка элементарная:
pip install requests
Для работы с дополнительными возможностями безопасности:
pip install requests[security]
Базовый пример использования:
import requests
# Простой GET-запрос
response = requests.get('https://httpbin.org/get')
print(response.status_code) # 200
print(response.text) # HTML/JSON ответ
# POST-запрос с данными
data = {'key': 'value', 'username': 'admin'}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json()) # Автоматический парсинг JSON
Практические примеры и кейсы
Мониторинг серверов
Классический сценарий — проверка доступности сервисов:
import requests
import time
def check_server_status(url, timeout=5):
try:
response = requests.get(url, timeout=timeout)
if response.status_code == 200:
return f"✅ {url} - OK ({response.elapsed.total_seconds():.2f}s)"
else:
return f"⚠️ {url} - Status: {response.status_code}"
except requests.exceptions.RequestException as e:
return f"❌ {url} - Error: {e}"
# Проверка нескольких серверов
servers = [
'https://google.com',
'https://github.com',
'https://stackoverflow.com'
]
for server in servers:
print(check_server_status(server))
Работа с API
Пример интеграции с REST API:
# Аутентификация через API ключ
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
# Получение данных
response = requests.get('https://api.example.com/users', headers=headers)
if response.status_code == 200:
users = response.json()
for user in users:
print(f"User: {user['name']}, Email: {user['email']}")
else:
print(f"API Error: {response.status_code} - {response.text}")
Отправка уведомлений в Slack/Telegram
# Отправка сообщения в Slack
slack_webhook = "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
message = {
"text": "Server monitoring alert: High CPU usage detected!",
"channel": "#alerts",
"username": "ServerBot"
}
response = requests.post(slack_webhook, json=message)
if response.status_code == 200:
print("✅ Alert sent to Slack")
else:
print(f"❌ Failed to send alert: {response.status_code}")
Сравнение с альтернативами
Библиотека | Простота использования | Производительность | Асинхронность | Размер |
---|---|---|---|---|
requests | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ❌ | ~500KB |
urllib (встроенная) | ⭐⭐ | ⭐⭐⭐⭐ | ❌ | 0KB |
aiohttp | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ✅ | ~1MB |
httpx | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ | ~800KB |
Продвинутые возможности
Работа с сессиями
Сессии позволяют сохранять cookies и настройки между запросами:
import requests
# Создание сессии
session = requests.Session()
# Настройка заголовков для всех запросов в сессии
session.headers.update({
'User-Agent': 'MyServerBot/1.0',
'Accept': 'application/json'
})
# Логин
login_data = {'username': 'admin', 'password': 'secret'}
session.post('https://example.com/login', data=login_data)
# Теперь все запросы будут использовать полученные cookies
response = session.get('https://example.com/dashboard')
print(response.text)
Обработка ошибок и retry
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
def create_session_with_retries():
session = requests.Session()
# Настройка retry стратегии
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[429, 500, 502, 503, 504]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)
return session
# Использование
session = create_session_with_retries()
response = session.get('https://unreliable-api.com/data', timeout=10)
Работа с прокси
Для серверов, которые работают через прокси:
proxies = {
'http': 'http://proxy.company.com:8080',
'https': 'https://proxy.company.com:8080'
}
# Использование прокси
response = requests.get('https://httpbin.org/ip', proxies=proxies)
print(response.json())
Интеграция с другими инструментами
Комбинация с cron для мониторинга
Создайте скрипт для мониторинга и добавьте его в cron:
#!/usr/bin/env python3
import requests
import json
import sys
from datetime import datetime
def monitor_services():
services = [
{'name': 'Web Server', 'url': 'https://yoursite.com'},
{'name': 'API', 'url': 'https://api.yoursite.com/health'},
{'name': 'Database API', 'url': 'https://db-api.yoursite.com/status'}
]
results = []
for service in services:
try:
response = requests.get(service['url'], timeout=10)
status = 'UP' if response.status_code == 200 else 'DOWN'
results.append({
'service': service['name'],
'status': status,
'response_time': response.elapsed.total_seconds(),
'timestamp': datetime.now().isoformat()
})
except Exception as e:
results.append({
'service': service['name'],
'status': 'ERROR',
'error': str(e),
'timestamp': datetime.now().isoformat()
})
return results
if __name__ == '__main__':
results = monitor_services()
for result in results:
print(json.dumps(result))
Интеграция с Docker
Проверка статуса Docker контейнеров через API:
import requests
import json
def check_docker_containers():
# Docker API обычно доступен через Unix socket
# Но можно настроить TCP доступ
docker_host = 'http://localhost:2375'
try:
response = requests.get(f'{docker_host}/containers/json')
containers = response.json()
for container in containers:
name = container['Names'][0].replace('/', '')
status = container['State']
print(f"Container {name}: {status}")
except requests.exceptions.RequestException as e:
print(f"Error connecting to Docker API: {e}")
check_docker_containers()
Интересные факты и нестандартные применения
- Requests скачивают 50+ миллионов раз в месяц с PyPI — это один из самых популярных пакетов Python
- Автор библиотеки Kenneth Reitz создал её из фрустрации работы с urllib — девиз проекта “HTTP for Humans”
- Используется в 90% проектов, работающих с HTTP в Python
- Поддерживает HTTP/2 через дополнительные адаптеры
Нестандартные способы использования:
# Использование как простой веб-скрапер
from bs4 import BeautifulSoup
response = requests.get('https://news.ycombinator.com')
soup = BeautifulSoup(response.text, 'html.parser')
titles = soup.find_all('a', class_='titlelink')
for title in titles[:5]:
print(title.text)
# Работа с GraphQL
graphql_query = {
'query': '''
{
user(login: "octocat") {
name
bio
}
}
'''
}
response = requests.post(
'https://api.github.com/graphql',
json=graphql_query,
headers={'Authorization': 'Bearer YOUR_TOKEN'}
)
print(response.json())
Автоматизация серверных задач
Requests открывает огромные возможности для автоматизации:
- Мониторинг инфраструктуры — проверка доступности сервисов, API, баз данных
- Автоматическое развертывание — интеграция с CI/CD системами
- Сбор метрик — отправка данных в системы мониторинга
- Управление облачными ресурсами — работа с AWS, Google Cloud, DigitalOcean API
- Автоматизация бэкапов — загрузка файлов в облачные хранилища
Для серьёзных проектов рекомендую использовать VPS или выделенный сервер с достаточными ресурсами для обработки множественных HTTP-запросов.
Рекомендации по производительности
# Переиспользование соединений
session = requests.Session()
# Установка таймаутов
response = requests.get('https://api.example.com', timeout=(3, 10)) # connect, read
# Отключение SSL проверки (только для разработки!)
requests.get('https://self-signed.example.com', verify=False)
# Streaming для больших файлов
response = requests.get('https://large-file.com/file.zip', stream=True)
with open('file.zip', 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
Заключение и рекомендации
Requests — это must-have инструмент для любого системного администратора и DevOps инженера. Библиотека идеально подходит для:
- Быстрого прототипирования — когда нужно быстро протестировать API или написать скрипт
- Серверного мониторинга — проверка доступности сервисов и сбор метрик
- Интеграции систем — связывание различных сервисов через API
- Автоматизации рутинных задач — от развертывания до резервного копирования
Используйте requests когда: нужна простота и скорость разработки, работаете с REST API, создаёте скрипты для автоматизации.
Рассмотрите альтернативы когда: требуется высокая производительность (aiohttp), нужна асинхронность (httpx), или размер библиотеки критичен (urllib).
Помните про обработку ошибок, используйте сессии для множественных запросов, и всегда устанавливайте таймауты. Requests сделает вашу жизнь проще, а серверы — более управляемыми.
Полезные ссылки:
- Официальная документация Requests
- HTTPBin — сервис для тестирования HTTP запросов
- Исходный код на GitHub
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.