Home » Как использовать библиотеку requests в Python для HTTP-запросов
Как использовать библиотеку requests в Python для HTTP-запросов

Как использовать библиотеку 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 сделает вашу жизнь проще, а серверы — более управляемыми.

Полезные ссылки:


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked