Compare commits
5 Commits
dfb70f63cb
...
ea38d0a6e6
| Author | SHA1 | Date |
|---|---|---|
|
|
ea38d0a6e6 | |
|
|
7579c122ac | |
|
|
a2b7dd5c52 | |
|
|
4169b9a6b9 | |
|
|
bca541a42d |
11
Dockerfile
11
Dockerfile
|
|
@ -25,6 +25,17 @@ COPY ./requirements.txt /code/requirements.txt
|
||||||
COPY ./app /code/app
|
COPY ./app /code/app
|
||||||
|
|
||||||
RUN python3.11 -m pip install --upgrade pip
|
RUN python3.11 -m pip install --upgrade pip
|
||||||
|
RUN python3.11 -m pip cache purge
|
||||||
RUN echo Y | python3.11 -m pip install --no-cache-dir --upgrade -r /code/requirements.txt
|
RUN echo Y | python3.11 -m pip install --no-cache-dir --upgrade -r /code/requirements.txt
|
||||||
|
|
||||||
|
RUN echo "=== Contents of requirements.txt ==="
|
||||||
|
RUN cat /code/requirements.txt
|
||||||
|
RUN echo "=== Python version ==="
|
||||||
|
RUN python3.11 --version
|
||||||
|
RUN echo "=== Installing dependencies ==="
|
||||||
|
RUN python3.11 -m pip install --upgrade pip
|
||||||
|
RUN echo Y | python3.11 -m pip install --no-cache-dir --upgrade -r /code/requirements.txt
|
||||||
|
RUN echo "=== Installed packages ==="
|
||||||
|
RUN python3.11 -m pip list | grep hvac
|
||||||
|
|
||||||
CMD ["python", "main.py"]
|
CMD ["python", "main.py"]
|
||||||
|
|
@ -7,5 +7,11 @@ pipeline {
|
||||||
sh "docker-compose up --force-recreate --build -d parse_saby"
|
sh "docker-compose up --force-recreate --build -d parse_saby"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stage('show logs') {
|
||||||
|
steps {
|
||||||
|
sh "docker-compose logs -f"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
# How it's works
|
# How it's works
|
||||||
Запуск кода осущетсвляется через main.py или test.py
|
Запуск кода осущетсвляется через main.py или test.py
|
||||||
Важно: в test.py не выполняется 4 и 5 шаг.
|
**Важно:** в test.py не выполняется 4 и 5 шаг.
|
||||||
|
|
||||||
## 1. Получение данных с сайта.
|
## 1. Получение данных с сайта.
|
||||||
C перва запускается скрипт parse_saby.py
|
C перва запускается скрипт parse_saby.py
|
||||||
|
|
@ -32,11 +32,11 @@ result_dict_data = [{128513: ('fns', 'Уведомление о налогах
|
||||||
```
|
```
|
||||||
list_data = parse_data_in_list(result_dict_data)
|
list_data = parse_data_in_list(result_dict_data)
|
||||||
```
|
```
|
||||||
Легкий парсиннг, для преобразование, нужное в дальнейшем.
|
Легкий парсиннг для преобразование, нужное в дальнейшем.
|
||||||
|
|
||||||
## 3. validate_data() and validation.py
|
## 3. Валидация данных
|
||||||
```
|
```
|
||||||
list_data_validated = validate_data(list_data)
|
list_data_validated = DataValid.validate_data(list_data)
|
||||||
```
|
```
|
||||||
Тут из листа по листу передаем данные в класс DataValid из модуля validation.py.
|
Тут из листа по листу передаем данные в класс DataValid из модуля validation.py.
|
||||||
DataValid наследуется от класса BaseModul модуля pydantic.
|
DataValid наследуется от класса BaseModul модуля pydantic.
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ import working_database
|
||||||
import parse_saby
|
import parse_saby
|
||||||
from validation import DataValid
|
from validation import DataValid
|
||||||
import scheduler
|
import scheduler
|
||||||
|
import write_error_to_log
|
||||||
|
|
||||||
print("Запуск main.py")
|
print("Запуск main.py")
|
||||||
|
|
||||||
|
|
@ -20,6 +21,8 @@ def parse_data_in_list(dict_data: dict) -> list:
|
||||||
result.append([key_id, *value_data])
|
result.append([key_id, *value_data])
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
print("Очиcтка лог файла")
|
||||||
|
write_error_to_log.clear_to_log()
|
||||||
|
|
||||||
print("1/5. Запуск парсинга сайта")
|
print("1/5. Запуск парсинга сайта")
|
||||||
result_dict_data = parse_saby.process_reports_parse()
|
result_dict_data = parse_saby.process_reports_parse()
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
import requests
|
import requests
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
import re
|
import re
|
||||||
|
import write_error_to_log
|
||||||
|
|
||||||
def parse_html(url: str):
|
def parse_html(url: str):
|
||||||
"""
|
"""
|
||||||
|
|
@ -182,6 +182,7 @@ def process_reports_parse(url_formats = 'https://formats.saby.ru'):
|
||||||
print_report_data(dict_result_title, name_title)
|
print_report_data(dict_result_title, name_title)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Ошибка при обработке отчета {report_title}: {str(e)}")
|
print(f"Ошибка при обработке отчета {report_title}: {str(e)}")
|
||||||
|
error_message = f"ERROR-PARSE_SABY: {e} DATA: {report_title}"
|
||||||
continue
|
continue
|
||||||
return dict_result
|
return dict_result
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ from os import environ
|
||||||
import hvac
|
import hvac
|
||||||
import hvac.exceptions
|
import hvac.exceptions
|
||||||
from oracledb import Error, create_pool, init_oracle_client
|
from oracledb import Error, create_pool, init_oracle_client
|
||||||
|
import write_error_to_log
|
||||||
|
|
||||||
init_oracle_client()
|
init_oracle_client()
|
||||||
|
|
||||||
|
|
@ -89,15 +90,25 @@ class SimpleDB:
|
||||||
for dict_argument_bd in list_data:
|
for dict_argument_bd in list_data:
|
||||||
print("Отправляемые аргрументы: ", dict_argument_bd)
|
print("Отправляемые аргрументы: ", dict_argument_bd)
|
||||||
print("Типы данных: ", *map(type, dict_argument_bd.values()))
|
print("Типы данных: ", *map(type, dict_argument_bd.values()))
|
||||||
cursor.callproc('P_RK_GOVERNMENT_REPORTS_INSERS', [
|
try:
|
||||||
dict_argument_bd['id'],
|
cursor.callproc('P_RK_GOVERNMENT_REPORTS_INSERS', [
|
||||||
dict_argument_bd['organ'],
|
dict_argument_bd['id'],
|
||||||
dict_argument_bd['names'],
|
dict_argument_bd['organ'],
|
||||||
dict_argument_bd['date_from'],
|
dict_argument_bd['names'],
|
||||||
dict_argument_bd['date_to'], # Может быть None
|
dict_argument_bd['date_from'],
|
||||||
dict_argument_bd['ver'],
|
dict_argument_bd['date_to'], # Может быть None
|
||||||
])
|
dict_argument_bd['ver'],
|
||||||
except Error as e:
|
])
|
||||||
raise Error(f'Ошибка при отправке данных в БД: {e}')
|
except Error as e:
|
||||||
|
# Проверка является ли запись дублирующей
|
||||||
|
if 'ORA-00001' in str(e): continue
|
||||||
|
# В остальных случаях запись ошибки и пропуск данных.
|
||||||
|
else:
|
||||||
|
error_message = f"ERROR_DB-WRITE: {e} DATA: {dict_argument_bd}"
|
||||||
|
# Запись логов
|
||||||
|
write_error_to_log.write_to_log(error_message)
|
||||||
|
continue
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
error_message = f"ERROR_DB-GLOBAL: {e}"
|
||||||
|
write_error_to_log.write_to_log(error_message)
|
||||||
raise Error(f'Неожиданная ошибка: {e}')
|
raise Error(f'Неожиданная ошибка: {e}')
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
import datetime
|
||||||
|
import os
|
||||||
|
|
||||||
|
TIMESTAMP = datetime.datetime.now().strftime("%d-%m-%Y %H:%M:%S")
|
||||||
|
LOG_FILE = "error_log.txt"
|
||||||
|
|
||||||
|
def write_to_log(error_message, log_file=LOG_FILE):
|
||||||
|
"""
|
||||||
|
Записывает ошибку в лог-файл с временной меткой
|
||||||
|
"""
|
||||||
|
with open(log_file, 'a', encoding='utf-8') as f:
|
||||||
|
f.write(f"[{TIMESTAMP}] {error_message}\n")
|
||||||
|
|
||||||
|
def clear_to_log(log_file=LOG_FILE):
|
||||||
|
"""
|
||||||
|
Очищает лог-файл и записывает новую шапку
|
||||||
|
"""
|
||||||
|
with open(log_file, 'w', encoding='utf-8') as f:
|
||||||
|
f.write(f'=== Лог ошибок создан в {TIMESTAMP} ===\n\n')
|
||||||
|
|
@ -2,7 +2,7 @@ version: "3.8"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
parse_saby:
|
parse_saby:
|
||||||
image: git.dataekb.ru/sadikov/parse_saby/parse_saby_main:latest
|
# image: git.dataekb.ru/sadikov/parse_saby/parse_saby_main:latest
|
||||||
container_name: parse_saby
|
container_name: parse_saby
|
||||||
build: .
|
build: .
|
||||||
volumes:
|
volumes:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue