Парсинг каталога Wildberries на Python: сбор категорий и товаров

    В этой статье мы разберём, как написать парсер для сбора данных с Wildberries. Вы узнаете, как получать список категорий, обходить их, извлекать информацию о товарах и сохранять результаты в базу данных PostgreSQL. Код написан на Python с использованием библиотек requests, aiohttp, asyncio и asyncpg.

    Проблема: категории собираются, но товары не приходят

    Часто при объединении кода для сбора категорий и данных по одной ссылке возникает ошибка: товары на странице отсутствуют. Это связано с тем, что для каждой категории Wildberries использует уникальные параметры shard и query. Если их не передать правильно, сервер возвращает пустой ответ. В нашем решении мы сначала получаем все категории, а затем для каждой вызываем асинхронный сбор страниц.

    Структура парсера Wildberries

    Получение списка категорий

    Функция get_catalogs_wb() загружает JSON-файл с главного сервера Wildberries. В нём содержится иерархия разделов. Мы рекурсивно обходим дочерние элементы и извлекаем название, URL, shard и query. Эти данные сохраняются в список для дальнейшей обработки. Если сервер вернул пустой ответ или ошибку, функция возвращает пустой список.

    Асинхронный сбор товаров из категории

    Функция fetch_all_pages() последовательно запрашивает страницы категории, пока не встретит пустой ответ. Для каждого запроса используется aiohttp. Данные с каждой страницы обрабатываются в prepare_items(), где извлекаются ID, бренд, название, отзывы, рейтинг, цена и цена со скидкой. Все товары собираются в один список.

    Сохранение в базу данных PostgreSQL

    Функция save_to_database() создаёт таблицу products (если её нет) и вставляет записи. Используется конструкция ON CONFLICT для обновления существующих товаров по уникальному ID. Это позволяет избежать дублирования при повторном запуске парсера.

    Ключевые моменты для успешного парсинга

    • Правильные заголовки: В запросах обязательно указывайте User-Agent и Accept-Language, иначе Wildberries может блокировать подключение.
    • Обработка ошибок: Используйте повторные попытки с экспоненциальной задержкой (функция get_with_retries). Это снижает риск сбоя при временных проблемах сети.
    • Асинхронность: Для сбора данных из многих категорий применяется asyncio. Это ускоряет процесс в несколько раз по сравнению с синхронными запросами.
    • Логирование: Все шаги записываются в файл и выводятся в консоль. Это помогает отслеживать ошибки и понимать, на каком этапе произошёл сбой.

    Пример работы программы

    После запуска asyncio.run(main()) программа выводит в консоль название каждой категории, количество собранных товаров и примеры первых пяти записей. В конце отображается общее время выполнения и суммарное количество товаров. Все данные сохраняются в таблицу PostgreSQL.

    Возможные проблемы и их решение

    Пустой ответ от API

    Если сервер возвращает пустой JSON или статус 404, проверьте правильность параметров shard и query. Иногда Wildberries меняет структуру URL. Рекомендуется обновлять ссылки раз в несколько месяцев.

    Блокировка по IP

    При большом количестве запросов Wildberries может временно заблокировать IP. Используйте прокси или увеличивайте задержку между запросами. В нашем коде для каждой страницы задержка не предусмотрена, но вы можете добавить await asyncio.sleep(1) в цикл fetch_all_pages.

    Ошибки подключения к базе данных

    Убедитесь, что PostgreSQL запущен, а параметры подключения (пользователь, пароль, хост, порт) указаны верно. Если база находится на удалённом сервере, проверьте настройки сетевого доступа.

    Заключение

    Представленный код позволяет автоматизировать сбор данных с Wildberries: от получения списка категорий до сохранения товаров в базу. Он устойчив к ошибкам и легко адаптируется под новые требования. Используйте его как основу для своего парсера или дорабатывайте под конкретные задачи.

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