Home » Как начать работу с библиотекой Requests в Python
Как начать работу с библиотекой Requests в Python

Как начать работу с библиотекой 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 — это must-have инструмент для любого сисадмина или DevOps-инженера, работающего с Python. Библиотека решает 95% задач, связанных с HTTP-запросами, и делает это элегантно и надёжно.

Когда использовать Requests:

  • Мониторинг сервисов и API
  • Автоматизация взаимодействия с внешними системами
  • Веб-скрапинг и парсинг данных
  • Интеграция с CI/CD pipeline
  • Создание простых HTTP-клиентов

Когда стоит рассмотреть альтернативы:

  • Если нужна асинхронность — используйте httpx или aiohttp
  • Для максимальной производительности — рассмотрите httpx
  • Если размер важен — встроенная urllib может быть оправдана

Для тестирования и разработки скриптов рекомендую арендовать VPS или выделенный сервер — это даст вам полный контроль над окружением и возможность тестировать ваши скрипты в боевых условиях.

Requests превращает рутинные задачи в удовольствие. Начните с простых примеров из этой статьи, и очень скоро вы будете автоматизировать всё подряд. Помните: хороший сисадмин — ленивый сисадмин, который автоматизирует всё, что можно автоматизировать.


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

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

Leave a reply

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