Анализ инструментов парсинга и веб-скрейпинга в рамках разработки арбитражной инвестиционной стратегии на рынке спортивных ставок
Analysis of parsing and web-scraping tools within the developing of an arbitrate investment
strategy on the sports betting market
Вильданов Тимур Эмильевич
Студент 2 курса
Факультет Факультет информационных технологий и анализа больших данных Финансовый университет при Правительстве Российской Федерации
Россия, Москва e-mail: [email protected]
Vildanov Timur Emilievich
Student 2 term
Faculty of Faculty ofInformation Technology and Big Data Analysis Financial University under the Government of the Russian Federation
Russia, Moscow e-mail: [email protected]
Иванов Никита Сергеевич
Студент 2 курса
Факультет Факультет информационных технологий и анализа больших данных Финансовый университет при Правительстве Российской Федерации
Россия, Москва e-mail: [email protected]
Ivanov Nikita Sergeevich
Student 2 term
Faculty of Faculty ofInformation Technology and Big Data Analysis Financial University under the Government of the Russian Federation
Russia, Moscow e-mail: [email protected]
Аннотация.
В данной статье исследованы как популярные, так и новоизобретенные инструменты извлечения данных с сайтов, и их преобразования в пригодный для анализа вид. В работе проведено сравнение библиотек Python, ключевым критерием сравниваемых инструментов является их быстродействие. Полученные результаты будут сгруппированы по сайтам, применяемым инструментам и количеству итераций, а затем представлены в графическом виде. Научная новизна исследования состоит в области применения инструментов для извлечения данных: мы будем получать и преобразовывать слабоструктурированные данные с сайтов букмекерских контор и бирж ставок. Также в статье описаны новые инструменты, которые на данный момент не пользуются большим спросом в сфере парсинга и веб-скрейпинга. В результате исследования получены количественные метрики по всем использованным инструментам и выбраны библиотеки, наиболее подходящие для быстрого извлечения и обработки информации в больших количествах.
Annotation.
This article explores both popular and newly invented tools for extracting data from sites and converting them into a form suitable for analysis. The work compares the Python libraries, the key criterion of the compared tools is their performance. The results will be grouped by sites, tools used and number of iterations, and then presented in graphical view. The scientific novelty of the research lies in the application of data extraction tools: we will receive and transform semi-structured data from the websites of bookmakers and betting exchanges. The article also describes new tools that are currently not in great demand in the field of parsing and web scraping. As a result of the study, quantitative metrics were obtained for all the tools used and the libraries that were most suitable for the rapid extraction and processing of information in large quantities were selected.
Ключевые слова: парсинг, веб-скрэйпинг, HTML, Python, арбитраж.
Key words: Parsing, web scraping, HTML, Python, arbitration.
1. Введение
В наше время люди часто задаются вопросами о наиболее эффективных методах заработка, ключевыми метриками любых инвестиционных стратегий являются доходность и риск. Одной из самых стабильных инвестиционных стратегий является арбитраж - одновременная покупка и продажа финансовых активов, валюты, товаров или производных инструментов на различных рынках с целью получения прибыли из-за разницы в цене одного и того же актива [1, авторский перевод]. Арбитражная стратегия привлекательна тем, что она с минимальной степенью риска приносит стабильный доход, который чаще всего превосходит процентную ставку по банковскому депозиту.
Наиболее широко данная стратегия применяется на валютных и фондовых биржах: арбитражных решений для данных рынков можно найти безграничное количество, что понижает их эффективность, так как биржи переполнены трейд-ботами, которые моментально нормализуют возможные перепады в цене активов, которые и создают возможность для арбитража.
Поэтому было принято решение найти новый рынок для популярной и стабильной стратегии. Наиболее интересным вариантом показался рынок спортивных ставок. По результатам опроса за 2018 год, 4,5% населения России от 18 до 70 лет совершало ставки в 2018 году, 0,6%, т.е. 664 тыс. человек, делали хотя бы одну ставку в неделю [2]. Огромную аудиторию привлекли и президентские выборы в США: объём ставок на данное событие на великобританской бирже ставок Betfair составлял почти $840 млн.[3]. Большинство этих людей делают ставки необоснованно, с огромным элементом риска. Поэтому арбитражная стратегия, предполагающая минимальный уровень риска и стабильный доход, на данном рынке может получить солидную целевую аудиторию.
Однако для реализации данной стратегии требуется обработка огромного количества информации, обычный человек на такое не способен, требуется прибегать к применению программного обеспечения. От ПО требуется максимальное быстродействие, ведь жизненный цикл арбитража на выбранном рынке хоть и больше, чем на фондовых и валютных биржах (где арбитражная возможность появляется на считанные секунды), для анализа десятков сайтов и тысяч коэффициентов в удовлетворительное время потребуются самые быстрые из доступных инструментов.
В связи с этим и было принято решение проанализировать инструменты парсинга и веб-скрейпинга на предмет их быстродействия, чтобы в дальнейшем использовать их для разработки полноценного ПО для поиска и формирования арбитражной стратегии на рынке спортивных ставок.
В рамках данной работы будут выбраны инструменты извлечения и обработки данных, а также сайты, данные которых будут использоваться в исследовании. Далее мы проведем сравнение выбранных библиотек, интерпретируем и визуализируем полученные результаты и определим лучшие инструменты для парсинга сайтов в сфере спортивных ставок.
Несмотря на быстрое развитие технологий, пользователи тратят большую часть времени на поиск и сбор информации в интернете, а не на усвоение и использование найденных материалов. Люди вручную исследуют сайты в поисках нужной информации. Это очень трудоемкая и монотонная работа, требующая много сил и времени.
В связи с этим все чаще применяются веб-парсеры, которые ускоряют и упрощают поиск информации, а также приводят её к единому формату, удобному пользователю.
Тема данного исследования актуальна в связи с нарастанием популярности парсеров. В качестве языка программирования для данной работы был выбран Python, поскольку он является самым популярным и быстроразвивающимся языком программирования. Это простой, но в то же время очень мощный язык программирования, имеющий множество библиотек для решения всех типов задач.
2. Обзор литературы
Тема парсинга и веб-скрейпинга активно обсуждается в научной сфере в связи с тотальным доминированием над другими инструментами для получения информации с веб-сайтов, за исключением разве что программных интерфейсов приложения (API), который, очевидно, есть у бесконечно малого количества источников информации в интернете. Рассмотрим интересные и актуальные статьи, касающиеся темы извлечения данных с сайтов.
Эрдино Узун в своей статье «A Novel Web Scraping Approach Using the Additional Information Obtained From Web Pages» [4] провел сравнение методов скрейпинга для наиболее эффективного по времени получения данных. Автор предлагает инновационный метод UzunExt взамен традиционного создания DOM-дерева и утверждает, что данный метод работает в 60 раз быстрее. Это отличный результат, однако стоит напомнить, что и при стандартном парсинге скорость обработки одного элемента составляет не более 0,05 секунды, в то время как запрос на сайт может занимать 0,2-4 секунды. Так что оптимизация парсинга - это хорошо, но это не та часть, которая наиболее всего нуждается в оптимизации, плюс данный метод не подходит для наших данных.
Авторы статей «Data Extraction and Sentimental Analysis from "Twitter" using Web Scrapping» [5], «Social media analytics: a survey of techniques, tools and platforms» [6], «Web Scraping: Applications and Scraping Tools» [7] рассматривают различные сферы применения веб-скрейпинга и парсинга, в том числе извлечение данных из социальных сетей и онлайн-магазинов. Это нам интересно, потому что на таких сайтах структура данных схожа с нашей, в отличие от различных новостных сайтов, онлайн-журналов, газет и прочего, где в основном содержатся абзацы сплошного текста.
Авторы статьи «Web scraping technologies in an API world» [8] сравнивают комбинированные инструменты для веб-скрейпинга и парсинга написанные для различных популярных языков программирования. В том числе один из наиболее популярных парсеров BeatifulSoup и фрэймворк для скрейпинга на Python - Scrapy.
Сара Саттон и Келли Свикард в статье «Text Mining 101» [9] описывают ключевые методики для обработки текста до, во время и после парсинга, такие, как удаление пунктуации и работа со стоп-словами. Пунктуация нам нужна, так как мы получаем числа в формате float, которые обычно разделяются точкой или запятой, однако методы, описанные в статье, можно применить для работы с названиями коэффициентов.
3. Выбор языка программирования и данных для обработки, описание технических характеристик
В качестве языка программирования для данной работы был выбран Python, поскольку он является самым популярным и быстроразвивающимся языком программирования [10]. Также стоит отметить удобство Python в связи с легкодоступной интеграцией с SQL, средствами визуализации данных, а также с API для различных сайтов.
Для анализа работы инструментов возьмем следующие 8 сайтов:
1. https://www. google.com/ - начальная страница поисковой системы Google, размер страницы составляет
125 Кб.
2. https://en.wikipedia.org/wiki/Perseverance (rover) - страница Википедии о марсоходе Perseverance, размер страницы составляет 358 Кб.
3. https://en.wikipedia.org/wiki/Wikipedia - страница Википедии о Википедии, размер страницы - 921 Кб
4. https://www.marathonbet.ru/su/betting/Football/Russia/Premier+League/Arsenal+Tula+vs+CSKA+Moscow +-+10578239 - страница БК Марафонбет с матчем Арсенал Тула - ЦСКА, 1267 Кб
5. https://mostbet.ru/line/2795570 - страница БК Мостбет с матчем Арсенал Тула - ЦСКА, 427 Кб
6. https://1xstavka.ru/line/Football/225733-Russia-Premier-League/96166499-Arsenal-Tula-CSKA-Moscow/ -страница БК ^Ставка с матчем Арсенал Тула - ЦСКА, 505 Кб
7. https://www.ligastavok.ru/bets/popular/soccer/rossiia-id-350/rossiiskaia-premer-liga-id-5271/arsenal-tula-
tcska-moskva-id-15367024 - страница БК Лига Ставок с матчем Арсенал Тула - ЦСКА, 1066 Кб
8. http://www.ballchockdee.com/euro/football/russia-premier-league/3471432/arsenal-tula-vs-cska-moscow -страница БК SBObet с матчем Арсенал Тула - ЦСКА, 61Кб
Первые три сайта добавлены для исследования корреляции между размером сайта и быстродействием кода библиотек, остальные - практические примеры применения данного исследования. Стоит также отметить, что ссылки на матчи у букмекерских контор действуют недолго, так как во время начала матча ему присваивается новый статус "live" и ссылка меняется.
Наконец, приведем технические характеристики устройства, на котором будут произведены все расчёты:
• Процессор: AMD Ryzen 5 1400 Quad-Core, 3.20 GHz
• Оперативная память: DDR4 16 Gb
• Операционная система: Windows 10 Home
• Python: версия 3.7.3
• IDE: Jupyter Notebook
Визуализация данных будет производиться с помощью следующих библиотек:
• Matplotlib - 3.2.2
• Seaborn - 0.10.1
• Pandas - 1.0.5
4. Сравнение инструментов для получения данных
Для парсинга, сущность и процесс которого мы разберем позже, нам нужны данные в формате HTML или XML. Данные такого типа можно получить многими способами, от загрузки страницы через браузер до получения html-файла при помощи HTTP-запросов 'GET' или 'POST'. Оба запроса имеют схожий функционал, однако GET работает с более очевидными ссылками, которые любой рядовой пользователь может увидеть в браузере, а POST может посылать запрос со скрытыми атрибутами сайта и прикреплять дополнительные файлы. Чаще всего для получения страниц в HTML-формате используется GET, а POST применяется при электронном обмене данными: API, электронные подписи и так далее, происходит передача необходимых ключей и сертификатов.
Оптимальные для нас инструменты - это библиотеки Python, имеющие базовый функционал HTTP-запросов. Для сравнения были выбраны 3 популярные библиотеки:
1. Urllib3 - версия 1.25.9
2. Requests - версия 2.24.0
3. Pycurl - версия 7.43.0.5
4.1. Условия и методика тестирования библиотек
На основе каждой библиотеки создается программа, которая N раз последовательно выполняет следующие действия:
1. Отправляет запрос на сайт
2. Преобразовывает ответ на запрос в сплошной текст
3. Сохраняет полученный результат в переменную
После N итераций программа выводит общее время работы алгоритма в секундах при помощи отдельно заданного класса Timer.
Программа выполняет прогон каждой из библиотек по каждому из сайтов для каждого из возможных значений N: 10, 50 и 150 итераций.
После компиляции программы сравним данные по быстродействию на каждом из сайтов, а также среднее значение скорости для каждого значения N и среднее время библиотеки на один запрос.
4.2. Результаты сравнения библиотек
Результаты работы библиотек были записаны в массив данных при помощи pandas, а затем сгруппированы по сравниваемым библиотекам. На основе полученных данных для каждого количества итераций N было составлено два графика, позволяющих тщательно сравнить инструменты.
Первый график содержит подробные значения по каждому из сайтов и библиотек, на оси абсцисс представлены сайты, на которые мы посылали запрос, на оси ординат - суммарное время на выполнение всех запросов в секундах.
На втором графике изображено среднее суммарное время выполнения запросов для каждой из библиотек, ось абсцисс содержит названия библиотек, ось ординат - среднее суммарное время выполнения запросов в секундах.
Для N=10:
Рисунок 1. Время работы библиотек для каждого сайта, N=10 Рисунок 2. Среднее время работы библиотек, N=10 Для N=50:
Рисунок 3. Время работы библиотек для каждого сайта, N=50 Рисунок 4. Среднее время работы библиотек, N=50
Вопросы студенческой науки Наконец, для N=150:
Library
Рисунок 5. Время работы библиотек для каждого сайта, N=150 Рисунок 6. Среднее время работы библиотек, N=150
Стоит отметить масштабируемость библиотек при N=10 и 50: визуально графики почти не изменились, при увеличении количества итераций время на выполнение операций увеличилось линейно. Изменение в быстродействии pycurl связано с ухудшением производительности на сайте 1 XBet, в остальном данные практически совпадают.
Однако при увеличении количества итераций до 150 производительность некоторых библиотек значительно ухудшилась, что особенно заметно на сайтах с большим объемом слабоструктурированных данных. Заметна негативная динамика в показателях библиотеки urlib3, в то время как requests закрепила своё преимущество с ростом итераций.
Построим график, сравнивающий среднее время каждой библиотеки на один запрос:
requests urlib3 pycurl
Library
Рисунок 7. Среднее время на один запрос
Небольшое преимущество по среднему времени у библиотеки requests, в то время как urlib3 отстает более чем на 0,2 секунды на один запрос: огромная разница для процесса массовой обработки данных. Отметим, что при N=150 значительное преимущество принадлежит также библиотеке requests, очевидно, именно с ней и
следует продолжать работу.
Как видно из гистограммы, библиотека pycurl быстрее чем requests и urllib3, для сайтов, имеющих маленький размер.
4.3. Допущения
Для реализации программ использовалась следующая документация:
• Urllib3 - https://urllib3.readthedocs.io/en/latest/
• Pycurl - http V/pycurl.io/docs/latest/mdex. html
• Requests - https://requests.readthedocs.io/en/master/
В данной работе использовалась базовая реализация алгоритмов согласно приведенной документации, изменение настроек по умолчанию не производилось. Все запросы выполнялись последовательно, никакие методы оптимизации запросов, такие как переиспользование соединения, не применялись.
5. Сравнение инструментов для обработки данных
В рамках третьей главы мы получили данные каждого сайта в виде HTML-страниц, можно приступать непосредственно к парсингу, но для начала следует дать определение парсинга и описать данный процесс в рамках нашей задачи.
5.1. Определение и применение парсинга
Русскоязычные определения парсинга сильно варьируются от источника к источнику, однако принято считать, что парсинг - это процесс сбора данных с последующей их обработкой и анализом. Интересно, но в англоязычных определениях парсинг вовсе не означает сбор данных, а лишь их анализ. Чаще всего под парсингом понимают разбор, связанный с языком, например, разбиение предложения на его синтаксические части.
В программировании парсингом называют анализ и разбор данных на составляющие в формате, наиболее удобном пользователю.
А сбор данных логичнее называть веб-скрейпингом, который иногда может включать себя и элементы парсинга.
Теперь рассмотрим конкретно наш пример применения парсинга. В результате описанной выше работы мы получаем на выход документы в формате HTML, обобщенно страницы данного формата выглядят следующим образом:
Рисунок 8. Структура HTML-документа
Любой HTML документ состоит как минимум из заголовка (<head></head>) и тела документа (<body></body>), внутри данных элементов могут содержать многие другие необязательные составляющие.
Чаще всего при парсинге HTML-страниц стоит задача получить данные из тела документа. Перед нами стоит похожая задача, нам интересны все элементы типа «абзац» (<p></p>) в телах ранее полученных нами документов. Для этого выберем библиотеки для парсинга и обозначим в коде нужные нам элементы.
5.2. Объекты сравнения
Для сравнения были выбраны 6 популярных библиотек:
• Lxml - версия 4.5.2
• BeautifulSoup4 - версия 4.9.1
• Html5lib - версия 1.1
• Pyquery - версия 1.4.3
• Html.parser - стандартная библиотека Python
• Selectolax - версия 0.2.10
Отдельно хочется отметить именно библиотеку Selectolax, относительно новую в рамках программирования - альфа-версия появилась лишь в 2018 году. Данная библиотека ещё не задействовалась в серьёзных исследованиях, посмотрим, как она проявит себя по отношению к популярным Lxml и BeautifulSoup4.
Также отметим, что для библиотеки Lxml существует два метода парсинга: Etree и XPath, в работе мы сравним оба этих метода, использующих разные способы преобразования и поиска информации.
5.3. Условия и методика тестирования библиотек
На основе каждой библиотеки создается программа, которая N раз последовательно выполняет следующие действия:
1. Принимает на вход текст в формате HTML
2. Преобразовывает текст в структурированный объект
3. Выполняет поиск всех тегов «p»
4. Подсчитывает количество тегов «p»
После N итераций программа выводит общее время работы алгоритма.
Программы запускаются для каждого из восьми сайтов, указанных в разделе 2, а также для каждого значения N: 10, 100, а также 500 итераций.
5.4. Результаты сравнения библиотек
Результаты работы парсеров были записаны в массив pandas, попробуем вывести данные по всем сайтам для N = 500 итераций с группировкой по библиотекам:
Library pqparse
шш html5_parse
Ixmletreeparse txml_xpath_parse ■■ bsparse
selectolax parse
■ J- J-
Рисунок 9. Время работы парсеров для каждого сайта, N=500
Очевидно, что данное представление не подходит для эффективного сравнения инструментов парсинга, однако можно сразу сделать вывод об абсолютной непригодности библиотеки html5lib, на парсинг одного из сайтов ушло более 20 минут, что в 4 раза больше, чем у ближайшего преследователя. Это связано с тем, что html5lib полностью написана на языке Python, который считается медленным по сравнению с остальными
языками, такими, как C++ и Java.
Из-за большого количества сайтов и библиотек, а также из-за разброса по значениям скорости данный график нельзя назвать информативным, попробуем другой способ визуализации.
Выведем графики времени парсинга для всех N для двух сайтов: Google и Marathon. Именно эти сайты оказались для парсеров самым простым и сложным для обработки соответственно.
Рисунок 10. Время работы парсеров Google, N=10 Рисунок 11. Время работы парсеров Marathon, N=10
Рисунок 12. Время работы парсеров Google, N=100 Рисунок 13. Время работы парсеров Marathon, N=100
Рисунок 14. Время работы парсеров Google, N=500 Рисунок 15. Время работы парсеров Marathon, N=500
Можно заметить, что разница между графиками незначительная, то есть масштабируемость парсеров при данных значениях количества итерации линейная, то есть при увеличении количества итераций в два раза время работы программы увеличится также в среднем в два раза. Это хорошо, поскольку нам предстоит работать с большим объемом данных.
Далее можно было бы вывести среднее время работы парсеров для каждого из сайтов, однако в этом нет смысла, так как в графиках скорости двух кардинально отличающихся сайтов прослеживается определенная тенденция. Поэтому лучше выведем график среднего времени одной итерации для каждой из библиотек и проинтерпретируем результаты.
htmljarse Ixrrtlelreeparse Ixntlxpathparse bsparse
Library
Рисунок 16. Среднее время одной итерации для каждого парсера
Результаты получились интересными, поскольку одна из самых популярных библиотек для обработки информации BeautifulSoup4 заняла последнее место. Ей уступила только html5lib, которая была ранее исключена из исследования. Долгие годы библиотеки lxml и pyquery занимали лидирующие места в задачах парсинга, однако в нашем исследовании было доказано, что новейшая библиотека Selectolax на порядок превосходит свои более популярные аналоги. Это связано с тем, что Selectolax основан на библиотеке Modest, которая полностью написана на языке программирования C.
Ещё будет интересным отметить, что pyquery показал себя значительно лучше при обработке страниц Википедии, где он обошёл lxml и почти сравнялся с Selectolax. Если бы мы не включили в исследование сайты букмекерских контор, но включили больше объёмных страниц Википедии, то именно pyquery оказался бы фаворитом. Однако, в нашей области исследования selectolax показал абсолютное доминирование по скорости, заняв первое место для каждого сайта и каждого количества итераций.
5.5. Допущения
Для встроенной библиотеки html, для решения конкретно данной задачи отдельно создавался парсер на основе html.parser.HTMLParser, соответственно, для решения иных задач потребуется создание другого парсера, а значит скорость выполнения программы может отличаться.
6. Выводы
В данной статье мы рассмотрели основные библиотеки Python, предназначенные для парсинга и веб-скрейпинга, сравнили скорость выполнения программ, использующих эти библиотеки для сайтов разных размеров с разным слабоструктурированным содержанием, а также для различного количества итераций.
Исходя из полученных данных, можно сделать вывод, что для получения информации с сайта лучше пользоваться библиотекой requests, она обладает неплохой скоростью при любых сценариях. Однако стоит упомянуть, что сравнение происходило при помощи базовых инструментов упомянутых библиотек. При абсолютной оптимизации запросов, pycurl и urllib3 могут оказаться быстрее requests, поскольку requests написана с использованием urllib3.
Для преобразования HTML-файла в структурированный документ, а также поиска информации в полученном документе лучше всего использовать новую бибилотеку Selectolax, для парсинга сайтов со значительным процентом текстового содержимого также подойдёт pyquery. Эти библиотеки не так популярны,
как BeautifulSoup4 и lxml, но имеют серьезное превосходство в скорости в независимости от размера документа.
Однако не стоит забывать о том, что lxml и BeautifulSoup обладают гораздо большим функционалом, чем pyquery и Selectolax, поэтому если вам необходимы серьезные преобразования HTML- или XML-документа, то лучше использовать библиотеку lxml.
Список используемой литературы:
1. https://www.lexico.com/definition/arbitrage
2. https://bookmaker-ratings.ru/news/bukmekerskii-rv-nok-rossii-2018-vse-ob-issledovanii-reitinga-bukmekerov/
3. https://www.forbes.ru/forbeslife/414013-stavki-prodolzhayutsya-kak-protivostoyanie-trampa-i-baydena-ostavlyaet-bukmekerov
4. Uzun E. A novel Web scraping approach using the additional information obtained from Web pages //IEEE Access. - 2020. - Т. 8. - С. 61726-61740.
5. Jain M. et al. Data extraction and sentimental analysis from "twitter" using web scrapping //International Journal of Engineering and Advanced Technology. https://doi. org/10.35940/ijeat. A. - 2019. - Т. 2226. - С. 109-119.
6. Batrinca B., Treleaven P. C. Social media analytics: a survey of techniques, tools and platforms //Ai & Society. - 2015. - Т. 30. - №. 1. - С. 89-116.
7. Priya Matta Web Scraping: Applications and Scraping Tools //International Journal of Advanced Trends in Computer Science and Engineering - 2020. - Т. 9. - №. 5. - С. 8202-8206.
8. Glez-Pena D. et al. Web scraping technologies in an API world //Briefings in bioinformatics. - 2014. - Т. 15. - №. 5. - С. 788-797.
9. Sutton S., Swickard K. Text Mining 101 //The Serials Librarian. - 2020. - Т. 78. - №. 1-4. - С. 3-8.
10. https://spectrum.ieee.org/static/interactive-the-top-programming-languages-2020
11. https://urllib3.readthedocs.io/en/latest/
12. http://pycurl.io/docs/latest/index.html
13. https://requests.readthedocs.io/en/master/
14. https://pvquerv.readthedocs.io/en/latest/#full-documentation
15. https://html5lib.readthedocs.io/en/latest/
16. https://lxml.de/
17. Иванюк В. А., Цвиркун А. Д., Попов В. Ю. Классические подходы к анализу и прогнозированию риска //УПРАВЛЕНИЕ РАЗВИТИЕМ КРУПНОМАСШТАБНЫХ СИСТЕМ MLSD'2016. - 2016. - С. 286-288.
18. Иванюк В. А., Андропов К. Н., Цвиркун А. Д. Методология совокупного прогнозирования активов и их рисков //Фундаментальные исследования. - 2014. - №. 12-5. - С. 1028-1031.
19. Арутюнов А. Л., Иванюк В. А., Цвиркун А. Д. Разработка инструментальных средств прогнозирования в социально-экономических системах //Управление развитием крупномасштабных систем. -2015. - С. 241-293.
20. https://www.crummy.com/software/BeautifulSoup/bs4/doc/
21. https://selectolax.readthedocs.io/en/latest/index.html
22. https://docs.python.org/3/library/html.parser.html