- Home »

Как начать работу с библиотекой Requests в Python
Если вы тот самый сисадмин, который автоматизирует всё и вся, то библиотека Requests — это ваш лучший друг в Python. Она превращает мучительное создание HTTP-запросов в элегантный и понятный код. Забудьте про urllib и его криво-косые конструкции — Requests делает работу с REST API, веб-скрапингом и автоматизацией серверных задач настолько простой, что даже джуниор не накосячит. В этой статье разберём, как быстро освоить этот инструмент и начать писать скрипты, которые будут мониторить ваши сервера, дёргать API и делать всё то, что экономит время и нервы.
Как работает библиотека Requests
Requests — это HTTP-библиотека для Python, которая скрывает всю сложность работы с протоколом за простым и интуитивным интерфейсом. Под капотом она использует urllib3, но предоставляет гораздо более человечный API.
Основные принципы работы:
- Автоматическое управление cookies и сессиями
- Встроенная поддержка JSON
- Простая работа с аутентификацией
- Автоматическое декодирование контента
- Поддержка SSL/TLS из коробки
Библиотека следует принципу “Batteries included” — всё работает сразу без дополнительных настроек, но при этом остаётся гибкой для сложных сценариев.
Быстрая установка и настройка
Установка тривиальна через pip:
pip install requests
Для виртуального окружения (что всегда рекомендуется):
python -m venv myenv
source myenv/bin/activate # Linux/Mac
myenv\Scripts\activate # Windows
pip install requests
Проверяем установку:
python -c "import requests; print(requests.__version__)"
Первый запрос за 30 секунд:
import requests
# Простейший GET-запрос
response = requests.get('https://httpbin.org/get')
print(response.status_code)
print(response.json())
Всё, вы уже используете Requests! Теперь углубимся в практические примеры.
Основные HTTP-методы и примеры
Вот базовый набор методов, которые покрывают 90% задач:
# GET-запрос
response = requests.get('https://api.github.com/users/torvalds')
# POST с данными
data = {'key': 'value'}
response = requests.post('https://httpbin.org/post', data=data)
# POST с JSON
json_data = {'name': 'server1', 'status': 'active'}
response = requests.post('https://httpbin.org/post', json=json_data)
# PUT для обновления
response = requests.put('https://httpbin.org/put', json={'update': 'data'})
# DELETE
response = requests.delete('https://httpbin.org/delete')
# Заголовки
headers = {'User-Agent': 'MyScript/1.0'}
response = requests.get('https://httpbin.org/get', headers=headers)
Практические кейсы для сисадминов
Мониторинг статуса сервисов
import requests
import time
def check_service_health(url, expected_status=200):
try:
response = requests.get(url, timeout=5)
if response.status_code == expected_status:
print(f"✅ {url} - OK ({response.status_code})")
return True
else:
print(f"❌ {url} - FAIL ({response.status_code})")
return False
except requests.exceptions.RequestException as e:
print(f"❌ {url} - ERROR: {e}")
return False
# Список сервисов для мониторинга
services = [
'https://example.com',
'https://api.myapp.com/health',
'https://arenda-server.cloud/vps'
]
for service in services:
check_service_health(service)
Работа с API и аутентификацией
# Basic Auth
response = requests.get('https://api.example.com/data',
auth=('username', 'password'))
# Bearer Token
headers = {'Authorization': 'Bearer your_token_here'}
response = requests.get('https://api.example.com/data', headers=headers)
# API Key в параметрах
params = {'api_key': 'your_api_key'}
response = requests.get('https://api.example.com/data', params=params)
Автоматизация с сессиями
import requests
# Создаём сессию для переиспользования соединений
session = requests.Session()
# Устанавливаем общие заголовки
session.headers.update({'User-Agent': 'ServerMonitor/1.0'})
# Логинимся один раз
login_data = {'username': 'admin', 'password': 'secret'}
session.post('https://panel.example.com/login', data=login_data)
# Теперь можем делать авторизованные запросы
server_info = session.get('https://panel.example.com/api/servers')
print(server_info.json())
Обработка ошибок и таймаутов
Правильная обработка ошибок критично важна для production-скриптов:
import requests
from requests.exceptions import RequestException, Timeout, ConnectionError
def safe_request(url, retries=3, timeout=5):
for attempt in range(retries):
try:
response = requests.get(url, timeout=timeout)
response.raise_for_status() # Вызывает исключение для HTTP ошибок
return response
except Timeout:
print(f"Timeout on attempt {attempt + 1}")
except ConnectionError:
print(f"Connection error on attempt {attempt + 1}")
except RequestException as e:
print(f"Request failed: {e}")
break
if attempt < retries - 1: time.sleep(2 ** attempt) # Exponential backoff return None # Использование response = safe_request('https://unreliable-api.com/data') if response: print(response.json()) else: print("Failed to get data after retries")
Сравнение с альтернативами
Библиотека | Простота использования | Производительность | Функциональность | Поддержка async |
---|---|---|---|---|
Requests | Отлично | Хорошо | Отлично | Нет |
urllib (встроенная) | Плохо | Хорошо | Хорошо | Нет |
httpx | Отлично | Отлично | Отлично | Да |
aiohttp | Средне | Отлично | Хорошо | Да |
Продвинутые возможности
Загрузка файлов
# Загрузка файла
files = {'file': open('server.log', 'rb')}
response = requests.post('https://api.example.com/upload', files=files)
# Загрузка с метаданными
files = {'file': ('server.log', open('server.log', 'rb'), 'text/plain')}
data = {'description': 'Server log file'}
response = requests.post('https://api.example.com/upload', files=files, data=data)
Работа с прокси
# HTTP прокси
proxies = {
'http': 'http://proxy.example.com:8080',
'https': 'https://proxy.example.com:8080'
}
response = requests.get('https://httpbin.org/ip', proxies=proxies)
# SOCKS прокси (требует requests[socks])
proxies = {'http': 'socks5://proxy.example.com:1080'}
response = requests.get('https://httpbin.org/ip', proxies=proxies)
Streaming для больших файлов
# Скачивание больших файлов
url = 'https://example.com/large-file.zip'
response = requests.get(url, stream=True)
with open('large-file.zip', 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
Интеграция с другими инструментами
Requests + JSON + Logging
import requests
import json
import logging
# Настройка логирования
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def api_call_with_logging(url, method='GET', **kwargs):
logger.info(f"Making {method} request to {url}")
try:
response = requests.request(method, url, **kwargs)
response.raise_for_status()
logger.info(f"Success: {response.status_code}")
return response.json() if response.headers.get('content-type', '').startswith('application/json') else response.text
except requests.exceptions.RequestException as e:
logger.error(f"Request failed: {e}")
return None
Использование с cron для мониторинга
#!/usr/bin/env python3
import requests
import sys
import smtplib
from email.mime.text import MIMEText
def send_alert(message):
"""Отправка уведомления при проблемах"""
# Настройте свои SMTP параметры
pass
def monitor_servers():
servers = [
'https://arenda-server.cloud/vps',
'https://arenda-server.cloud/dedicated'
]
failed_servers = []
for server in servers:
try:
response = requests.get(server, timeout=10)
if response.status_code != 200:
failed_servers.append(f"{server} - Status: {response.status_code}")
except requests.exceptions.RequestException as e:
failed_servers.append(f"{server} - Error: {str(e)}")
if failed_servers:
alert_message = "Server monitoring alert:\n" + "\n".join(failed_servers)
send_alert(alert_message)
sys.exit(1)
else:
print("All servers are healthy")
if __name__ == "__main__":
monitor_servers()
Интересные факты и нестандартные применения
- Requests используется внутри Docker: Многие Docker-инструменты используют Requests для взаимодействия с Docker API
- Поддержка международных доменов: Requests автоматически обрабатывает IDN (интернационализированные доменные имена)
- Автоматическое сжатие: Библиотека автоматически обрабатывает gzip и deflate сжатие
- Streaming JSON: Можно парсить JSON по частям для больших файлов
Необычный кейс: Requests как HTTP-клиент для тестирования
import requests
import time
def stress_test_endpoint(url, concurrent_requests=10, duration=60):
"""Простой стресс-тест для эндпоинта"""
import threading
results = {'success': 0, 'failed': 0}
start_time = time.time()
def worker():
while time.time() - start_time < duration:
try:
response = requests.get(url, timeout=5)
if response.status_code == 200:
results['success'] += 1
else:
results['failed'] += 1
except:
results['failed'] += 1
time.sleep(0.1)
threads = []
for i in range(concurrent_requests):
t = threading.Thread(target=worker)
t.start()
threads.append(t)
for t in threads:
t.join()
print(f"Results: {results['success']} successful, {results['failed']} failed")
# Тестируем наш VPS
stress_test_endpoint('https://arenda-server.cloud/vps', concurrent_requests=5, duration=30)
Автоматизация и скрипты для DevOps
Интеграция с CI/CD
import requests
import os
def deploy_notification(webhook_url, status, commit_hash):
"""Уведомление о деплое в Slack/Discord"""
payload = {
'text': f"Deployment {status}",
'attachments': [{
'color': 'good' if status == 'SUCCESS' else 'danger',
'fields': [
{'title': 'Commit', 'value': commit_hash, 'short': True},
{'title': 'Environment', 'value': os.getenv('ENV', 'unknown'), 'short': True}
]
}]
}
requests.post(webhook_url, json=payload)
# Использование в CI/CD pipeline
webhook = os.getenv('SLACK_WEBHOOK_URL')
commit = os.getenv('COMMIT_HASH', 'unknown')
deploy_notification(webhook, 'SUCCESS', commit)
Мониторинг SSL-сертификатов
import requests
from datetime import datetime
import ssl
import socket
def check_ssl_expiry(hostname, port=443):
"""Проверка срока действия SSL-сертификата"""
try:
context = ssl.create_default_context()
with socket.create_connection((hostname, port), timeout=10) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
cert = ssock.getpeercert()
# Парсим дату истечения
expiry_date = datetime.strptime(cert['notAfter'], '%b %d %H:%M:%S %Y %Z')
days_left = (expiry_date - datetime.now()).days
return {
'hostname': hostname,
'expiry_date': expiry_date,
'days_left': days_left,
'issuer': cert['issuer'][1][0][1]
}
except Exception as e:
return {'hostname': hostname, 'error': str(e)}
# Проверяем несколько доменов
domains = ['github.com', 'stackoverflow.com', 'python.org']
for domain in domains:
result = check_ssl_expiry(domain)
if 'error' not in result:
print(f"{domain}: {result['days_left']} days left")
else:
print(f"{domain}: Error - {result['error']}")
Производительность и оптимизация
Для высоконагруженных скриптов важно оптимизировать работу с Requests:
# Переиспользование соединений
session = requests.Session()
# Настройка пула соединений
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[429, 500, 502, 503, 504],
)
adapter = HTTPAdapter(
pool_connections=100,
pool_maxsize=100,
max_retries=retry_strategy
)
session.mount("http://", adapter)
session.mount("https://", adapter)
# Теперь все запросы будут использовать оптимизированные настройки
response = session.get('https://api.example.com/data')
Полезные ссылки и ресурсы
- Официальная документация Requests
- HTTPBin - сервис для тестирования HTTP-запросов
- Исходный код на GitHub
Заключение и рекомендации
Requests — это must-have инструмент для любого сисадмина или DevOps-инженера, работающего с Python. Библиотека решает 95% задач, связанных с HTTP-запросами, и делает это элегантно и надёжно.
Когда использовать Requests:
- Мониторинг сервисов и API
- Автоматизация взаимодействия с внешними системами
- Веб-скрапинг и парсинг данных
- Интеграция с CI/CD pipeline
- Создание простых HTTP-клиентов
Когда стоит рассмотреть альтернативы:
- Если нужна асинхронность — используйте httpx или aiohttp
- Для максимальной производительности — рассмотрите httpx
- Если размер важен — встроенная urllib может быть оправдана
Для тестирования и разработки скриптов рекомендую арендовать VPS или выделенный сервер — это даст вам полный контроль над окружением и возможность тестировать ваши скрипты в боевых условиях.
Requests превращает рутинные задачи в удовольствие. Начните с простых примеров из этой статьи, и очень скоро вы будете автоматизировать всё подряд. Помните: хороший сисадмин — ленивый сисадмин, который автоматизирует всё, что можно автоматизировать.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.