Парсинг 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)
Также рекомендуется добавить логирование, чтобы отслеживать, на каком этапе происходит сбой.