Библиотека Requests в Python: Полное руководство с живыми примерами для начинающих и профи

Библиотека Requests в Python: Полное руководство с живыми примерами для начинающих и профи

В мире 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+.