diff --git a/README.md b/README.md index 2e32f0e..3da91fd 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ # How it's works Запуск кода осущетсвляется через main.py или test.py -Важно: в test.py не выполняется 4 и 5 шаг. +**Важно:** в test.py не выполняется 4 и 5 шаг. ## 1. Получение данных с сайта. C перва запускается скрипт parse_saby.py @@ -32,11 +32,11 @@ result_dict_data = [{128513: ('fns', 'Уведомление о налогах ``` 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 наследуется от класса BaseModul модуля pydantic. diff --git a/app/main.py b/app/main.py index 338895f..bf2f26d 100644 --- a/app/main.py +++ b/app/main.py @@ -2,6 +2,7 @@ import working_database import parse_saby from validation import DataValid import scheduler +import write_error_to_log print("Запуск main.py") @@ -20,6 +21,8 @@ def parse_data_in_list(dict_data: dict) -> list: result.append([key_id, *value_data]) return result +print("Очиcтка лог файла") +write_error_to_log.clear_to_log() print("1/5. Запуск парсинга сайта") result_dict_data = parse_saby.process_reports_parse() diff --git a/app/parse_saby.py b/app/parse_saby.py index a15b647..7069530 100644 --- a/app/parse_saby.py +++ b/app/parse_saby.py @@ -5,7 +5,7 @@ import requests from bs4 import BeautifulSoup import re - +import write_error_to_log 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) except Exception as e: print(f"Ошибка при обработке отчета {report_title}: {str(e)}") + error_message = f"ERROR-PARSE_SABY: {e} DATA: {report_title}" continue return dict_result diff --git a/app/working_database.py b/app/working_database.py index 8406d1f..c6e3cb8 100644 --- a/app/working_database.py +++ b/app/working_database.py @@ -2,6 +2,7 @@ from os import environ import hvac import hvac.exceptions from oracledb import Error, create_pool, init_oracle_client +import write_error_to_log init_oracle_client() @@ -89,15 +90,25 @@ class SimpleDB: for dict_argument_bd in list_data: print("Отправляемые аргрументы: ", dict_argument_bd) print("Типы данных: ", *map(type, dict_argument_bd.values())) - cursor.callproc('P_RK_GOVERNMENT_REPORTS_INSERS', [ - dict_argument_bd['id'], - dict_argument_bd['organ'], - dict_argument_bd['names'], - dict_argument_bd['date_from'], - dict_argument_bd['date_to'], # Может быть None - dict_argument_bd['ver'], - ]) - except Error as e: - raise Error(f'Ошибка при отправке данных в БД: {e}') + try: + cursor.callproc('P_RK_GOVERNMENT_REPORTS_INSERS', [ + dict_argument_bd['id'], + dict_argument_bd['organ'], + dict_argument_bd['names'], + dict_argument_bd['date_from'], + dict_argument_bd['date_to'], # Может быть None + dict_argument_bd['ver'], + ]) + 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: + error_message = f"ERROR_DB-GLOBAL: {e}" + write_error_to_log.write_to_log(error_message) raise Error(f'Неожиданная ошибка: {e}')