Основы сбора данных: работа с HTTP-запросами, REST API и форматами JSON
Основы сбора данных: работа с HTTP-запросами, REST API и форматами JSON
Добро пожаловать на курс «Сбор и обработка данных на Python». Мы начинаем наше путешествие в мир Data Engineering и Data Science с самого фундаментального навыка — умения получать данные из интернета.
Представьте, что интернет — это огромный океан информации. Чтобы использовать эту воду для питья (анализа) или полива полей (обучения моделей), нам нужно построить трубопровод. В этой статье мы разберем, из чего состоят эти «трубы»: протокол HTTP, архитектурный стиль REST API и формат данных JSON.
Как общаются компьютеры: Клиент-серверная архитектура
Прежде чем писать код, важно понять физику процесса. Весь современный веб построен на клиент-серверной архитектуре.
Когда вы открываете браузер и вводите адрес сайта, происходит следующее:
- Клиент (ваш браузер или скрипт на Python) формирует сообщение — запрос (Request).
- Это сообщение летит через сеть к Серверу (мощному компьютеру, где хранятся данные).
- Сервер обрабатывает запрос и отправляет обратно ответ (Response).
Язык, на котором общаются клиент и сервер, называется HTTP (HyperText Transfer Protocol).
Анатомия HTTP-запроса
HTTP-запрос — это не просто «дай мне страницу». Это структурированное сообщение, которое состоит из нескольких ключевых частей:
- URL (Uniform Resource Locator): Адрес, куда мы стучимся. Например,
https://api.github.com/users. - Метод (Method): Глагол, указывающий, что мы хотим сделать.
- Заголовки (Headers): Служебная информация (какой у нас браузер, какой формат данных мы понимаем).
- Тело (Body): Данные, которые мы передаем на сервер (используется не всегда).
Основные методы HTTP
В сборе данных мы чаще всего используем два метода:
- GET — «Дай мне». Используется для получения данных. Когда вы открываете любую страницу в браузере, он делает GET-запрос. Тело запроса обычно пустое.
- POST — «Возьми это». Используется для отправки данных на сервер (например, ввод логина и пароля или загрузка файла).
Существуют и другие методы (PUT, DELETE, PATCH), но на начальном этапе они встречаются реже.
Коды состояния (Status Codes)
Как понять, что ответил сервер? Для этого существуют трехзначные числа — коды состояния. Вы наверняка видели их раньше:
- 200 OK: Всё отлично, запрос выполнен успешно.
- 404 Not Found: Ресурс не найден (ошибка в адресе).
- 403 Forbidden: Доступ запрещен (нужна авторизация).
- 500 Internal Server Error: Проблема на стороне сервера (вы не виноваты).
Практика: Библиотека requests в Python
Python — идеальный язык для работы с сетью благодаря библиотеке requests. Она не входит в стандартную библиотеку, но является стандартом де-факто в индустрии.
Установим её:
pip install requests
Теперь попробуем сделать наш первый запрос к сайту GitHub:
import requests
# Отправляем GET-запрос
response = requests.get('https://api.github.com')
# Проверяем статус-код
print(f"Статус-код: {response.status_code}")
# Если статус 200, значит всё хорошо
if response.status_code == 200:
print("Запрос прошел успешно!")
else:
print("Что-то пошло не так.")
Объект response содержит всё, что вернул сервер: заголовки, статус и, самое главное, содержимое.
Что такое API и REST?
Если мы будем скачивать обычные HTML-страницы (как их видит человек), нам придется долго вычищать оттуда лишний мусор: теги верстки, стили, скрипты. Это называется парсинг HTML, и мы займемся этим в следующих статьях.
Но программисты придумали способ, как программам общаться друг с другом напрямую, без визуальной шелухи. Это называется API (Application Programming Interface).
API — это интерфейс, который позволяет одной программе использовать функции другой программы.
Представьте ресторан:
- Вы — это Клиент (программа).
- Кухня — это Сервер (база данных и логика).
- Меню — это документация API.
- Официант — это API.
Вы не идете на кухню сами. Вы говорите официанту (API) строго по меню: «Хочу стейк». Официант уходит и возвращает вам готовое блюдо.
REST (Representational State Transfer)
REST — это набор правил (архитектурный стиль) того, как должен выглядеть «правильный» API.
Основные принципы REST для нас как для сборщиков данных:
- Клиент-сервер: Разделение ответственности.
- Stateless (Без состояния): Сервер не запоминает нас между запросами. Каждый запрос должен содержать всю необходимую информацию (например, ключ доступа).
- Единообразие интерфейса: Мы обращаемся к ресурсам по понятным адресам. Например,
/usersвернет список пользователей, а/users/1— конкретного пользователя с ID 1.
Формат JSON: Язык данных
Когда API возвращает нам данные, они чаще всего приходят в формате JSON (JavaScript Object Notation). Несмотря на название, он прекрасно работает с Python.
JSON выглядит почти как словарь (dictionary) в Python. Это текстовый формат, который легко читают и люди, и машины.
Пример JSON:
{
"name": "Иван",
"age": 25,
"is_student": true,
"skills": ["Python", "SQL", "Git"],
"address": {
"city": "Москва",
"zip": "101000"
}
}
Обратите внимание на отличия от Python:
trueпишется с маленькой буквы (в PythonTrue).nullвместоNone.- Кавычки всегда двойные
".
Работа с JSON в Python
Библиотека requests умеет автоматически превращать ответ сервера из формата JSON в словарь Python. Для этого используется метод .json().
Рассмотрим пример работы с реальным тестовым API — JSONPlaceholder. Это сервис, который имитирует базу данных постов блога.
import requests
# URL для получения списка постов
url = 'https://jsonplaceholder.typicode.com/posts/1'
response = requests.get(url)
if response.status_code == 200:
# Преобразуем ответ в словарь Python
data = response.json()
print("Тип данных:", type(data))
print("Заголовок поста:", data['title'])
print("Текст поста:", data['body'])
else:
print("Ошибка при получении данных")
Результат выполнения:
Тип данных: <class 'dict'>
Заголовок поста: sunt aut facere repellat provident occaecati excepturi optio reprehenderit
Текст поста: quia et suscipit...
Мы получили данные, и они уже готовы к анализу! Нам не пришлось искать текст внутри тегов <div> или <span>.
Заголовки и притворство браузером
Иногда серверы защищаются от скриптов. Если вы просто сделаете requests.get(), сервер увидит, что к нему стучится Python-скрипт (в заголовке User-Agent будет написано python-requests). Некоторые сайты блокируют такие запросы.
Чтобы обойти это, мы можем подменить заголовки, притворившись обычным браузером:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get('https://httpbin.org/user-agent', headers=headers)
print(response.text)
Теперь сервер думает, что мы — Google Chrome на Windows 10.
Заключение
Сегодня мы заложили фундамент для всего курса. Мы узнали:
- Как работает HTTP (запросы и ответы).
- Что такое REST API и почему это лучший друг аналитика данных.
- Как использовать библиотеку requests для отправки запросов.
- Как обрабатывать данные в формате JSON.
В следующих статьях мы углубимся в более сложные темы: научимся парсить обычные HTML-страницы, когда API недоступен, и работать с автоматизацией браузера через Selenium.