В мире Python-разработки существует библиотека, которая стала настоящим стандартом де-факто для работы с HTTP-запросами. Библиотека Requests — это элегантный и простой инструмент, который превращает сложные сетевые операции в интуитивно понятные команды. Если вы когда-либо пытались взаимодействовать с веб-API, парсить сайты или автоматизировать веб-задачи, эта библиотека станет вашим лучшим другом.
Почему Requests, а не urllib?
Стандартная библиотека Python предлагает urllib для HTTP-запросов, но её синтаксис громоздкий и неудобный. Requests решает эту проблему, предоставляя человекочитаемый API. Установить её можно одной командой: pip install requests.
Requests не входит в стандартную библиотеку Python, но настолько популярна, что её часто называют "стандартом для людей". Она обрабатывает кодировки, cookies, сессии и SSL-сертификаты автоматически.
Базовые примеры: с чего начать
Простой GET-запрос
Самый частый сценарий — получение данных с веб-страницы или API:
import requests
response = requests.get('https://api.github.com')
print(response.status_code) # 200
print(response.json()) # Парсим JSON-ответ
print(response.text) # Сырой текст ответа
Работа с параметрами
Часто нужно передавать параметры в URL. Requests делает это чисто:
params = {'q': 'python requests', 'page': 2}
response = requests.get('https://google.com/search', params=params)
# Фактический URL: https://google.com/search?q=python+requests&page=2
POST-запросы: отправка данных
Для отправки данных на сервер (формы, JSON, файлы):
# Отправка формы
payload = {'username': 'user', 'password': 'test'}
r = requests.post('https://httpbin.org/post', data=payload)
# Отправка JSON (часто для REST API)
json_data = {'title': 'New Post', 'body': 'Content'}
r = requests.post('https://jsonplaceholder.typicode.com/posts', json=json_data)
При использовании параметра json= библиотека автоматически устанавливает заголовок Content-Type: application/json и сериализует данные.
Продвинутые возможности
Работа с заголовками и cookies
headers = {'User-Agent': 'my-app/1.0'}
cookies = {'session_id': 'abc123'}
response = requests.get('https://httpbin.org/headers',
headers=headers,
cookies=cookies)
# Чтение cookies из ответа
print(response.cookies['session_cookie'])
Сессии для сохранения состояния
Когда нужно сохранить cookies и заголовки между запросами (как в браузере):
session = requests.Session()
session.get('https://example.com/login') # Получаем cookies
# Все последующие запросы используют те же cookies
response = session.get('https://example.com/dashboard')
Обработка ошибок и таймауты
try:
response = requests.get('https://example.com', timeout=3.5)
response.raise_for_status() # Вызывает исключение при ошибке HTTP
print('Успех!')
except requests.exceptions.Timeout:
print('Сервер не отвечает')
except requests.exceptions.HTTPError as err:
print(f'HTTP ошибка: {err}')
Практические примеры из реальной жизни
Пример 1: Парсинг курсов валют с ЦБ РФ
import requests
from datetime import datetime
try:
response = requests.get('https://www.cbr-xml-daily.ru/daily_json.js', timeout=5)
data = response.json()
usd_rate = data['Valute']['USD']['Value']
print(f'Курс USD на {datetime.now().date()}: {usd_rate} руб.')
except Exception as e:
print(f'Ошибка получения данных: {e}')
Пример 2: Работа с GitHub API
# Получение информации о репозитории
response = requests.get('https://api.github.com/repos/psf/requests')
repo_data = response.json()
print(f"Репозиторий: {repo_data['name']}")
print(f"Звёзд: {repo_data['stargazers_count']}")
print(f"Описание: {repo_data['description']}")
Пример 3: Загрузка файла с прогресс-баром
import requests
from tqdm import tqdm
url = 'https://example.com/large-file.zip'
response = requests.get(url, stream=True)
with open('large-file.zip', 'wb') as f:
total_size = int(response.headers.get('content-length', 0))
with tqdm(total=total_size, unit='B', unit_scale=True) as pbar:
for chunk in response.iter_content(chunk_size=1024):
f.write(chunk)
pbar.update(len(chunk))
print('Файл загружен!')
Лучшие практики и советы
- Всегда используйте
timeoutчтобы избежать зависания программы - Проверяйте статус ответа с помощью
response.raise_for_status() - Для долгих операций используйте
stream=Trueдля обработки по частям - Храните чувствительные данные (API-ключи) в переменных окружения
- Используйте сессии для работы с сайтами, требующими авторизации
Requests имеет встроенную поддержку прокси, базовой аутентификации, OAuth и многих других продвинутых функций HTTP. Официальная документация содержит исчерпывающие примеры для всех случаев.
FAQ: Часто задаваемые вопросы
Как установить библиотеку Requests?
Используйте pip: pip install requests или для конкретной версии: pip install requests==2.28.1
Чем Requests лучше urllib3?
Requests построена на urllib3, но предоставляет более высокоуровневый и удобный API. Она похожа на разницу между ручным управлением автомобилем и автоматической коробкой передач.
Как обрабатывать SSL-сертификаты?
Requests проверяет SSL-сертификаты по умолчанию. Для отключения проверки (не рекомендуется для продакшена) используйте verify=False.
Можно ли использовать асинхронные запросы?
Библиотека Requests синхронная. Для асинхронных операций рассмотрите aiohttp или httpx.
Как ограничить количество одновременных запросов?
Используйте библиотеку grequests (асинхронная версия) или реализуйте пул потоков/процессов самостоятельно.
Requests работает с Python 2?
Более старые версии поддерживали Python 2.7, но с 2020 года поддерживается только Python 3.6+.