Библиотека 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.