Парсинг Ozon: как исправить ошибку поиска div

    При автоматизированном сборе данных с маркетплейса Ozon разработчики часто сталкиваются с ситуацией, когда код, успешно работавший ранее, внезапно выдаёт ошибку поиска div. Это может быть связано с изменением структуры страницы, введением новых защитных механизмов или динамической подгрузкой контента. В этой статье мы разберём типичные причины сбоя и предложим практические решения.

    Почему возникает ошибка поиска div при парсинге Ozon?

    Основная причина - изменение DOM-структуры страницы. Ozon регулярно обновляет интерфейс, меняя классы, ID или вложенность элементов. Например, контейнер widget-search-result-container может быть переименован или заменён на другой компонент. Также возможны проблемы с загрузкой контента через JavaScript: если Selenium не дождался полной отрисовки страницы, искомый div может отсутствовать.

    Динамическая подгрузка контента

    Современные сайты всё чаще используют lazy loading и AJAX-запросы. Если в коде не предусмотрены явные ожидания (например, WebDriverWait), парсер пытается найти элемент до его появления в DOM. Рекомендуется заменить фиксированные паузы time.sleep() на ожидание конкретных условий.

    Антибот-системы и капча

    Ozon активно применяет защиту от ботов: Cloudflare, анализ поведения пользователя, проверку User-Agent. Selenium с настройками stealth может быть обнаружен, что приводит к подмене контента или показу капчи. В результате ожидаемый div не отображается.

    Как исправить ошибку поиска div в Selenium?

    Ниже приведены проверенные методы решения проблемы.

    1. Используйте явные ожидания (WebDriverWait)

    Вместо scrolldown с фиксированным количеством прокруток применяйте ожидание появления конкретного элемента:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(driver, 10)
    content_with_cards = wait.until(
        EC.presence_of_element_located((By.CLASS_NAME, "widget-search-result-container"))
    )

    Это гарантирует, что код продолжит выполнение только после загрузки нужного блока.

    2. Обновите селекторы и классы

    Проверьте актуальные классы на странице через инструменты разработчика (F12). Ozon мог изменить widget-search-result-container на search-results или другой идентификатор. Используйте универсальные селекторы, например [data-widget="searchResults"].

    3. Добавьте обработку капчи и подмены контента

    Если страница показывает капчу, парсер должен распознать это и либо остановиться, либо применить сервис разгадывания. Проверяйте наличие элементов с классами captcha или error перед основным парсингом.

    4. Используйте API вместо прямого парсинга HTML

    В вашем коде уже есть функция get_product_info, которая обращается к внутреннему API Ozon. Это более стабильный способ получения данных, чем разбор HTML. Для поиска товаров можно попробовать найти соответствующие API-эндпоинты, что снизит зависимость от DOM.

    Проверка работоспособности после исправлений

    После внесения изменений протестируйте код на разных поисковых запросах. Убедитесь, что:

    • Страница загружается полностью (дождитесь окончания всех AJAX-запросов)
    • Селекторы соответствуют текущей структуре Ozon
    • Обработаны исключения (например, NoSuchElementException)

    Также рекомендуется добавить логирование, чтобы отслеживать, на каком этапе происходит сбой.

    Часто задаваемые вопросы