-
Notifications
You must be signed in to change notification settings - Fork 0
www.kant.ru Парсинг карточек товара. Синхронизация с сохраненными данными: динамика ценообразования и аналитика продаж.
bonifazy/kant
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
kant/ -- пакет для парсинга, хранения, синхронизации и выгрузки данных карточек описания товаров для маркетплейсов с сайта www.kant.ru категории товаров 'беговая обувь' 4 оффлайн магазинов в г. Москва. Каждая позиция товара хранит описание (общую характеристику товара), стоимость и наличие всех размеров этой позиции в каждом магазине. В settings.BRANDS_URLS находятся ссылки для парсинга продуктов. Методом Main.update_products_table() с помощью BRANDS_URLS формируется базовый каркас описания каждого товара в таблицу 'products'. Дальнейшая работа проверки ценообразования и актуальность остатков размеров каждой модели, а также обновлению этих параметров, начинается с запроса таблицы 'products'. Основные графы работы: 'code'-- уникальный код (id) товара, 'url'-- прямая ссылок на карточку каждого товара из этой таблицы. По найденной прямой ссылке 'url' открывается полная карточка товара. Main.update_prices_table() выгружает каждую новую измененную стоимость товара в таблицу 'prices', не затирая предыдущее значение стоимости, а повышая значение колонки 'рейтинг' этого товара (этого кода товара). Таким образом, актуальная стоимость находится в строке с максимальным рейтингом, среди всех строк стоимостей конкретного товара. 'Рейтинг': значение уровня обновления и доступности товара. Изначально, значение в settings.RATING: 1. При этом значении в таблице 'products' находятся только товары в наличии. Это же значения записывается, как начальное в таблицах 'prices' и во всех 'instock_...'- таблицах. Значение 0 для товаров, которых уже нет в наличии (если было обычное состояние: 1). Значение > 1 устанавливается для товаров в таблицах 'prices' и 'instock_nagornaya',у которых либо обновилась стоимость, либо обновился остаток по конкретному товару конкретного размера. Соответственно, строка с актуальной стоимостью и состоянием склада (смена количества штук по каждому размеру товара на складе), всегда имеет максимальный рейтинг у данного товара. В таблице 'products' графа 'rating' изменяется между значениями: 1 и 0, перезаписывая эти значения, не создавая новые строки. В таблицах 'prices' и всех 'instock_...' таблицах, 'rating' изменяется от 1 и далее +1, каждый раз создавая новые строки с обновленным (увеличенным на 1) рейтингом нового состояния продукта, в зависимости от ситуации по актуальному наличию конкретного остатка размера продукта, даже если конкретный размер выбыл со склада полностью (в таком случае, в базу данных записывается строка с размером, количеством 0 шт, и все же увеличенным рейтингом +1, как самый актуальный). 'main.py'-- точка входа проекта. С помощью этого модуля при пустой базе данных 'db.sqlite3' создаются записи в 'products', 'prices', 'instock_...'- таблицах. Если данные уже внесены, последующий запуск manager(True, True, True) обновит данные при непустых соответствующих таблицах. Таблица 'products': Общая карточка товара, его наименование, описание, характеристика товара, дата внесения этой информации и текущий рейтинг, информирующий об актуальности нахождения товара в наличии и в продаже на момент последнего запуска программы (описание рейтинга см выше, параграф 'Рейтинг'). Таблица формируется за счет запуска метода Main.update_products_table() В проекте реальзована функция частичной загрузки и частичной проверки данных по конкретному бренду, не затрагивая консистентность данных остальной части базы данных, что является удобным для поддержания, изменения, дополнения и тестирования проекта на этапе разработки (см далее параграф 'Main.brand') Метод Main.update_products_table() сначала парсит главные ссылки общей группы товаров (либо/ и ссылки на товары конкретных брендов этой же категории (подробнее settings.BRANDS_URLS)), для получения индивидуальной ссылки на каждый товар путем внутреннего вызова Parser.parse_main() Параметры: urls-- список ссылок на товары, для нахождения прямых ссылок на каждый конкретный товар; finish-- максимальное число листания пагинатора, от 1 до 25стр, обычно хватает. При дублировании данных, парсер понимает прием ссылок- дублей, отключается, не используя следующие страницы пагинации в связи с нецелесообразностью дальнейшего парсинга, формируя уникальный список прямых ссылок на товар; Вывод: список прямых ссылок на товар; Затем, по каждой индивидуальной ссылке загружается карточка товара с описанием и дополнительными характеристиками товара методом Parser.parse_details() Параметры: urls-- список прямых ссылок на каждый конктретный товар. Вывод: код товара, наименование и полная характеристика продукта, время создания, рейтинг (см выше, 'рейтинг'). При каждом последующем запуске update_products_table(), добавляется новый товар, либо ничего не меняется, если нового нет, либо изменяется только рейтинг, с 1 на 0 (для выбывших товаров), с 0 на 1, у отсутствуещего товара, если товар снова стал в наличии, не изменяя количество записей, в целом. Метод Main.update_prices_table() испульзуя 'url' каждого товара из 'products', парсит карточку товара, смотрит только стоимость. Если стоимость обновилась, в таблицу 'prices' записывается новая строка с кодом товара, стоимостью, временем обновления и новым рейтингом (старый рейт+ 1). Актуальная стоимость товара всегда доступна в строке по коду товара с максимальным рейтингом. Если товара нет в наличии, стоимость меняется на 0 руб, рейтинг все так же увеличивается. Внутри используется Parser.parse_price() Параметры: codes_urls-- список пар кодов и ссылок для парсинга; Вывод: типа codes_prices-- пары код + стоимость, т.е те же коды, но уже с их стоимостью товара; Метод Main.update_instock_table() загружает из ссылки в settings.AVAILABLE код товара из 'products', парсит небольшой (по объему DOM) html, находит, сравнивает количество товара в наличии по каждому размеру. Если наличие изменилось (появился новый размер, по бывшему размеру увеличилось/ уменьшилось количество товара, либо данный размер полностью выбыл из магазина), в эту рабочую таблицу 'instock_...' записывается новое состояние размера товара: код товара, его размер, количество товара в этом размере, время обновления и рейтинг, увеличенным на 1 (см ранее, 'Рейтинг'). Каждая новая запись увеличивает значение рейтинга. Внутри используется Parser.parse_available() Параметры: codes-- пары кодов и уникальных кодов с их же url для парсинга размеров и наличия; Вывод: список состояния наличия: код, размер, наличие по нему, время обновления, рейтинг; Метод Main.export() выгружает карточки описания товаров в популярные форматы (json, xml, csv) для API маркетплейсов и товароучетных сервисов. Параметры: to-- способ сериализации данных: json, xml или csv. По умолчанию-- 'csv' Вывод: в файл с именем 'card' в выбранном формате параметра 'to' 'Main.brand' -- обертка property для тестирования и дополнения новой функциональности за счет работы не со всей базой данных, а только с ее частью (определенного бренда), не затрагивая функциональность и консистентность данных остальной части БД. Название бренда можно задавать при инициализации, например: page = Main('Adidas') или page = Main(brand='Adidas') Также можно определить бренд позднее, уже в атрибуте класса, перед вызовом методов обновления таблиц: page = Main() page.brand = 'Adidas' В отличие от page = Main() без присвоения классу атрибута- бренда, когда программа работает со всей бд, проверяя и синхронизируя всю базу, вызов с присвоением бренда page = Main('Adidas') работает с таблицами только этого бренда. 'Main.manager()' -- Настроенная точка входа, которую можно запускать из командной строки с параметрами, к примеру: (env) laptop:kant user$ ./main.py products Вызов запустит проверку синхронизации www.kant.ru с таблицей 'products' базы данных. Рекомендуется запускать 1 раз в день, проверка наличия и отсутствия товара. (env) laptop:kant user$ ./main.py prices -- запускает проверку, синхронизируя kant.ru с таблицей 'prices'; рекомендуется запускать 1- 2 раза день для обновления и актуализации стоимости товара (обновление сайта kant.ru происходит обычно в 10:00 или в 12:00, UTC +3 (Moscow)) (env) laptop:kant user$ ./main.py instock -- запускает проверку наличия каждого размера каждого товара, синхронизирует kant.ru с таблицами 'instock_nagornaya', 'instock_timiryazevskaya', 'instock_altufevo', 'instock_teply_stan'; рекомендуемая частота обновления: 2- 4 раза в день. (env) laptop:kant user$ ./main.py export json -- выгружает карточку товаров с характеристикой и стоимостью в формат "csv". Дополнительно, в форматы "xml" и "json" выгружается размерный ряд и наличие товара по каждому оффлайн- магазину в Москве. Экспортируется в файл с именем 'card' и расширением, соответствующим формату экспорта. Путь к файлам указан в settings.py: JSON_FILE, CSV_FILE, XML_FILE Формат по умолчанию: 'csv'. Для экспорта в 'csv' достаточно команды: ./main.py export * Актуальная версия доступна в 'main' git- ветке проекта. * Info: dkmarchuk@gmail.com
About
www.kant.ru Парсинг карточек товара. Синхронизация с сохраненными данными: динамика ценообразования и аналитика продаж.
Topics
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published