66 lines
3.4 KiB
Python
66 lines
3.4 KiB
Python
# [FILE] src/core/settings.py
|
||
# [REFACTORING_NOTE] Этот файл заменяет старый src/config.py, используя Pydantic.
|
||
# ANCHOR: Configuration_Module
|
||
# Семантика: Этот модуль является единственным источником истины для всех
|
||
# конфигурационных параметров приложения. Использует Pydantic для типизации и валидации.
|
||
|
||
from pathlib import Path
|
||
from pydantic import BaseModel, Field
|
||
|
||
class ScraperSelectors(BaseModel):
|
||
"""
|
||
[CONTRACT]
|
||
@description: Определяет CSS-селекторы для парсинга как строгий, типизированный контракт.
|
||
@invariant: Все поля являются обязательными строками.
|
||
"""
|
||
# [CONFIG] Используем Field с alias, чтобы Pydantic мог инициализировать
|
||
# модель из словаря с ключами в верхнем регистре, как было раньше.
|
||
catalog_product_link: str = Field(..., alias='CATALOG_PRODUCT_LINK')
|
||
variant_list_item: str = Field(..., alias='VARIANT_LIST_ITEM')
|
||
product_page_name: str = Field(..., alias='PRODUCT_PAGE_NAME')
|
||
active_volume: str = Field(..., alias='ACTIVE_VOLUME')
|
||
price_block: str = Field(..., alias='PRICE_BLOCK')
|
||
|
||
class Settings(BaseModel):
|
||
"""
|
||
[MAIN-CONTRACT]
|
||
@description: Главный класс конфигурации приложения. Собирает все настройки в одном месте.
|
||
"""
|
||
# [CONFIG] Основные настройки парсера
|
||
base_url: str = 'https://elixirpeptide.ru'
|
||
catalog_url: str = 'https://elixirpeptide.ru/catalog/'
|
||
headers: dict = {
|
||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
|
||
}
|
||
|
||
# [CONFIG] Настройки вывода
|
||
output_dir: Path = Path('price_data_final')
|
||
save_to_csv: bool = True
|
||
save_to_db: bool = True
|
||
|
||
# [CONFIG] Настройки логирования
|
||
log_to_db: bool = True
|
||
|
||
# [CONFIG] Вложенная модель с селекторами
|
||
# Мы инициализируем ее прямо здесь, передавая словарь со значениями.
|
||
selectors: ScraperSelectors = ScraperSelectors(
|
||
CATALOG_PRODUCT_LINK='.product-card h4 a.product-link',
|
||
VARIANT_LIST_ITEM='.product-version-select li',
|
||
PRODUCT_PAGE_NAME='h1.product-h1',
|
||
ACTIVE_VOLUME='.product-version-select li.active',
|
||
PRICE_BLOCK='.product-sale-box .price span',
|
||
)
|
||
|
||
@property
|
||
def db_path(self) -> Path:
|
||
"""
|
||
[HELPER] Вычисляемое свойство для пути к базе данных.
|
||
Гарантирует, что путь всегда будет актуальным, если изменится output_dir.
|
||
"""
|
||
return self.output_dir / 'parser_data.db'
|
||
|
||
# [SINGLETON] Создаем единственный экземпляр настроек, который будет использоваться
|
||
# во всем приложении. Это стандартная практика для работы с конфигурацией.
|
||
settings = Settings()
|
||
|
||
# [REFACTORING_COMPLETE] Этот модуль готов к использованию. |