1. Основы сбора данных: работа с HTTP-запросами, REST API и форматами JSON
Основы сбора данных: работа с HTTP-запросами, REST API и форматами JSON
Добро пожаловать на курс «Сбор и обработка данных на Python». Мы начинаем наше путешествие в мир Data Engineering и Data Science с самого фундаментального навыка — умения получать данные из интернета.
Представьте, что интернет — это огромный океан информации. Чтобы использовать эту воду для питья (анализа) или полива полей (обучения моделей), нам нужно построить трубопровод. В этой статье мы разберем, из чего состоят эти «трубы»: протокол HTTP, архитектурный стиль REST API и формат данных JSON.
Как общаются компьютеры: Клиент-серверная архитектура
Прежде чем писать код, важно понять физику процесса. Весь современный веб построен на клиент-серверной архитектуре.
Когда вы открываете браузер и вводите адрес сайта, происходит следующее:
!Упрощенная схема обмена данными между клиентом и сервером.
Язык, на котором общаются клиент и сервер, называется HTTP (HyperText Transfer Protocol).
Анатомия HTTP-запроса
HTTP-запрос — это не просто «дай мне страницу». Это структурированное сообщение, которое состоит из нескольких ключевых частей:
* URL (Uniform Resource Locator): Адрес, куда мы стучимся. Например, https://api.github.com/users.
* Метод (Method): Глагол, указывающий, что мы хотим сделать.
* Заголовки (Headers): Служебная информация (какой у нас браузер, какой формат данных мы понимаем).
* Тело (Body): Данные, которые мы передаем на сервер (используется не всегда).
Основные методы HTTP
В сборе данных мы чаще всего используем два метода:
Существуют и другие методы (PUT, DELETE, PATCH), но на начальном этапе они встречаются реже.
Коды состояния (Status Codes)
Как понять, что ответил сервер? Для этого существуют трехзначные числа — коды состояния. Вы наверняка видели их раньше:
* 200 OK: Всё отлично, запрос выполнен успешно. * 404 Not Found: Ресурс не найден (ошибка в адресе). * 403 Forbidden: Доступ запрещен (нужна авторизация). * 500 Internal Server Error: Проблема на стороне сервера (вы не виноваты).
Практика: Библиотека requests в Python
Python — идеальный язык для работы с сетью благодаря библиотеке requests. Она не входит в стандартную библиотеку, но является стандартом де-факто в индустрии.
Установим её:
Теперь попробуем сделать наш первый запрос к сайту GitHub:
Объект response содержит всё, что вернул сервер: заголовки, статус и, самое главное, содержимое.
Что такое API и REST?
Если мы будем скачивать обычные HTML-страницы (как их видит человек), нам придется долго вычищать оттуда лишний мусор: теги верстки, стили, скрипты. Это называется парсинг HTML, и мы займемся этим в следующих статьях.
Но программисты придумали способ, как программам общаться друг с другом напрямую, без визуальной шелухи. Это называется API (Application Programming Interface).
> API — это интерфейс, который позволяет одной программе использовать функции другой программы.
Представьте ресторан: * Вы — это Клиент (программа). * Кухня — это Сервер (база данных и логика). * Меню — это документация API. * Официант — это API.
Вы не идете на кухню сами. Вы говорите официанту (API) строго по меню: «Хочу стейк». Официант уходит и возвращает вам готовое блюдо.
!Метафора работы API: Официант как посредник между клиентом и кухней.
REST (Representational State Transfer)
REST — это набор правил (архитектурный стиль) того, как должен выглядеть «правильный» API.
Основные принципы REST для нас как для сборщиков данных:
/users вернет список пользователей, а /users/1 — конкретного пользователя с ID 1.Формат JSON: Язык данных
Когда API возвращает нам данные, они чаще всего приходят в формате JSON (JavaScript Object Notation). Несмотря на название, он прекрасно работает с Python.
JSON выглядит почти как словарь (dictionary) в Python. Это текстовый формат, который легко читают и люди, и машины.
Пример JSON:
Обратите внимание на отличия от Python:
* true пишется с маленькой буквы (в Python True).
* null вместо None.
* Кавычки всегда двойные ".
Работа с JSON в Python
Библиотека requests умеет автоматически превращать ответ сервера из формата JSON в словарь Python. Для этого используется метод .json().
Рассмотрим пример работы с реальным тестовым API — JSONPlaceholder. Это сервис, который имитирует базу данных постов блога.
Результат выполнения:
Мы получили данные, и они уже готовы к анализу! Нам не пришлось искать текст внутри тегов <div> или <span>.
Заголовки и притворство браузером
Иногда серверы защищаются от скриптов. Если вы просто сделаете requests.get(), сервер увидит, что к нему стучится Python-скрипт (в заголовке User-Agent будет написано python-requests). Некоторые сайты блокируют такие запросы.
Чтобы обойти это, мы можем подменить заголовки, притворившись обычным браузером:
Теперь сервер думает, что мы — Google Chrome на Windows 10.
Заключение
Сегодня мы заложили фундамент для всего курса. Мы узнали:
В следующих статьях мы углубимся в более сложные темы: научимся парсить обычные HTML-страницы, когда API недоступен, и работать с автоматизацией браузера через Selenium.