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

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

Библиотека Requests — это элегантный и простой инструмент для отправки HTTP-запросов в Python, ставший де-факто стандартом для взаимодействия с веб-ресурсами. Она скрывает сложности низкоуровневых библиотек, позволяя разработчикам сосредоточиться на логике приложения, а не на тонкостях протокола. В этой статье мы разберем её от основ до продвинутых техник с практическими примерами.

Установка и первый запрос

Установить библиотеку можно через pip одной командой: pip install requests. После этого вы готовы к работе.

Самый простой пример — GET-запрос для получения данных:

import requests

response = requests.get('https://api.github.com')
print(response.status_code)  # 200
print(response.json())       # Ответ в формате JSON

Requests автоматически декодирует ответ сервера. Используйте response.text для текста (например, HTML) и response.json() для JSON. Метод .json() вызовет ошибку, если ответ не в JSON-формате.

Основные типы запросов и параметры

Библиотека поддерживает все основные HTTP-методы: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS.

GET с параметрами

Часто нужно передать параметры в URL (например, для поиска). Делается это через словарь params:

payload = {'q': 'python requests', 'page': 2}
r = requests.get('https://httpbin.org/get', params=payload)
print(r.url)  # https://httpbin.org/get?q=python+requests&page=2

POST: Отправка данных

Для отправки данных на сервер (например, формы или JSON) используйте POST:

# Отправка формы (application/x-www-form-urlencoded)
data = {'username': 'user', 'password': 'test'}
r = requests.post('https://httpbin.org/post', data=data)

# Отправка JSON (application/json)
json_data = {'title': 'New Post', 'body': 'Content'}
r = requests.post('https://httpbin.org/post', json=json_data)

При использовании параметра json библиотека автоматически сериализует словарь в JSON и устанавливает правильный заголовок Content-Type: application/json. Не делайте это вручную!

Работа с заголовками, куками и сессиями

Заголовки (Headers)

Заголовки передаются через словарь headers:

headers = {'User-Agent': 'MyApp/1.0', 'Authorization': 'Bearer YOUR_TOKEN'}
r = requests.get('https://api.example.com/data', headers=headers)

Куки (Cookies)

Получить куки из ответа просто: r.cookies['cookie_name']. Для отправки кук с запросом используйте параметр cookies.

Сессии

Объект Session сохраняет параметры (куки, заголовки) между запросами, что полезно для авторизации:

with requests.Session() as session:
    session.headers.update({'User-Agent': 'MyBot'})
    session.post('https://example.com/login', data={'user': '...'})  # Куки сохраняются
    r = session.get('https://example.com/dashboard')  # Запрос с куками сессии

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

Всегда обрабатывайте возможные ошибки сети и сервера:

try:
    r = requests.get('https://example.com', timeout=5)  # Таймаут 5 секунд
    r.raise_for_status()  # Вызовет исключение для кодов 4xx/5xx
    data = r.json()
except requests.exceptions.Timeout:
    print(\"Сервер не отвечает.\")
except requests.exceptions.HTTPError as err:
    print(f\"HTTP ошибка: {err}\")
except requests.exceptions.RequestException as err:
    print(f\"Ошибка запроса: {err}\")

Продвинутые примеры

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

# Отправка файла
files = {'file': open('report.pdf', 'rb')}
r = requests.post('https://httpbin.org/post', files=files)

# Стриминг больших файлов (чтобы не загружать всё в память)
with requests.get('https://example.com/large_video.mp4', stream=True) as r:
    with open('video.mp4', 'wb') as f:
        for chunk in r.iter_content(chunk_size=8192):
            f.write(chunk)

Прокси и SSL-сертификаты

# Использование прокси
proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'http://10.10.1.10:1080',
}
r = requests.get('http://example.org', proxies=proxies)

# Отключение проверки SSL (НЕ ДЕЛАЙТЕ В ПРОДЕ!)
r = requests.get('https://example.com', verify=False)

Отключать проверку SSL-сертификатов (verify=False) можно только для тестирования внутренних ресурсов. В продакшене это создает уязвимость для атак \"человек посередине\".

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

Чем Requests лучше urllib?

Requests предлагает человеко-читаемый API, автоматическую обработку кодировок, JSON, сессии, и требует меньше кода для типовых задач.

Как обрабатывать аутентификацию?

Requests поддерживает базовую аутентификацию через параметр auth:

requests.get('https://api.example.com', auth=('user', 'pass'))

Для OAuth и токенов используйте заголовок Authorization.

Как ускорить множество запросов?

Используйте requests.Session() для повторного использования соединения (HTTP Keep-Alive). Для настоящей асинхронности рассмотрите aiohttp или httpx.

Можно ли использовать Requests для парсинга сайтов?

Да, для получения HTML-страниц — идеально. Но для самого парсинга (извлечения данных из HTML) потребуется дополнительная библиотека, например BeautifulSoup4 или lxml.

Как обрабатывать ответ в формате XML?

Requests не имеет встроенного XML-парсера. Получите текст ответа r.text и обработайте его с помощью xml.etree.ElementTree или lxml.