Изменение READMY и добавления часового пояса в docker-compose
parent
1bc066eace
commit
67a5d8f452
|
|
@ -1,7 +1,7 @@
|
|||
# Наследуем от Oracle образа и добавляем Python
|
||||
FROM proxy.docker.dataekb.ru/local_cache/oracleclient_docker:stable
|
||||
|
||||
# отключает буферизацию вывода Python.
|
||||
# Отключает буферизацию вывода Python.
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
|
||||
EXPOSE 8000
|
||||
|
|
|
|||
56
README.md
56
README.md
|
|
@ -2,44 +2,41 @@
|
|||
- Получаем и парсим данные с https://formats.saby.ru/
|
||||
- Выполняем валидацию данных для БД
|
||||
- Отправляем данные в БД oracle
|
||||
- Планировщик настроенный на определеное время. Повторящий все процессы описанные в About сверху вниз.
|
||||
- С помощью планировщика повторяем процессы выше.
|
||||
|
||||
# Usage
|
||||
**Боевой** запуск через **main.py**
|
||||
**Тестовый** запуск чере **test.py**. В test.py не выполняется подключение к БД,
|
||||
выполяется лишь подготовка данных. Благодоря этому **не имеет значение где запщуен код**.
|
||||
Можно полностью отследить процесс парсинга и валидации.
|
||||
Приложение запускается через **main.py**.
|
||||
Главный модуль **parse_saby.py** - находит по в html страницы нужные данные, работает не зависимо от других модулей, можно запускать отдельно.
|
||||
|
||||
|
||||
# How it's works
|
||||
Запуск кода осущетсвляется через main.py или test.py
|
||||
**Важно:** в test.py не выполняется 4 и 5 шаг.
|
||||
Проект расчитан на запуск в 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 страницы, это позволяет обращаеться по тэгам,
|
||||
что бы достать нужные данные. Модуль возвращает cписок словарей. Пример:
|
||||
```
|
||||
result_dict_data = [{128513: ('fns', 'Уведомление о налогах для ЕНП', '01.07.22', None, '5.03')},
|
||||
{132526: ('sfr', 'АДВ-1 Анкета застрахованного лица', '09.01.23', '31.12.34', '2.0')},
|
||||
{...}]
|
||||
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()
|
||||
```
|
||||
## 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.
|
||||
Тут из листа по листу передаем данные в класс DataValid из модуля проекта validation.py. DataValid наследуется от класса BaseModul модуля pydantic.
|
||||
Сначало парсится дата, вторая дата в списке может быть None.
|
||||
|
||||
Потом проверяется соответсвие типов, и может выполняется явное преобразование.
|
||||
|
|
@ -47,30 +44,31 @@ DataValid наследуется от класса BaseModul модуля pydant
|
|||
Класс в рамках цикла пересоздается, для валидации следующего листа.
|
||||
|
||||
## 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).
|
||||
необохдимых для подключения к БД `_create_db_pool_from_vault()`. Что бы подключиться к серверу hvac используется секретный токен. Он забирается из переменной окружения, передается при создание контейнера(определенно в docker-compouse.yaml).
|
||||
|
||||
### 4.2. Подключение и отправка данных в БД
|
||||
Метод класса ```data_transfer_in_database()``` получает данные для отправки в БД.
|
||||
Метод класса `data_transfer_in_database()` получает данные для отправки в БД.
|
||||
Данные имеют структуру лист словарей. Выполняется подключение к БД используя пул секретов из шага 4.1.
|
||||
После чего передаются данные в процедуру P_RK_GOVERNMENT_REPORTS_INSERS.
|
||||
|
||||
## 5. Планировщик заданий.
|
||||
```
|
||||
# Планировщик заданий - 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)
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -9,11 +9,11 @@ import sys
|
|||
def parse_data_in_list(dict_data: dict) -> list:
|
||||
"""
|
||||
argument:
|
||||
[{128513: ('fns', 'Уведомление о налогах для ЕНП', '01.07.22', None, '5.03')},
|
||||
{...}]
|
||||
[{128513: ('fns', 'Уведомление о налогах для ЕНП', '01.07.22', None, '5.03'),
|
||||
...}]
|
||||
return:
|
||||
[[128513, 'fns', 'Уведомление о налогах для ЕНП', '01.07.22', None, '5.03'],
|
||||
[...]]
|
||||
...]]
|
||||
"""
|
||||
result = []
|
||||
for key_id, value_data in dict_data.items():
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ services:
|
|||
parse_saby:
|
||||
build: .
|
||||
command: python ./main.py --first-run
|
||||
volumes:
|
||||
- "/etc/timezone:/etc/timezone:ro"
|
||||
- "/etc/localtime:/etc/localtime:ro"
|
||||
environment:
|
||||
- TZ=Europe/Yekaterinburg
|
||||
env_file:
|
||||
- .env
|
||||
Loading…
Reference in New Issue