Скрапер и веб-интерфейс для получения и анализа некоторых данных с NASDAQ в соответствии с ТЗ.
Докер-контейнер ожидает, что ему будут переданные следующие переменные окружения:
POSTGRES_HOST
- хост, на котором запущен постгресPOSTGRES_PORT
- порт, на котором запушен постгрес, по умолчанию - 5432POSTGRES_DB
- название базы данныхPOSTGRES_USER
- пользователь, для подключения к БДPOSTGRES_PASSWORD
- пароль, для подключения к БДCONCURRENT_REQUESTS
- максимальное количество параллельных запросов, по умолчанию - 16TICKERS_FILE
- путь к файлуtickers.txt
, по умолчанию -/var/input/tickers.txt
В корне есть файл docker-compose.yml
, который уже содержит все нужные параметры для запуска,
так что можно запустить всё одной командой docker-compose up -d
.
Чтобы применить миграции нужно вызвать docker-compose run --rm scraper ./migrations/apply.sh
, после того, как поднимется постгрес.
После того, как постгрес запущен и миграции применены, нужно запустить скрапер командой docker-compose run --rm scraper
.
В корне есть скрипт run.sh
, который делает всё вышеперечисленное.
После запуска веб-интерфейс будет доступен на порту 8080
.
Чтобы запустить проект без докера, нужно окружение, в котором есть Python 3.6+ с установленными зависимостями из requirements.txt
.
Для запуска миграций нужно вызвать скрипт ./migrations/apply.sh
, который ожидает переменные окружения
POSTGRES_DB
, POSTGRES_HOST
, POSTGRES_USER
, и POSTGRES_PASSWORD
с данными для доступа к постгресу.
Для запуска скрапера нужно вызвать скрипт ./nasdaq_analytics/scraper.sh
со всеми нужными конфигурационными параметрами (перечисленными выше).
Для запуска веб-приложения можно использовать любой сервер с поддержкой WSGI (например gunicorn, uwsgi, etc...).
WSGI-интерфейс называется app
и объявлен в файле ./nasdaq_analytics/web.py
.
После запуска веб-приложения, автоматически сгенерированная документация к REST API будет доступна по пути /swagger-ui
(например: http://localhost:8080/swagger.json).
Эта документация сгенерирована на основе спецификации в формате OpenAPI 3 aka Swagger.
Документацию к коду можно сгенерировать скриптом update_docs.sh
. Уже сгенерированная документация находится по пути docs/_build/html
.
Для миграций используется инструмент под названием Versioning. Причины выбора: простой, написан на чистом SQL.
Комментарии к структуре базы:
- названия акций хранятся в отдельной таблице, на случай если название акции изменится (я гуглил, такое бывает)
- инсайдеры хранятся в отдельной таблице, в качестве идентификатора используется часть url с сайта, которая указывает на этого инсайдера. В данный момент колиизии имён никак не обрабатываются, но, в теории могут.
Для скрапинга используется фреймворк Scrapy, для простоты и ускорения разработки.
Для веб-интерфейса и API используется Flask и небольшой вспомогательный класс, который позволяет автоматически генерировать документацию к API в формате OpenAPI и избежать дублирования кода для веб-интерфейса и API.