Парсеры 1.1 Help

Архитектура и принципы работы

Данный документ описывает архитектуру и ключевые принципы работы системы парсинга, основанной на API Яндекса. Основной фокус сделан на масштабируемость, асинхронность, повторное использование кода и соблюдение ограничений на внешние запросы (rate limiting).

Ключевые компоненты

Yandex API клиенты

  • YandexAPI:

    • Базовый абстрактный класс, отвечающий за взаимодействие с API Яндекса.

    • Реализует автоматическое обновление IAM-токенов через OAuth-поток.

    • Токены кэшируются в базе данных, чтобы избежать лишнего обращения к сервису авторизации.

    • Предусмотрен механизм повторного получения токена при его истечении.

  • YandexSearchTextApiV1:

    • Расширяет базовый YandexAPI.

    • Поддерживает как дневной, так и ночной режим работы (определяется по расписанию).

    • Встроенный механизм ограничения частоты запросов (Rate Limiter) с настройкой RPS.

    • Упрощённый интерфейс генерации ссылок для поисковых запросов.

Парсеры

  • YandexSearchLinksParser:

    • Получает HTML-выдачу с поисковой страницы.

    • Извлекает все ссылки из результатов поиска.

    • Выполняет фильтрацию по доменам: исключаются ссылки на ресурсы вроде YouTube, VK и других нерелевантных источников.

    • Сортирует и нормализует ссылки.

  • SiteParser:

    • Обходит полученные сайты и извлекает контактную информацию:

      • Номера телефонов

      • Email-адреса

      • Почтовые адреса

    • Парсит мета-теги (title, description) для последующей аналитики.

    • Работает в асинхронном режиме, обрабатывая сразу несколько сайтов параллельно, что значительно ускоряет сбор информации.

    • Поддерживает отказоустойчивость (например, при ошибке соединения с сайтом парсинг продолжается по другим адресам).

Особенности

RPS (Requests Per Second)

Для обеспечения стабильной работы с API Яндекса реализован контроль частоты запросов.

  • В дневном и ночном режиме применяется ограничение: не более одного запроса в секунду.

  • Это требование помогает избежать получения ошибки 429 Too Many Requests со стороны Яндекса.

  • Параметры ограничения могут быть конфигурируемыми и легко изменяются при масштабировании.

Ссылка для SearchAPI

Формирование запроса к Yandex Search API осуществляется через функцию:

def get_url_v1(self, query_text: str, *, lr: int = 1, l10n: str = "ru", sort_by: str = "rlv", page: int = 0, filter: str = "moderate", maxpassages: int = 4 ) -> str: """ Возвращает URL для запроса к поисковому API """ return (f"https://yandex.ru/search/xml/html?" f"folderid={self.FOLDER_ID}&" f"apikey={self.__api_key_v1}&" f"query={query_text}&" f"page={page}&" f"l10n={l10n}&" f"lr={lr}&" f"sortby={sort_by}&" f"filter={filter}&" f"maxpassages={maxpassages}&" f"groupby=attr%3Dd.mode%3Ddeep.groups-on-page%3D100.docs-in-group%3D1" )

Функция позволяет гибко задавать параметры локализации, фильтрации, пагинации и группировки результатов. Используется при каждом HTTP-запросе для получения выдачи Яндекса.

12 April 2025