Python: автоматизация, анализ данных и веб-разработка

Практический курс для программистов, начинающих изучение Python. Вы освоите синтаксис языка, научитесь автоматизировать рутинные задачи, анализировать данные с помощью NumPy и Pandas, а также создавать веб-приложения.

1. Базовый синтаксис и структуры данных

Базовый синтаксис и структуры данных

Переход на новый язык программирования всегда начинается с понимания его философии. Для разработчика, уже знакомого с концепциями переменных, циклов и функций, Python предлагает уникальный подход, ориентированный на читаемость и скорость написания кода. Главная мантра языка заложена в так называемом «Дзене Пайтона» (The Zen of Python):

> Явное лучше, чем неявное. Простое лучше, чем сложное. Читаемость имеет значение. > > Тим Питерс, The Zen of Python

В этой парадигме мы разберем ключевые особенности синтаксиса и встроенные структуры данных, которые станут вашим основным инструментом для автоматизации, веб-разработки и анализа данных.

Анатомия синтаксиса: отступы и типизация

Первое, что бросается в глаза при чтении кода на Python — отсутствие фигурных скобок {} и точек с запятой в конце строк. Язык использует отступы (обычно 4 пробела) для определения блоков кода. Это принуждает разработчиков писать визуально структурированный код.

Вторая важнейшая особенность — строгая динамическая типизация. Тип переменной определяется в момент присваивания значения, а не на этапе компиляции. Однако «строгая» означает, что язык не будет неявно преобразовывать типы там, где это лишено смысла (например, складывать строку и число).

В Python переменные — это не ячейки памяти, а ссылки (ярлыки), указывающие на объекты. Когда вы пишете x = 10, создается объект числа 10, и на него вешается ярлык x. Это понимание критически важно при работе со сложными структурами данных.

Встроенные структуры данных

Для решения реальных задач — будь то парсинг веб-страниц, обработка JSON-ответов от API или подготовка датасета — вам редко хватит одиночных переменных. Python предлагает четыре мощные встроенные структуры данных.

!Сравнение базовых структур данных Python

Чтобы выбрать правильный инструмент для задачи, нужно понимать их ключевые характеристики. Сравним их в таблице:

| Структура | Синтаксис | Изменяемость | Упорядоченность | Уникальность элементов | | :--- | :--- | :--- | :--- | :--- | | Список (List) | [1, 2, 3] | Да | Да | Нет (допускаются дубликаты) | | Кортеж (Tuple) | (1, 2, 3) | Нет | Да | Нет | | Словарь (Dictionary) | {"a": 1} | Да | Да (с версии 3.7) | Ключи уникальны, значения — нет | | Множество (Set) | {1, 2, 3} | Да | Нет | Да (только уникальные) |

Списки (Lists): универсальный контейнер

Список — это упорядоченная изменяемая коллекция объектов. Списки идеально подходят для хранения однородных данных, например, собранных ссылок при парсинге сайта или колонки значений при анализе данных.

Одной из самых мощных функций списков являются срезы (slices). Они позволяют извлекать части списка с помощью синтаксиса [start:stop:step].

!Интерактивный срез списка

В анализе данных часто требуется оценить объем памяти, занимаемый списком. Базовая формула выглядит так: , где — общий объем памяти, — количество элементов в списке, а — размер одного элемента в байтах. Однако из-за того, что список в Python хранит ссылки на объекты, а не сами объекты, реальное потребление памяти всегда немного выше.

Кортежи (Tuples): защита от изменений

Кортеж похож на список, но он неизменяем (immutable). После создания кортежа вы не можете добавить, удалить или изменить его элементы.

Зачем нужна структура, которую нельзя менять?

  • Безопасность данных: Если вы передаете конфигурационные данные (например, координаты сервера или учетные данные для базы данных), кортеж гарантирует, что код случайно их не перезапишет.
  • Производительность: Кортежи занимают меньше памяти и создаются быстрее списков.
  • Ключи словарей: В отличие от списков, кортежи могут быть ключами в словарях.
  • Словари (Dictionaries): ключ к веб-разработке

    Словарь — это коллекция пар «ключ-значение». Если вы работали с JSON, то словари покажутся вам очень знакомыми. Поиск значения по ключу в словаре происходит практически мгновенно, независимо от размера словаря. В терминах алгоритмической сложности это записывается как , где обозначает порядок сложности, а — константное время выполнения.

    Словари — фундамент веб-разработки на Python. Любой ответ от REST API, конфигурация веб-приложения или запись в NoSQL базе данных (например, MongoDB) легко проецируется на словарь.

    Множества (Sets): математика в коде

    Множество — это неупорядоченная коллекция уникальных элементов. Множества оптимизированы для быстрых проверок на вхождение и математических операций (пересечение, объединение, разность).

    В задачах автоматизации и анализа данных множества незаменимы для очистки данных от дубликатов.

    Экосистема Python для ваших целей

    Понимание базовых структур данных открывает дверь к использованию мощных сторонних библиотек, которые делают Python лидером в заявленных вами областях.

  • Для анализа данных и научных вычислений: Библиотека NumPy заменяет стандартные списки на высокопроизводительные массивы, написанные на C. Библиотека Pandas вводит структуру DataFrame (по сути, таблицу), которая под капотом использует словари и массивы для невероятно быстрой обработки миллионов строк.
  • Для автоматизации: Библиотека Requests позволяет отправлять HTTP-запросы, возвращая ответы, которые легко конвертируются в словари Python. Библиотека BeautifulSoup помогает извлекать данные из HTML, сохраняя их в списки и кортежи.
  • Для веб-разработки: Фреймворки Django и FastAPI активно используют словари для маршрутизации и валидации данных. FastAPI, в частности, автоматически конвертирует словари Python в JSON-ответы для клиентских приложений.
  • Практический пример: объединяем знания

    Представьте, что вы автоматизируете сбор данных о серверах. Вы получаете сырые данные, где есть дубликаты, и вам нужно сформировать чистый отчет.

    В этом небольшом скрипте мы использовали списки для хранения последовательности, словари для структурирования свойств объекта, кортежи для создания неизменяемого слепка данных и множества для мгновенной проверки на уникальность. Именно такая комбинация структур данных делает код на Python лаконичным и эффективным.

    2. Работа с файловой системой и автоматизация

    Работа с файловой системой и автоматизация

    В прошлой статье мы разобрали встроенные структуры данных Python: списки, словари, множества и кортежи. Они отлично подходят для хранения и обработки информации в оперативной памяти. Однако, как только выполнение скрипта завершается, все данные из оперативной памяти стираются. Чтобы результаты вашей работы — будь то собранный датасет, отчет об ошибках или конфигурация веб-приложения — сохранились, программе необходимо взаимодействовать с постоянной памятью, то есть с файловой системой.

    Автоматизация рутинных задач — одна из главных причин, почему специалисты из разных сфер выбирают Python. Сортировка тысяч документов, переименование фотографий, извлечение данных из логов — все это можно поручить скрипту, который выполнит работу за доли секунды.

    > Первое правило любой технологии заключается в том, что автоматизация эффективной операции повысит ее эффективность. Второе правило: автоматизация неэффективной операции увеличит ее неэффективность. > > Билл Гейтс

    Прежде чем писать код, давайте оценим целесообразность автоматизации с помощью простой формулы: , где — сэкономленное время, — количество файлов или повторений задачи, — время на ручную обработку одной единицы, а — время, затраченное на написание и отладку кода. Если вам нужно переименовать 5 файлов (), быстрее сделать это руками. Но если файлов 5000, а на каждый уходит по 10 секунд, ручная работа займет почти 14 часов. Скрипт на Python пишется за 15 минут и выполняется за 2 секунды.

    Навигация по файловой системе: модуль pathlib

    Исторически для работы с путями к файлам в Python использовался модуль os.path, который обрабатывал пути просто как строки. Начиная с версии 3.4, стандартом стал модуль pathlib. Он предлагает объектно-ориентированный подход: путь теперь — это не просто текст, а объект, у которого есть полезные методы.

    Это решает классическую проблему разных операционных систем: Windows использует обратный слеш \ для разделения папок, а macOS и Linux — прямой /. Модуль pathlib автоматически адаптирует пути под ту систему, на которой запущен код.

    Чтение и запись файлов: контекстные менеджеры

    Чтобы прочитать или записать данные в файл, его нужно сначала открыть с помощью встроенной функции open(). Эта функция принимает путь к файлу и режим работы (mode):

  • r (read) — чтение (по умолчанию).
  • w (write) — запись (создает новый файл или полностью перезаписывает существующий).
  • a (append) — добавление (дописывает данные в конец файла).
  • Важнейшее правило работы с файлами: открытый файл нужно обязательно закрывать. Если этого не сделать, файл может оказаться заблокированным для других программ, или часть данных не сохранится на диск (останется в буфере оперативной памяти).

    Чтобы не писать команду закрытия вручную и не бояться, что программа упадет с ошибкой до того, как файл закроется, в Python используются контекстные менеджеры — конструкция with.

    Контекстный менеджер можно сравнить с арендой автомобиля. Вы берете машину, пользуетесь ей, а когда срок аренды истекает, система автоматически возвращает ключи компании, независимо от того, как прошла ваша поездка. Вам не нужно помнить об этом самостоятельно.

    Высокоуровневые операции: модуль shutil

    Если pathlib отлично справляется с путями и созданием папок, то для перемещения, копирования и удаления целых деревьев каталогов нужен модуль shutil (shell utilities).

    Представьте, что вы скачали архив с сотнями фотографий, документов и таблиц, которые свалены в одну папку. Вам нужно отсортировать их по папкам в зависимости от расширения. Это классическая задача для автоматизации.

    !Схема автоматизации работы с файлами: от поиска сырых данных до сохранения структурированного отчета.

    Для поиска файлов по шаблону (например, «найти все файлы, заканчивающиеся на .pdf») мы будем использовать метод rglob() из модуля pathlib.

    Структурированные данные: работа с JSON

    В реальных проектах — будь то анализ данных или веб-разработка — вы редко будете работать с простым неструктурированным текстом. Чаще всего данные передаются в формате JSON (JavaScript Object Notation).

    JSON — это текстовый формат обмена данными, который визуально почти идентичен словарям и спискам в Python. Любой ответ от современного веб-сервиса (например, запрос погоды или курсов валют через API) приходит в виде JSON.

    Процесс перевода объектов Python (словарей, списков) в строку JSON для сохранения в файл называется сериализацией. Обратный процесс — чтение из файла и превращение в объекты Pythonдесериализацией.

    Для этого используется встроенный модуль json.

    Обратите внимание на разницу между методами: json.dump() записывает данные в файл, а json.dumps() (с буквой s на конце, от слова string) превращает словарь в строку JSON внутри оперативной памяти, не сохраняя на диск.

    Практический пример: анализатор логов

    Давайте объединим знания из этой и предыдущей статьи. Напишем скрипт, который читает текстовый лог-файл веб-сервера, подсчитывает количество ошибок каждого типа (используя словарь) и сохраняет красивый отчет в формате JSON.

    В этом скрипте мы применили строковые методы для очистки данных, словари для агрегации (подсчета уникальных значений), контекстный менеджер with для безопасной работы с файловой системой и модуль json для структурированного сохранения результатов. Это базовый, но абсолютно реальный пайплайн (pipeline), который используется в задачах автоматизации и подготовки данных для аналитики.

    3. Введение в NumPy и Pandas

    Введение в NumPy и Pandas

    В прошлой статье мы научились работать с файловой системой, автоматизировать рутинные задачи и сохранять результаты в формате JSON. Но что делать, если вам нужно проанализировать файл, содержащий миллионы строк? Например, выгрузку транзакций банка, результаты научных экспериментов или логи посещений крупного веб-сайта.

    Стандартные списки и циклы Python, которые мы изучили ранее, отлично подходят для базовых задач. Однако при обработке огромных массивов чисел они становятся слишком медленными и потребляют много оперативной памяти. Для решения этой проблемы в мире Python существуют две фундаментальные библиотеки: NumPy и Pandas. Они превращают язык в мощнейший инструмент для научных вычислений и анализа данных.

    NumPy: математический двигатель Python

    NumPy (Numerical Python) — это базовая библиотека, которая добавляет поддержку больших многомерных массивов и матриц, а также предоставляет набор высокопроизводительных математических функций для работы с ними.

    Главное отличие массива NumPy от стандартного списка Python заключается в том, как они хранятся в оперативной памяти компьютера. Список Python может содержать разные типы данных (числа, строки, словари одновременно), поэтому для каждого элемента система хранит дополнительную служебную информацию. Массив NumPy содержит данные строго одного типа (например, только целые числа). Это позволяет хранить их в памяти плотно, друг за другом, что ускоряет обработку в десятки и сотни раз.

    Ключевая концепция NumPyвекторизация. Это способность применять математические операции сразу ко всему массиву данных без использования явных циклов for.

    Представьте, что вам нужно перенести 100 тяжелых коробок со склада в грузовик. Использование стандартного цикла Python — это как носить каждую коробку в руках по одной. Векторизация в NumPy — это использование вилочного погрузчика, который берет весь поддон с коробками и перемещает его за один раз.

    В этом примере мы не писали цикл для перебора каждого элемента. NumPy сделал это за нас на уровне быстрого языка C, на котором написана сама библиотека.

    Pandas: табличный процессор для аналитики

    Если NumPy — это мощный двигатель, то Pandas (Panel Data) — это удобный салон автомобиля с приборной панелью. Эта библиотека построена поверх NumPy, но предназначена для работы со структурированными табличными данными.

    По сути, Pandas — это Excel на максимальных настройках. Он позволяет загружать данные из файлов (CSV, Excel, SQL-баз), фильтровать их, группировать, находить аномалии и заполнять пропуски с помощью пары строк элегантного кода.

    !Схема структуры данных Pandas DataFrame

    Вся магия Pandas строится на двух базовых структурах данных:

  • Series (Серия) — это одномерный массив данных. Представьте себе одну колонку в таблице. В отличие от обычного списка, у каждого элемента в Series есть явный индекс (метка), по которому к нему можно обратиться. Индексом могут быть не только порядковые номера, но и даты или текстовые названия.
  • DataFrame (Датафрейм) — это двумерная таблица, состоящая из строк и колонок. Технически, DataFrame — это словарь, где ключами выступают названия колонок, а значениями — объекты Series одинаковой длины.
  • Давайте создадим DataFrame, используя знания о словарях из первой статьи нашего курса.

    Вывод этой программы будет выглядеть как аккуратная таблица, где слева автоматически добавится колонка с индексами (от 0 до 3).

    Практический сценарий: фильтрация и вычисления

    В реальных проектах данные редко вводят вручную. Обычно их загружают из файлов. В прошлой статье мы использовали встроенную функцию open(), но для таблиц у Pandas есть готовый метод pd.read_csv().

    Представим, что мы загрузили таблицу с транзакциями. Нам нужно быстро понять, что находится внутри, и найти активных клиентов.

    Обратите внимание на синтаксис фильтрации: df[условие]. Внутри квадратных скобок мы передаем логическое выражение. Pandas проверяет каждую строку: если условие выполняется (возвращает True), строка остается в итоговой таблице.

    Векторизация позволяет легко создавать новые колонки на основе математических формул. Например, при расчете конверсии интернет-магазина используется формула:

    Где — коэффициент конверсии в процентах, — количество заказов, а — количество уникальных посетителей. С помощью Pandas вы можете вычислить этот показатель для тысяч рекламных кампаний одновременно одной строкой кода: df['CR'] = (df['Orders'] / df['Visitors']) * 100.

    Обработка пропущенных значений

    В реальном мире данные часто бывают "грязными". Например, при сборе анкет кто-то мог не указать свой возраст или произошел сбой датчика. В Pandas такие пустоты обозначаются как NaN (Not a Number).

    Если вы попытаетесь посчитать средний возраст с помощью обычного цикла Python, программа может выдать ошибку или исказить результат при столкновении с пустотой. Pandas же умеет элегантно обходить эту проблему.

    > Очистка и подготовка данных занимает до 80% времени работы аналитика. Построение сложных моделей машинного обучения — лишь верхушка айсберга. > > Harvard Business Review

    У нас есть два основных пути работы с пропусками:

  • Удалить строки с пустыми значениями с помощью метода .dropna(). Это подходит, если пропусков мало и потеря данных не критична.
  • Заполнить пропуски логичным значением с помощью .fillna(). Например, заменить пустой возраст на медианный возраст всех остальных пользователей.
  • Группировка и агрегация данных

    Один из самых частых запросов в анализе данных — это сегментация. Например, мы хотим узнать не просто общую выручку, а выручку в разрезе каждого города. В базах данных для этого используется оператор GROUP BY, и в Pandas есть его точный аналог — метод .groupby().

    Процесс группировки состоит из трех шагов, которые часто называют принципом Split-Apply-Combine (Разделение-Применение-Объединение):

  • Таблица разделяется на части по уникальным значениям выбранной колонки (например, по городам).
  • К каждой части применяется математическая функция (сумма, среднее, подсчет количества).
  • Результаты объединяются в новую сводную таблицу.
  • В этом примере мы сгруппировали данные по колонке city, затем выбрали колонку revenue и применили к ней функцию .sum(). Всего одна строка кода заменила сложный алгоритм с созданием вложенных словарей и циклов, который потребовался бы в чистом Python.

    Использование NumPy и Pandas кардинально меняет подход к программированию. Вместо того чтобы писать длинные инструкции о том, как перебрать каждый элемент (императивный подход), вы просто указываете, что хотите получить в итоге (декларативный подход). Это экономит время разработчика и вычислительные ресурсы компьютера, открывая дорогу к серьезному анализу данных.

    4. Маршрутизация и API в веб-фреймворках

    Маршрутизация и API в веб-фреймворках

    В предыдущих статьях мы научились управлять файловой системой и обрабатывать огромные массивы данных с помощью Pandas. Однако данные приносят максимальную пользу, когда ими можно поделиться с другими людьми или программами. Чтобы ваш скрипт, анализирующий продажи или предсказывающий погоду, стал доступен всему миру, его нужно превратить в веб-сервис.

    Основой взаимодействия в современном интернете является API (Application Programming Interface — программный интерфейс приложения). Это набор правил, по которым одна программа общается с другой. Если пользовательский интерфейс (кнопки, окна, меню) создается для людей, то API создается для машин.

    Как работает API: аналогия с рестораном

    Представьте, что вы пришли в ресторан. Вы — это клиентское приложение (например, мобильное приложение на телефоне или браузер). Кухня ресторана — это сервер, где хранятся базы данных и выполняются сложные вычисления на Python.

    Вы не можете просто зайти на кухню и начать готовить себе еду. Вам нужен посредник, который примет ваш заказ, передаст его поварам, дождется приготовления и принесет готовое блюдо. Этим посредником выступает официант. В мире веб-разработки роль официанта выполняет API.

    > API — это контракт между поставщиком информации и ее потребителем. Он строго регламентирует, какие запросы можно отправлять и в каком формате придет ответ. > > Хабр

    Общение между клиентом и сервером чаще всего происходит по протоколу HTTP. Чтобы сервер понимал, что именно мы от него хотим, используются специальные методы (глаголы) HTTP-запросов:

    | Метод HTTP | Действие в базе данных | Пример из жизни (API интернет-магазина) | | :--- | :--- | :--- | | GET | Чтение | Получить список доступных товаров | | POST | Создание | Добавить новый товар в корзину | | PUT | Обновление | Изменить адрес доставки в профиле | | DELETE | Удаление | Удалить товар из корзины |

    Ответ от сервера обычно возвращается в формате JSON, с которым мы уже работали во второй статье курса. Технически, для Python это выглядит как обычный словарь.

    Что такое маршрутизация?

    Когда сервер получает HTTP-запрос, ему нужно понять, какой именно кусок кода должен этот запрос обработать. Процесс сопоставления входящего URL-адреса с конкретной функцией в программе называется маршрутизацией (routing).

    Представьте себе коммутатор на старой телефонной станции. Входящий звонок поступает на главный пульт, и телефонистка (маршрутизатор) соединяет вас с нужным отделом в зависимости от того, кого вы просите позвать.

    Если пользователь обращается по адресу mysite.com/users, маршрутизатор запускает функцию, которая достает из базы данных список пользователей. Если запрос идет на mysite.com/products, запускается функция поиска товаров.

    !Схема работы маршрутизатора в веб-приложении

    Создание первого API с помощью FastAPI

    В экосистеме Python существует множество веб-фреймворков. Исторически популярными были Django (мощный, но тяжеловесный) и Flask (минималистичный). Однако в последние годы стандартом индустрии для создания API стал FastAPI.

    FastAPI — это современный, быстрый и невероятно удобный фреймворк. Его главное преимущество заключается в том, что он активно использует встроенные в Python подсказки типов (type hints), что позволяет автоматически проверять данные на ошибки и генерировать документацию.

    Давайте напишем простейшее веб-приложение. Для этого потребуется установить библиотеку (обычно это делается через команду pip install fastapi uvicorn).

    В этом коде символ @ обозначает декоратор. Декораторы в Python — это способ изменить или расширить поведение функции, не меняя ее внутренний код. В данном случае @app.get("/status") говорит фреймворку: «Если кто-то отправит GET-запрос на адрес /status, запусти функцию check_status и верни ее результат клиенту».

    Динамическая маршрутизация и параметры пути

    Часто нам нужно получить не весь список данных, а информацию о конкретном объекте. Например, профиль пользователя с идентификатором 42. Создавать отдельный маршрут для каждого пользователя (/users/1, /users/2 и так далее) невозможно.

    Здесь на помощь приходят параметры пути. Мы можем указать маршрутизатору, что часть URL-адреса является переменной, которую нужно передать внутрь функции.

    Обратите внимание на запись user_id: int. Если клиент попытается запросить адрес /users/hello, FastAPI автоматически отклонит запрос и вернет понятную ошибку, сообщив, что ожидалось число, а не текст. В старых фреймворках, таких как Flask, разработчикам приходилось писать этот код проверки вручную.

    Масштабирование: использование нескольких маршрутизаторов

    Пока в нашем приложении три-четыре функции, их удобно держать в одном файле main.py. Но реальные проекты быстро разрастаются. У вас могут появиться десятки маршрутов для работы с пользователями, товарами, оплатой и аналитикой. Если оставить всё в одном файле, он превратится в нечитаемую «простыню» кода на тысячи строк.

    Для решения этой проблемы применяется модульный подход. Мы разбиваем логику на разные файлы, используя класс APIRouter.

    Представьте, что FastAPI() — это главный распределительный щит здания, а APIRouter() — это локальные щитки на каждом этаже. Главный щит просто делегирует управление локальным.

    Давайте создадим отдельный файл для работы с пользователями — routers/users.py:

    Теперь в нашем главном файле main.py мы можем подключить этот модуль одной строкой:

    Благодаря методу app.include_router(), все маршруты из файла users.py теперь доступны в нашем приложении. Запрос к /users/ вернет список имен, а запрос к /users/5 вернет статус конкретного пользователя.

    Такой подход дает несколько критически важных преимуществ:

  • Изоляция логики: код, отвечающий за пользователей, не смешивается с кодом корзины товаров.
  • Командная работа: разные программисты могут параллельно работать над разными файлами-маршрутизаторами, не мешая друг другу.
  • Легкость тестирования: небольшие изолированные модули гораздо проще проверять на наличие ошибок.
  • Понимание принципов маршрутизации и структуры API — это фундамент современной веб-разработки. Освоив эти концепции, вы сможете превратить любой локальный скрипт на Python в полноценный сервис, с которым смогут взаимодействовать мобильные приложения, фронтенд-интерфейсы и другие серверы по всему миру.

    5. Пошаговая сборка практического проекта

    Пошаговая сборка практического проекта

    На протяжении предыдущих этапов курса мы изучили фундаментальные инструменты языка Python. Мы разобрали базовый синтаксис, научились управлять файловой системой, освоили мощные библиотеки для анализа данных Pandas и NumPy, а также поняли, как работают веб-серверы и маршрутизация в FastAPI. По отдельности эти навыки похожи на детали конструктора. Настоящая магия программирования начинается тогда, когда мы соединяем их вместе для решения реальной задачи.

    В реальном мире разработчики редко пишут код ради самого кода. Чаще всего цель состоит в создании пайплайна (pipeline — конвейер данных) — автоматизированной системы, которая самостоятельно собирает информацию, обрабатывает её и предоставляет пользователю в удобном виде.

    Концепция: умный мониторинг цен

    Представьте, что вы хотите купить дорогой ноутбук, но цены в интернет-магазинах постоянно меняются. Искать выгодные предложения вручную каждый день — утомительно. Мы создадим автоматизированного помощника, который будет делать это за нас.

    Наш проект будет состоять из четырех логических этапов, каждый из которых опирается на знания из предыдущих статей:

  • Сбор данных: скрипт скачивает страницу интернет-магазина и извлекает названия товаров и их цены.
  • Анализ: данные загружаются в таблицу, очищаются от мусора, после чего вычисляется средняя рыночная стоимость.
  • Хранение: результаты сохраняются в структурированный файл.
  • Доставка: веб-сервер открывает доступ к найденным скидкам через API.
  • !Схема конвейера данных: от сбора до веб-интерфейса

    Такой модульный подход позволяет легко заменять компоненты. Если завтра вы решите анализировать не ноутбуки, а цены на недвижимость, вам придется изменить только первый блок, оставив логику анализа и веб-сервера нетронутой.

    Шаг 1: Сбор сырых данных (Веб-скрейпинг)

    Процесс автоматического извлечения информации с веб-страниц называется веб-скрейпингом (web scraping). Когда вы открываете сайт в браузере, сервер присылает HTML-код, который браузер превращает в красивую картинку. Наш скрипт будет притворяться браузером, скачивать этот HTML-код и искать в нем нужные текстовые блоки.

    Для этого в Python используются две популярные библиотеки: Requests (для отправки HTTP-запросов) и BeautifulSoup (для поиска данных внутри HTML).

    > Качество данных — основа любого аналитического проекта. Если на этапе сбора вы получите «грязную» информацию с ошибками, все последующие вычисления будут бесполезны. > > Хабр

    Напишем функцию, которая собирает данные. В реальном проекте мы бы обращались к настоящему магазину, но для примера представим, что мы получаем список товаров в виде сырого текста:

    Обратите внимание на проблему: в наших данных есть чехол (который не является ноутбуком) и цены записаны как строки с текстом «руб.». В таком виде анализировать их математически невозможно.

    Шаг 2: Очистка и анализ данных с Pandas

    Здесь в игру вступает Pandas, с которым мы работали в третьей статье. Нам нужно преобразовать сырые словари в удобный DataFrame, отфильтровать лишнее и привести числа к правильному типу данных.

    Теперь, когда у нас есть чистые данные и средняя цена, мы можем найти самые выгодные предложения. Для оценки привлекательности каждого объявления используется простая математика.

    Выгода рассчитывается по формуле:

    Где — это выгода в процентах, — средняя рыночная цена, а — цена конкретного товара. Если средняя цена 120 000, а мы нашли за 85 000, то выгода составит около 29%.

    Добавим этот расчет в нашу функцию:

    Шаг 3: Сохранение результатов

    Как мы обсуждали во второй статье, данные нужно надежно сохранять. Если наш скрипт упадет из-за отключения интернета, мы не должны потерять уже найденные скидки. Используем контекстный менеджер with и модуль json.

    Параметр ensure_ascii=False гарантирует, что русские буквы сохранятся корректно, а не превратятся в нечитаемые символы (юникод-последовательности). indent=4 делает файл визуально понятным для человека.

    Шаг 4: Создание веб-интерфейса через API

    Данные собраны, очищены и лежат в файле best_deals.json. Теперь нужно сделать так, чтобы мы могли посмотреть их с телефона или передать другому приложению. Для этого мы поднимем локальный сервер на FastAPI, концепции которого разобрали в предыдущей статье.

    Создадим файл server.py:

    Теперь при переходе по адресу http://localhost:8000/api/deals мы получим готовый JSON-ответ со списком самых выгодных ноутбуков. Этот адрес можно подключить к Telegram-боту, мобильному приложению или просто просматривать в браузере.

    Шаг 5: Оркестрация (Сборка воедино)

    У нас есть отдельные функции, но кто будет их запускать? Нам нужен главный управляющий скрипт — оркестратор. В сложных корпоративных системах для этого используют тяжеловесные инструменты вроде Apache Airflow, но для локального проекта достаточно простого цикла.

    Создадим файл main.py, который объединит всё вместе:

    | Ручной подход | Автоматизированный пайплайн | | :--- | :--- | | Требует ежедневного внимания и кликов | Работает автономно 24/7 | | Высокий риск пропустить выгодную цену | Мгновенно фиксирует изменения | | Сложно анализировать сотни позиций | Pandas обрабатывает миллионы строк за секунды | | Данные остаются только в голове или Excel | Данные доступны через API любому приложению |

    Мы прошли полный путь от базовых переменных до создания полноценного программного продукта. Вы увидели, как Python позволяет бесшовно связывать совершенно разные задачи: скачивание страниц из интернета, сложную математическую фильтрацию таблиц, работу с файлами на жестком диске и маршрутизацию сетевых запросов.

    Именно эта универсальность делает Python самым популярным языком для автоматизации и работы с данными. Поняв принципы построения таких конвейеров, вы сможете автоматизировать практически любую рутинную задачу в своей жизни или работе.