Парсинг каталога 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: от получения списка категорий до сохранения товаров в базу. Он устойчив к ошибкам и легко адаптируется под новые требования. Используйте его как основу для своего парсера или дорабатывайте под конкретные задачи.