В мире 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`, но работающее асинхронно.