Архитектура и принципы работы
Данная статья описывает ключевые компоненты архитектуры проекта, а также принципы работы, лежащие в основе обработки запросов, парсинга данных и решения капчи. Проект ориентирован на асинхронную обработку запросов и высокую производительность. Архитектура использует современные библиотеки и подходы для создания надежной и масштабируемой системы, обеспечивающей автоматический сбор и обработку данных с различных источников, таких как ФНС России.
Ключевые компоненты
aiohttp
Роль: Взаимодействие с API ФНС.
Особенности реализации:
Клиент с сессиями (
ClientSession): Использование сессий для упрощения и ускорения запросов.Ограничение RPS: Использование
Semaphoreдля ограничения количества запросов в секунду (Rate Limit).Таймауты и повторные попытки при ошибках: Реализация механизма повторных попыток с учетом таймаутов, чтобы обеспечить устойчивость работы при нестабильных соединениях.
Пакетная обработка запросов через
asyncio.gather: Это позволяет эффективно параллелить запросы, снижая время ожидания ответа.
OpenCV + TensorFlow
Капча-солвер:
Модель с точностью 68% (.keras формат): Используется для распознавания капчи.
Предобработка изображений:
Бинаризация (
THRESH_BINARY): Преобразование изображения в черно-белое для улучшения качества обработки.Удаление шумов (
fastNlMeansDenoising): Очищает изображение от шума для более точного распознавания.Контурный анализ (
findContours): Находит контуры на изображении для выделения текста.
Распознавание посимвольно через CNN: Модели сверточных нейронных сетей для точного распознавания символов в капче.
Asyncio
Паттерны использования:
Асинхронные цепочки запросов (поиск → капча → парсинг): Позволяют эффективно обрабатывать несколько этапов запросов и операций одновременно.
Фоновые задачи через
asyncio.create_task: Обработка задач в фоновом режиме для улучшения производительности и многозадачности.Координация через:
Semaphore: Ограничение параллельных запросов, чтобы не превышать лимиты сервера.asyncio.gather: Позволяет параллельно выполнять несколько асинхронных операций, минимизируя время ожидания.asyncio.wait: Управление таймаутами для операций, чтобы избежать зависаний или долгих ожиданий.
Описание классов
CaptchaSolver
Назначение: Решение капчи с помощью ML-модели (точность 68%).
Методы:
solve() -> str: Основной метод распознавания текста капчи, который сначала обрабатывает изображение через пороговую обработку, удаляет шумы и анализирует контуры, а затем распознает символы с помощью модели.
NalogParserApi
Назначение: Базовый клиент API ФНС с обработкой капчи.
Методы:
_solve_captcha() -> str: Получение и распознавание капчи с использованием модели._get_search_id() -> str: Запрос ID поиска для начала парсинга._try_get_search_id_through_captcha() -> str: Повторная попытка получения ID поиска в случае ошибки капчи.
NalogParser
Назначение: Основной парсер данных ФНС.
Методы:
search(query: str) -> list[SearchResult]: Поиск организаций по запросу, который обрабатывается через API ФНС.__try_search(search_id: str): Обработка ошибок запроса, если при попытке поиска произошли сбои.__search(search_id: str): Получение результатов поиска для дальнейшего анализа и обработки.