parse_saby/README.md

77 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# About
- Получаем и парсим данные с https://formats.saby.ru/
- Выполняем валидацию данных для БД
- Отправляем данные в БД oracle
- С помощью планировщика повторяем процессы выше.
# Usage
Приложение запускается через **main.py**.
Главный модуль **parse_saby.py** - находит по в html страницы нужные данные, работает не зависимо от других модулей, можно запускать отдельно.
# How it's works
Проект расчитан на запуск в Docker контейнере. Для это есть Dockerfile и docker-compose.yaml. В **Dockerfile** используется подготовленый образ содержащий все необходимое для работы с базой данных Oracle и сам Python. **docker-compose:**
- Запускает _main.py_ с ключом `--first-run` для первого запуска.
- Парамметр _env-file_ прокидывает файл .env сордержащий токен для подключение к Vault.
- Парамметр _environment_ содержит часовой пояс.
## 1. Получение данных с сайта.
C перва запускается скрипт parse_saby.py
```python
result_dict_data = parse_saby.process_reports_parse()
```
Основным модулем для забора нужных данных является bs4 с классом BeautifulSoup.
BeautifulSoup представляет объект html страницы, это позволяет обращаеться по тэгам, что бы достать нужные данные. process_reports_parse() возвращает cписок словарей. Пример:
```python
result_dict_data = [{128513: ('fns', 'Уведомление о налогах для ЕНП', '01.07.22', None, '5.03')}, {132526: ('sfr', 'АДВ-1 Анкета застрахованного лица', '09.01.23', '31.12.34', '2.0')}, {...}]
```
## 2. Предварительный парсинг - parse_data_in_list()
```python
list_data = parse_data_in_list(result_dict_data)
```
Легкий парсиннг преобразуем лист словарей в лист листов. Это нужно для отправки в БД - берутся ключу к ним присваиваеюся значение по индексу из листа.
## 3. Валидация данных
```python
list_data_validated = DataValid.validate_data(list_data)
```
Тут из листа по листу передаем данные в класс DataValid из модуля проекта validation.py. DataValid наследуется от класса BaseModul модуля pydantic.
Сначало парсится дата, вторая дата в списке может быть None.
Потом проверяется соответсвие типов, и может выполняется явное преобразование.
Забираем валидные данные в новый лист.
Класс в рамках цикла пересоздается, для валидации следующего листа.
## 4. Отправка данных в БД
```python
working_database.SimpleDB().data_transfer_in_database(list_data_validated)
```
### 4.1. Инциализация модуля working_database.py, подключение к hvac
_Сервер hvac настрое на работу в тихом режиме, реализуется с помощью: init_oracle_client()_
Тут выполняется сначало подключение к hvac серверу, получение секретов,
необохдимых для подключения к БД `_create_db_pool_from_vault()`. Что бы подключиться к серверу hvac используется секретный токен. Он забирается из переменной окружения, передается при создание контейнера(определенно в docker-compouse.yaml).
### 4.2. Подключение и отправка данных в БД
Метод класса `data_transfer_in_database()` получает данные для отправки в БД.
Данные имеют структуру лист словарей. Выполняется подключение к БД используя пул секретов из шага 4.1.
После чего передаются данные в процедуру P_RK_GOVERNMENT_REPORTS_INSERS.
# Планировщик заданий - scheduler.py
```python
scheduler.launch_the_scheduler()
```
Запускается при вервом запуска main.py с ключом `--first-run` через docker-compose.
Планировщик работает в фоновом режиме, пока не наступит заданое время.
Когда наступает заданое время запукает main.py. Время запуска по умолчанию 6 часов 0 минут.
Время можно изменить например на 9:30 следующим образом:
```python
scheduler.launch_the_scheduler(h=9, m=30)
```