Requests в Python: Полное руководство с примерами для работы с HTTP

Requests в Python: Полное руководство с примерами для работы с HTTP

В мире Python, где взаимодействие с веб-сервисами стало повседневностью, библиотека `requests` — это не просто инструмент, а настоящий проводник в мир HTTP. Простая, элегантная и невероятно мощная, она превращает сложные сетевые операции в интуитивно понятные команды. Давайте погрузимся в её возможности и рассмотрим практические примеры, которые вы сможете использовать уже сегодня.

Что такое библиотека Requests и зачем она нужна?

Библиотека `requests` — это де-факто стандарт Python для отправки HTTP-запросов. Она абстрагирует сложности низкоуровневых модулей (как `urllib`) и предоставляет разработчику чистый, человекочитаемый API. Если вашей программе нужно получить данные с веб-сайта, отправить форму, работать с REST API или загружать файлы — `requests` станет вашим лучшим помощником.

Установить библиотеку можно одной командой: pip install requests. Убедитесь, что используете виртуальное окружение для своих проектов.

Основные примеры использования

1. Простой GET-запрос

Самый базовый сценарий — получение данных с сервера.

import requests

response = requests.get('https://api.github.com')
print(response.status_code)  # Код ответа (200, 404 и т.д.)
print(response.json())       # Если ответ в JSON
print(response.text)         # Текстовое содержимое

2. Передача параметров в URL

Часто нужно передавать дополнительные параметры в запросе.

params = {'q': 'python requests', 'page': 1}
response = requests.get('https://google.com/search', params=params)
# URL станет: https://google.com/search?q=python+requests&page=1

3. Отправка POST-запроса с данными

Для отправки данных на сервер (например, формы авторизации).

login_data = {'username': 'myuser', 'password': 'mypass'}
response = requests.post('https://httpbin.org/post', data=login_data)
print(response.json())

4. Работа с заголовками (Headers) и Cookies

Многие API требуют специальных заголовков или работы с сессиями.

headers = {'User-Agent': 'MyApp/1.0', 'Authorization': 'Bearer token123'}
cookies = {'session_id': 'abc123'}

response = requests.get('https://httpbin.org/headers', headers=headers, cookies=cookies)

# Для сохранения сессии используйте объект Session
session = requests.Session()
session.get('https://site.com/login', auth=('user', 'pass'))
# Все последующие запросы в этой сессии сохранят cookies

5. Загрузка файлов

Загрузить файл на сервер или скачать его локально — задача в пару строк.

# СКАЧИВАНИЕ файла
response = requests.get('https://example.com/image.jpg', stream=True)
with open('image.jpg', 'wb') as f:
    for chunk in response.iter_content(1024):
        f.write(chunk)

# ЗАГРУЗКА файла на сервер
files = {'file': open('report.pdf', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)

Всегда проверяйте код ответа response.status_code или используйте response.raise_for_status(), который вызовет исключение при ошибке HTTP (4xx или 5xx).

Обработка ошибок и таймауты

Надёжный код должен корректно обрабатывать сетевые проблемы.

try:
    response = requests.get('https://unreliable-site.com', timeout=5) # Таймаут 5 секунд
    response.raise_for_status()
except requests.exceptions.Timeout:
    print("Сервер не ответил вовремя.")
except requests.exceptions.HTTPError as err:
    print(f"HTTP ошибка: {err}")
except requests.exceptions.RequestException as err:
    print(f"Ошибка запроса: {err}")

Практический пример: Парсинг публичных данных

Совместим `requests` с `BeautifulSoup` для извлечения данных с веб-страницы.

import requests
from bs4 import BeautifulSoup

url = 'https://news.ycombinator.com/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# Найдём все заголовки новостей
for link in soup.select('.titleline > a'):
    print(link.text, link['href'])

FAQ: Часто задаваемые вопросы

Чем requests лучше urllib?

Requests предлагает более простой и понятный API, автоматическую декодировку JSON, удобную работу с сессиями и параметрами. Код становится чище и читаемее.

Как обрабатывать большие ответы от сервера?

Используйте параметр stream=True и метод response.iter_content(), чтобы обрабатывать данные по частям, не загружая всё в оперативную память.

Библиотека requests безопасна?

Да, но важно соблюдать базовые правила: не передавать чувствительные данные в URL (используйте POST), проверять SSL-сертификаты (они проверяются по умолчанию) и экранировать пользовательский ввод, который используется в запросах.

Как работать с API, требующими OAuth аутентификации?

Requests напрямую не реализует OAuth поток, но отлично работает с токенами. Используйте специализированные библиотеки (например, `requests-oauthlib`) для получения токена, а затем передавайте его в заголовках `Authorization` с помощью самого `requests`.

Можно ли использовать requests асинхронно?

Стандартная библиотека `requests` синхронная. Для асинхронных операций рассмотрите `aiohttp` или `httpx`, который предлагает API, совместимое с `requests`, но работающее асинхронно.