Глава 1. Средства, модели и пакеты, используемые для создания
приложения
В этой главе речь пойдет о самом процессе написания практической части для выпускной квалификационной работы. По очереди будет рассказано про язык программирования Python, про алгоритмы парсинга данных, про веб-фреймворк Django.
1.1 Язык программирования Python
Python – высокоуровневый язык программирования общенаправленного назначения, ориентированный на увеличение скорости работы и производительности программиста. Синтаксис этого языка программирования минималистичен. В это же время, в Питоне присутствует обширная встроенная библиотека с большим объем полезных методов.
Python поддерживает следующие разновидности программирования: объектно-ориентированное, функциональное, структурное, императивное, аспектно-ориентированное. Ключевые архитектурные черты – изменяющаяся типизация, автоматическое регулирование памяти, механизм работы с различного рода исключениями, многопоточные вычисления, высокоуровневые структуры информации. Поддерживается разбиение кода на модули, которые, в свою очередь, по необходимости могут объединиться в директории.
Python – язык программирования, который активно развивается. Новые версии при добавлении языковых особенностей выходят около одного раза в год. Питон не подвергался документированной стандартизации, роль ГОСТа де-факто выполняет интерпретатор, разрабатываемый под руководством автора языка.
Создание языка Python берет начало в середине 1980-х годов работником голландского института Г. Ван Россумом. Для Распределенной системы Amoeba требовался увеличивающийся скриптовый язык, тогда Гвидо принялся за написание будущего языка программирования в свободные вечера, при этом он использовал некоторые наброски языка ABC. Во второй месяц 1991 года разработчик опубликовал исходный код в новостном сообществе «alt. sources». Изначально Python рассматривался и планировался как объектно-ориентированный язык программирования.
Название Питона, вопреки расхожему мнению, берет свое начало не от вида пресмыкающихся. Создатель языка решил назвать его так в честь популярного в то время телешоу британского происхождения «Летающий цирк Монти Пайтона». Однако это никогда не мешало людям ассоциировать название языка со змеей. В итоге дошло до того, что даже на самом официальном сайте эмблема выглядела как змеиная голова. Разработчики Python старались разрабатывать его так, чтобы язык было весело и легко использовать.
Еще одна причина успеха Python, кроме удачного дизайнерского решения, - наличие отзывчивого, дружелюбного и неравнодушного сообщества пользователей этого языка программирования. Язык, как уже говорилось выше, активно развивается, его развитие проходит по строгому, четко регламентированному процессу созидания. Существует такой список документов «Python Enhancement Proposal» или попросту PEP в нем собраны все предложения по развитию Python.
В декабре, а точнее, 3 декабря 2008 года вышла первая версия этого языка программирования версии 3.0. Все это стало возможным после длительного тестирования языка. В этой версии разработчики устранили многочисленные недостатки, которые были ранее в архитектуре. Именно это версия и используется в настоящем веб-приложении.
На Python оказало влияние множество созданных ранее языков программирования:
1. ABC (императивный, процедурный высокоуровневый язык программирования)
2. Modula-3 (системный язык программирования)
3. C, C++ (Си, Си++ – компилируемые статически типизированные языки программирования)
4. Smalltalk (ООП с динамической типизацией)
5. Lisp (семейство нескольких языков программирования)
6. Fortran (первый язык программирования высокого уровня)
7. Miranda (функциональный язык программирования)
8. Java (сильно типизированный язык ООП)
9. Icon
Python может работать практически на всех существующих и общеизвестных платформах – от ПК до мейнфреймов. Этот язык программирования может использоваться на следующих платформах:
1. Microsoft Windows (семейство коммерческих ОС корпорации Microsoft)
2. Почти все варианты UNIX
3. Plan 9
4. Mac OS (семейство проприетарных ОС производства корпорации Apple)
5. iPhone OS версии 2 и больше (мобильная ОС)
6. Palm OS (ОС для наладонных компьютеров и коммуникаторов)
7. OS/2
8. Amiga (семейство домашник ПК и ОС к ним)
9. HaikuOS (ОС для ПК)
10. AS/400 (сервера IBM)
11. OS/390 (проприетарная 64-битная серверная ОС)
12. Windows Mobile (мобильная ОС)
13. Symbian (ОС для сотовых телефонов)
14. Android
Когда платформа устаревает, новые версии Python со временем перестают поддерживаться. К примеру, с питоновской серии 2.6 прекратилась поддержка Windows 95, Windows 98, Windows ME. Но эти платформы все еще могут поддерживать более старые версии языка. Например, версия 2.3 до сих пор активно поддерживается.
Python поддерживает динамическую типизацию. Динамическая типизация – это когда тип переменной определяется самостоятельно языком во время выполнения программы. Python поддерживает следующие встроенные типы данных:
1. Булевый тип данных
2. Строчный тип данных
3. Unicode – строки
4. Целое число произвольной точности
5. Число с плавающей точкой
6. Комплексные числа и другие
Кроме того, Python поддерживает списки, кортежи, словари, множества и многое другое. Все значения в этом языке программирования являются объектами – и методы, и модули, и классы.
Питон – это язык, которому присущ строгий, ясный и последовательный синтаксис, у него продуманная модульность, благодаря которой код, который пишется на языке Python читается очень легко.
Этот язык программирования выстроен вокруг объектно- ориентированной модели программирования.
Некоторые особенности и возможности языка программирования Python:
1. Классы не просто классы, но еще и объекты
2. Наследование, даже множественное
3. Полиморфизм
4. Инкапсуляция (общедоступные, скрытые). Здесь скрытые члены класса доступны для использования. Они только помечены как скрытые особыми именами
5. Конструкторы, деструкторы, распределители памяти
6. Имеется возможность перегрузки операторов
7. Имитация поля с помощью функций
8. Руководство доступами к полям
Кроме того, Python построен еще и с поддержкой функционального программирования. Например, ниже будут приведены примеры, которые относят этот язык к функциональному программированию:
1. Функции в Python является объектом
2. Существуют функции высших порядков
3. Поддерживается рекурсия
4. Частичное применение функций
Приложения на Python представляются в виде модулей. Эти самые модули, в свою очередь, могут собираться в пакеты. Модули находятся в каталогах, но могу располагаться и в ZIP-архивах. Но этот язык программирования поддерживает не только модули, написанные на чистом языке программирования Python, но и модули, написанные на других языках программирования.
Питон имеет возможность полностью поддерживать полную интроспекцию времени исполнения. Получается так, что есть возможность получить для любого объекта всю информацию о его внутренней структуре. Интроспекция широко применяется в библиотеках и фреймворках Python, таких как PyRO, Django и других. Как раз о Django далее в этой главе речь и пойдет.
1.2 Фреймворк Django
Джанго – фреймворк, который предназначен как раз для веб- приложений, это свободный фреймворк, который использует шаблоны проектирования MVC. Django поддерживает организация Django Software Foundation.
Что отличает Django от остальных фреймворков – обработчики URL–ов в Джанго конфигурируются явно при помощи регулярных выражений.
Django использует собственный ORM при работе с базами данных. В ORM модель данных описывается питоновскими классами, по ней как раз и генерируется схема базы данных.
Веб-фреймворк Джанго используется в следующих больших и популярных продуктах:
1. Instagram (приложение для обмена фото и видео, с элементами соцсети)
2. Disqus (веб-сервис с возможностью импорта интернет- обсуждений и комментариев на сайт пользователя)
3. Mozilla
4. The Washington Times (консервативная газета США)
5. Pinterest (социальный интернет-сервис и фотохостинг)
6. YouTube (видеохостинг)
7. Google и другие (крупнейшая в мире поисковая система)
Что же касается самой архитектуры Django, она имеет сходство со схемой MVC («Модель-Представление-Контроллер»). Однако архитектуру Django чаще называют MTV («Модель-Шаблон-Представление»), так как презентационная логика Представление во фреймворке Джанго реализуется уровнем Шаблонов.
Изначально Django разрабатывался как способ работы с новостными ресурсами. И это довольно сильно отразилось на его архитектуре. В Джанго
встроен ряд возможностей, которые помогают программисту в написании веб-сайтов информационного характера. Например, контроллеры и страницы для административной части сайта нет нужды создавать самому разработчику, так как в Джанго имеется встроенное приложение для управления содержимым. Это приложение можно включить в любой сайт, который написан на Django. Это приложение, к тому же, может управлять одновременно несколькими сайтами, запущенными на одном сервере. Приложение-администратор, кроме того, протоколирует все произведенные действия и предоставляет интерфейс пользователю.
Далее будут перечислены некоторые возможности Джанго:
1. ORM, API доступа к Базам Данных с поддержкой транзакций. (ORM – технология программирования, связывающая БД с функциями языков ООП. ORM создает виртуальную объектную БД)
2. Как уже указывалось выше, в Джанго существует встроенный админский интерфейс. Кроме того, в этот интерфейс встроен автоматический перевод на многие языки
3. URL – диспетчеры основываются на регулярных выражениях
4. Система шаблонов в Джанго имеет свойство расширяться, также обладает шаблонами с тегами и наследованием
5. Присутствует система кеширования
6. Поддерживает множество языков
7. Существует подключаемая архитектура приложений, которую, при желании, можно установить на любой Джанго-сайт
8. Присутствуют шаблоны функций контроллеров
9. Поддерживаются встроенная авторизация и аутентификация. Можно подключить внешние модули аутентификации
10. Существует система фильтров, внедренная в целях построения дополнительных обработчиков запросов
11. Поддерживается специальная библиотека для работы с формами
12. Присутствует встроенная автоматическая документация
Кроме функций, которые встроены в ядро фреймворка, применяются пакеты, которые расширяют его возможности.
Изначально Django проектировался как фреймворк, который будет работать под управлением веб-сервера Apache, его модулем являлся mod python, а в качестве БД использовалась СУБД PostgreSQL.
После того, как включилась поддержка стандарта взаимодействия WSGI, Django научился работать под управлением интерфейса FastCGI, модуля mod wsgi, или протокола SCGI на Apache и других серверах, веб- сервера и сервера веб-приложений uWSGI.
В наши дни, кроме БД PostgreSQL, Джанго умеет работать с такими СУБД как:
1. MySQL (РСУБД)
2. SQLite (довольно компактная, ее я и использовала)
3. Microsoft SQL Server (РСУБД)
4. DB2 (РСУБД)
5. Firebird (РСУБД)
6. SQL Anywhere
7. Oracle (объектно-реляционная СУБД)
Django можно разместить на сервисах предоставления облачных вычислений Paas американской компании RedHat: OpenShift, Heroku, Хостинг PythonAnywhere, Hoster.by
Дальше речь пойдет о парсинге данных.
1.3 Алгоритмы парсинга данных
Парсинг – это последовательность слов, которая линейно сопоставляется с правилами конкретного языка. Этот язык может быть любым человеческим, который используется при коммуникации людей.
Кроме того, этот язык может быть формализованным, как, например, языки программирования.
Парсинг – анализ синтаксической информации, которая расположена на веб-странице. На сайтах текст - набор данных, расположенных в иерархическом порядке (чаще всего, иерархия задается тегами языка html). Языки программирования, говорят о том, в каком виде данные, написанные на человеческом языке, укомплектованы на веб-странице.
Плюсы парсера, по сравнению с механической работой человека, занимающегося аналитикой:
1. Парсер гораздо быстрее проходится по тысячам интернет- страниц
2. Парсер без труда способен разделить технические данные и информацию, написанную на человеческом языке
3. Парсер безошибочно отбрасывает ненужные данные, оставляет только запрашиваемую информацию
4. Парсер упаковывает данные в тот вид, который требуется пользователю
То, что получается на выходе все еще нуждается в некоторой косметической обработке, однако, это все же намного легче, чем производить все операции вручную.
На самом деле, парсеры можно писать не только на Питоне, для их создания применяются самые разные языки программирования. Однако все же, самыми популярными являются скриптовые языки программирования (сценарные, интерпретируемые):
1. JavaScript (мультипарадигмальный язык программирования)
2. ActionScript (ООП)
3. Perl (высокоуровневый интерпретируемый динамический язык программирования)
4. Python
5. Scala (мультипарадигмальный язык программирования)
6. R (язык программирования для статической обработки данных и работы с графикой)
7. Ruby (динамический, рефлективный, интерпретируемый высокоуровневый язык программирования)
8. PHP (скриптовый язык для разработки веб-приложений) Что необходимо знать, чтобы написать парсер:
1. В первую очередь необходимо досконально изучить исходный код веб-страницы, которую мы собираемся парсить. Чтобы провернуть такую операцию, нужно обладать основными знаниями по работе технологий верстки (HTML, CSS, JavaScript)
2. Необходимо изучить DOM – технологию. (программный интерфейс, который не зависит от платформы и языка. Этот интерфейс позволяет программам и скриптам получить доступ к содержимому HTML, XHTML и XML документов. Кроме того, можно менять содержимое, структуру и оформление этих документов)
3. Самое сложное – это, конечно, написание самого парсера, можно использовать готовые библиотеки, которые создавались специально для парсинга
4. Важно разбираться в основах ООП
5. Нужны минимальные знания о работе Баз Данных Этапы написания парсеров:
1. Во-первых, программист получает исходный код страницы, которую собирается парсить
2. Во-вторых, необходимые данные извлекаются из кода разметки. На этом моменте вся ненужная информация отбрасывается, а все остальное выстраивается по иерархии.
3. Следующим шагом обработанные данные необходимо сохранить в том виде, в котором потом их можно будет обработать
4. Алгоритм, конечно же, должен обладать способностью переходить с первой страницы на все последующие
Подытожим, парсинг занимается анализом сайтов, он вычленяет из него необходимую информацию. Часто парсинг применяют еще и для автоматического наполнения своего сайта информацией.
1.4 Модели разработки веб-приложения
Структурная модель разработки. Здесь будут перечислены основные структурные подсистемы настоящего проекта:
1. Views.py. Views – отображения. Это основная часть получившегося веб-приложения. Views.py получает запросы и возвращает ответы. Кроме того, этот модуль организовывает прочие ресурсы фреймворка для доступа к БД, генерации шаблонов и другому.
2. Парсеры. В данной части в дипломном проекте описываются алгоритмы, по которым работают парсеры. Подробнее о самих парсерах говорилось немного ранее.
3. Models.py. Модели показывают информацию о данных, с которыми происходит работа. Модели в принципе описывают структуру хранимых данных. Они описывают типы полей, размер, значения, текст справки, текст форм. Модели в Django хорошо помогают при работе с Базами Данных.
4. Admin.py – встроенная панель администратора. Ее работа тоже была описана выше. Эта панель позволяет добавлять, редактировать и удалять записи.
Функциональная модель разработки. Здесь описывается последовательность причинно-следственных отношений объектов основной ветки, составляющей систему. В первую очередь система принимает на вход ссылку на интересующий пользователя товар, также вводится количество
необходимых для парсинга страниц -> по URL-значению выбирается один из трех написанных парсеров -> происходит сам процесс парсинга -> после успешного завершения работы парсера, происходит запись полученной информации в Базу Данных -> при необходимости можно выполнить сравнение цен спарсированных товаров с товарами пользователями.
Описание информационной модели. Что касательно входной информации, пользователь задает ее самостоятельно, когда вводит данные об URL-е и количестве страниц в соответствующие поля. Все это происходит при обращении к полям url_target и page_count в модуле views.py соответственно. Периодичности как таковой не существует, модель начинает работать, когда пользователь жмет на кнопку «Парсить». В настоящем проекте существует три модели. Модель «моих» товаров, модель товаров конкурентов и модель для сравнения. В модели товаров конкурентов существуют следующие характеристики:
1. id_product – Артикул товара
2. name – Название товара
3. price – Цена товара
4. categoryID – ID категории товара
5. categoryName – Категория товара
6. vendorName – Производитель товара
7. groupID – ID группы товара
8. url – Ссылка на товар
9. status – Статус товара
10. shop – Магазин товара
11. created – Дата парсинга
В модели «моих» товаров конкурентов существуют следующие характеристики:
1. id_product – Артикул товара
2. name – Название товара
3. price – Цена товара
4. categoryID – ID категории товара
5. categoryName – Категория товара
6. vendorName – Производитель товара
7. url – Ссылка на товар
8. created – Дата парсинга
В модели сравнения существуют следующие характеристики:
1. id_product – Артикул товара
2. name_my – Товар «моего» магазина
3. price_my – Цена на товар «моего» магазина
4. shop_competitor – Магазин конкурента
5. name_competitor – Название товара конкурента
6. url – Ссылка на товар
7. price_competitor – Цена на товар конкурента
8. diff – Разница между товаром конкурента и «моим» товаром
9. status – Показывает, ниже ли цена на «мой» товар, чем цена на товар конкурента
10. created – Дата сравнения
Сравнение «моего» товара с товаром конкурента происходит по артикулу и/или наименованию товара. Именно по этому пункту идет взаимосвязь между моделями.
1.5 Библиотеки Python, используемые при написании web-приложения
«Мониторинг цен»
Описание программного обеспечения. При написании дипломной работы в программе были использованы следующие библиотеки:
1. Beautifulsoup4 версии 4.7.1 – этот модуль позволяет осуществлять парсинг данных в форматах html и xml.
2. bs4 версии 0.0.1 – это библиотека, частью которой является beautifulsoup4
3. certify версии 2018.11.29
4. chardet версии 3.0.4 – этот модуль существует, для того, чтобы автоматически распознавать кодировки символов в тексте
5. defusedxml версии 0.5.0 – защита кода XML
6. diff-match-patch версии 20181111 – эта библиотека предназначена для сравнения содержимого, для отображения отличий двух текстов
7. Django версии 2.1.7 – версия Джанго, которую я использовала
8. django-cors-headers версии 2.5.0 – эта библиотека подстраивает заголовки сервера нужным образом
9. django-debug-toolbar версии 1.11 – эта библиотека дает возможность существовать набору панелей Debug-toolbar, которая появляется на странице в режиме отладки. Эта панель способна показывать версию Джанго, время выполнения запросов, и многие другие занимательные штуки
10. django-import-export версии 1.2.0 – библиотека предназначена для того, чтобы веб-приложение имело возможность импортировать и экспортировать данные.
11. django-suit версии 0.2.26 – эта библиотека нужна, чтобы придать более симпатичный (на мой взгляд) вид панели администратора
12. entrypoints версии 0.3 – модуль, предназначенный для поиска и загрузки точек входа в установленных пакетах
13. et-xmlfile версии 1.0.1 – эта библиотека предназначена для создания больших XML файлов
14. flake8 версии 3.7.7 – библиотека, при помощи которой можно проанализировать код программы и обнаружить в нем стилистические ошибки и нарушения разнообразных правил написания кода на языке программирования Питон
15. idna версии 2.8-++
16. jdcal версии 1.4 – модуль, который позволяет преобразовывать даты между юлианским и григорианским календарями
17. lxml версии 4.3.2 – очередная библиотека специально для парсинга
18. mccabe версии 0.6.1 – проверка сложности кода, написанного на языке Питон
19. odfpy версии 1.4.0
20. openpyxl версии 2.6.0 – модуль, предназначенный для чтения и записи данных из и в excel
21. psycopg2-binary версии 2.7.7
22. pycodestyle версии 2.5.0 – модуль – руководство по проверке
стиля
23. pyflakes версии 2.1.0 – библиотека для пассивной проверки
программ Питона
24. pytz версии 2018.9
25. PyYAML версии 4.2b4
26. requests версии 2.21.0 –HTTP библиотека
27. soupsieve версии 1.8
28. sqlparse версии 0.2.4 – библиотека – синтаксический анализатор для Питона
29. tablib версии 0.12.1 – неформатная библиотека для табличных наборов данных
30. unicodecsv версии 0.14.1 – библиотека, которая в Python промышляет заменой CSV- модуля с поддержкой Unicode
31. urllib3 версии 1.24.2 – библиотека, предназначенная для HTTP с потоковым пулом соединений
32. xlrd версии 1.2.0 – эта штука занимается извлечением данных из файлов excel
33. xlwt версии 1.3.0 – а эта штука занимается написанием файлов таблицы excel
Глава 2. Описание разработанной системы
2.1 Структура веб-приложения «Мониторинг цен»
При открытии проекта «monitoring» представляется следующая иерархия (Рис.1):
Рис. 1. Список пакетов проекта
Здесь requirements.txt – файл списка зависимостей. Этот файл создается при выполнении команды pip freeze, которая запускается в
«терминале». Терминал выглядит следующим образом (Рис. 2):
Рис. 2. Терминал для выполнения команд
Командой pip freeze происходит запись в txt-документ списка зависимостей пакетного менеджера pip. PIP – система управления пакетами, эти пакеты используются для установки и управления программными пакетами, написанными на Python. Далее, командой pip install –r requirements.txt устанавливаются зависимости из txt. Фрагмент получившегося файла выглядит следующим образом (Рис. 3):
Рис. 3. Фрагмент файла requirements.txt
Здесь README.md – файл, содержащий инструкции по запуску проекта. Фрагмент получившегося файла выглядит следующим образом (Рис. 4):
Рис. 4. Фрагмент файла README.md
Здесь venv – виртуальная среда. Главная задача питоновской виртуальной среды – создать изолированную среду для проектов Python. А это обозначает, что каждый проект обладает возможностью иметь свои собственные зависимости, которые не зависят от зависимостей другого проекта. Создание виртуального окружения идет по следующим этапам:
1. pip install virtualenv – установка виртуального окружения
2. python –m venv venv – создание виртуального окруженияю. После этого действия должна появиться папка venv
3. cd venv/Scripts/activate – активация виртуального окружения. После этого необходимо выйди из созданной папки командой ../..
4. pip install –r requirements.txt – установка всех зависимостей (библиотек) из документа requirements.txt
5. pip freeze – просмотр установленных библиотек
6. cd app – переход в папку app
7. python manage.py makemigrations – создание базы данных (makemigrations отвечает за создание новых миграций)
8. python manage.py migrate – создание базы данных (migrate отвечает за применение миграций)
9. python manage.py createsuperuser – создание суперпользователя
10. python manage.pu runserver – запуск сервера
Папка venv заполняется автоматически, так что ее содержание описано не будет.
Основная папка приложения - app. manage.py – эта папка также создается автоматически. manage.py является простым интерфейсом для django.setup(). Немного о командах, которые работают при помощи manage.py:
1. python manage.py runserver – эта команда запускает простой веб- сервер для разработки. По умолчанию сервер запускается на 8000 порте. Но все это можно указать и явно
2. python manage.py createsuperuser - эта команда создает суперпользователя
3. python manage.py makemigrations – эта команда создает новые миграции на основе изменений в моделях
4. python manage.py migrate – эта команда синхронизирует состояние БД с текущим состоянием моделей и миграций
Файл manage.py выглядит следующим образом (Рис. 5):