# Python Requests: полное руководство по HTTP-запросам

## Метаданные

- **Спикер:** Corey Schafer
- **Канал:** Corey Schafer
- **Тема:** Практическое руководство по библиотеке Python Requests: HTTP-запросы, загрузка данных, работа с JSON и отправка POST-запросов.
- **Длительность:** 25:00
- **YouTube:** https://www.youtube.com/watch?v=tb8gHvYlCFs
- **Источник:** https://ekstraktznaniy.ru/workbook/231

## Ключевые тезисы

1. **Requests — самый скачиваемый пакет Python** — Библиотека requests является самым популярным Python-пакетом, и это неслучайно. Она предоставляет простой и интуитивный интерфейс для выполнения HTTP-запросов, заменяя громоздкий встроенный модуль urllib. Простота использования сделала её стандартом де-факто для работы с веб-запросами в Python.
2. **GET-запросы — основа взаимодействия с веб-страницами** — GET-запрос позволяет получить содержимое веб-страницы. Метод requests.get() возвращает объект Response, содержащий статус-код, заголовки и тело ответа. Это базовая операция для любого веб-скрапинга или работы с API.
3. **Коды состояния HTTP определяют результат запроса** — Каждый HTTP-ответ содержит числовой код состояния: 200 означает успех, 300 — перенаправление, 400 — ошибку клиента, 500 — ошибку сервера. Проверка response.status_code или использование response.ok позволяет корректно обрабатывать результаты запросов в коде.
4. **Работа с JSON через встроенный метод .json()** — Объект Response имеет метод .json(), который автоматически парсит JSON-ответ в словарь Python. Это избавляет от необходимости вручную использовать модуль json. Большинство современных API возвращают данные именно в формате JSON.
5. **Параметры запроса передаются через словарь params** — Вместо ручного формирования URL-строки с параметрами можно передать словарь в аргумент params метода get(). Requests автоматически кодирует параметры и добавляет их к URL. Это безопаснее и читабельнее, чем конкатенация строк.
6. **Загрузка файлов и изображений через response.content** — Атрибут response.content возвращает бинарное содержимое ответа, что позволяет скачивать изображения, PDF и другие файлы. Достаточно записать content в файл в бинарном режиме ('wb'). Это простой способ автоматизировать загрузку медиа-контента.
7. **POST-запросы для отправки данных на сервер** — Метод requests.post() позволяет отправлять данные на сервер через аргумент data (словарь с данными формы) или json (для JSON-тела). POST используется для авторизации, отправки форм и создания ресурсов через API. Это вторая по частоте операция после GET.
8. **Заголовки запроса настраивают поведение сервера** — Аргумент headers позволяет передать пользовательские HTTP-заголовки: User-Agent, Authorization, Content-Type и другие. Многие API требуют токен авторизации в заголовке. Заголовки также позволяют имитировать запросы браузера при скрапинге.
9. **Аутентификация через auth упрощает доступ к API** — Requests поддерживает Basic Authentication через аргумент auth=(username, password). Для OAuth и токенов используются заголовки Authorization. Это позволяет работать с защищёнными API без сторонних библиотек.
10. **Таймауты предотвращают зависание программы** — Аргумент timeout задаёт максимальное время ожидания ответа в секундах. Без таймаута запрос может ждать бесконечно, блокируя программу. Всегда рекомендуется устанавливать таймаут при работе с внешними сервисами.

## Практические задания

### Задание 1: Получение и анализ веб-страницы
**Цель:** Выполните GET-запрос к любому публичному сайту с помощью requests.get(). Выведите статус-код, заголовки ответа и первые 500 символов текста страницы. Проверьте response.ok и response.status_code. Попробуйте запросить несуществующую страницу и обработайте ошибку 404.

### Задание 2: Работа с публичным JSON API
**Цель:** Используйте API httpbin.org или jsonplaceholder.typicode.com для практики. Отправьте GET-запрос, получите JSON-ответ методом .json() и извлеките конкретные поля из словаря. Передайте параметры через аргумент params и убедитесь, что URL сформирован корректно.

### Задание 3: Загрузка изображения из интернета
**Цель:** Найдите URL любого изображения в интернете. Скачайте его с помощью requests.get() и сохраните на диск через response.content в бинарном режиме записи. Проверьте, что файл корректно открывается. Добавьте проверку статус-кода перед сохранением.

### Задание 4: Отправка POST-запроса с данными
**Цель:** Отправьте POST-запрос на httpbin.org/post с данными формы через аргумент data. Затем повторите запрос, передав данные как JSON через аргумент json. Сравните ответы сервера: обратите внимание на различия в полях form и json в ответе.

### Задание 5: Скрипт мониторинга доступности сайтов
**Цель:** Создайте скрипт, который принимает список URL и проверяет доступность каждого. Используйте таймаут 5 секунд, обрабатывайте исключения requests.exceptions.RequestException. Выводите статус каждого сайта: доступен (200), перенаправление (3xx), ошибка (4xx/5xx) или таймаут.

## Ключевые цитаты

> «Библиотека requests позволяет нам легко выполнять HTTP-запросы для получения информации с веб-сайтов (The requests library allows us to easily make HTTP requests to get information from websites)»
> — Corey Schafer

> «Я считаю, что это самый скачиваемый пакет Python, и на то есть веские причины (I believe it's the most downloaded Python package and there is good reason for that)»
> — Corey Schafer

## Полный текст экстракта

# Python Requests: полное руководство по HTTP-запросам

> Спикер: Corey Schafer | Длительность: 25:00

## Ключевые идеи

1. **Requests — самый скачиваемый пакет Python** — библиотека предоставляет простой интерфейс для HTTP-запросов и является стандартом де-факто для работы с вебом в Python.
2. **GET-запросы — основа взаимодействия с веб-страницами** — метод requests.get() возвращает объект Response с кодом состояния, заголовками и телом ответа.
3. **Коды состояния HTTP определяют результат запроса** — 200 означает успех, 4xx — ошибку клиента, 5xx — ошибку сервера; проверяйте response.ok.
4. **Работа с JSON через встроенный метод .json()** — автоматический парсинг JSON-ответа в словарь Python без ручной обработки.
5. **Параметры запроса передаются через словарь params** — безопасная и читаемая альтернатива ручному формированию URL.
6. **Загрузка файлов через response.content** — бинарное содержимое ответа позволяет скачивать изображения, PDF и другие файлы.
7. **POST-запросы для отправки данных** — аргументы data и json позволяют отправлять формы и JSON-данные на сервер.
8. **Заголовки настраивают поведение запроса** — User-Agent, Authorization и другие заголовки через аргумент headers.
9. **Аутентификация через auth** — встроенная поддержка Basic Auth и возможность передачи токенов в заголовках.
10. **Таймауты предотвращают зависание** — всегда задавайте timeout при работе с внешними сервисами.

## Транскрипт

### Введение в библиотеку Requests

Библиотека requests позволяет легко выполнять HTTP-запросы для получения информации с веб-сайтов. Это самый скачиваемый пакет Python, и на то есть веские причины — он делает работу с HTTP простой и интуитивной.

Requests предоставляет методы для всех основных HTTP-операций: GET для получения данных, POST для отправки, PUT для обновления и DELETE для удаления. Объект Response, возвращаемый каждым методом, содержит всю информацию об ответе сервера: статус-код, заголовки, тело ответа в текстовом и бинарном виде, а также метод .json() для автоматического парсинга JSON.

### Практическое применение

Основные сценарии использования: получение веб-страниц и парсинг данных, работа с REST API, загрузка файлов и изображений, отправка данных форм и JSON, аутентификация на сервисах.

## Практические задания

### Задание 1: Получение и анализ веб-страницы
Выполните GET-запрос к любому публичному сайту с помощью requests.get(). Выведите статус-код, заголовки ответа и первые 500 символов текста страницы. Проверьте response.ok и response.status_code. Попробуйте запросить несуществующую страницу и обработайте ошибку 404.

### Задание 2: Работа с публичным JSON API
Используйте API httpbin.org или jsonplaceholder.typicode.com для практики. Отправьте GET-запрос, получите JSON-ответ методом .json() и извлеките конкретные поля из словаря. Передайте параметры через аргумент params.

### Задание 3: Загрузка изображения из интернета
Найдите URL любого изображения. Скачайте его с помощью requests.get() и сохраните на диск через response.content в бинарном режиме записи. Добавьте проверку статус-кода перед сохранением.

### Задание 4: Отправка POST-запроса с данными
Отправьте POST-запрос на httpbin.org/post с данными формы через аргумент data, затем через json. Сравните ответы сервера.

### Задание 5: Скрипт мониторинга доступности сайтов
Создайте скрипт, который проверяет доступность списка URL с таймаутом 5 секунд и выводит статус каждого сайта.

## Лучшие цитаты

> «Библиотека requests позволяет нам легко выполнять HTTP-запросы для получения информации с веб-сайтов» — Corey Schafer

> «Я считаю, что это самый скачиваемый пакет Python, и на то есть веские причины» — Corey Schafer