Итак, сразу о результате: была разработана информационная система, которая автоматически рассчитывает и обновляет цены на маркетплейсах Ozon и Wildberries. Цель — дать продавцу возможность участвовать в акциях без снижения стоимости товаров ниже рекомендованной розничной цены и без потери прибыли.
Основная проблема клиента заключалась в том, что маркетплейсы могут корректировать цены без участия продавца. Например, при проведении акций платформа снижает стоимость товара, чтобы увеличить продажи в категории. В результате итоговая цена может оказаться ниже минимально допустимой, а прибыль — отрицательной. При этом ручное управление ценами неэффективно: данные обновляются несколько раз в день, и контролировать всё вручную невозможно.
Мы создали модуль, который автоматизирует мониторинг и обновление цен. В основе решения — парсинг данных с карточек товаров и их последующая обработка. Для этого мы подключили внешний инструмент `parser.market`, который извлекает актуальные цены с маркетплейсов и сохраняет их в структурированном виде.
Пример кода, выполняющего аналогичную задачу на Python, выглядит так:
import requests
from bs4 import BeautifulSoup
import pandas as pd
import json
from datetime import datetime
def get_price(url):
response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
soup = BeautifulSoup(response.text, "html.parser")
price_tag = soup.find("span", {"class": "price-value"})
if not price_tag:
return None
price = float(price_tag.text.replace("₽", "").replace(" ", ""))
return price
def collect_prices(product_links):
data = []
for link in product_links:
price = get_price(link)
if price:
data.append({"url": link, "price": price, "timestamp": datetime.now().isoformat()})
return data
# Пример использования
products = [
"https://www.ozon.ru/product/123456",
"https://www.wildberries.ru/catalog/654321/detail.aspx"
]
prices = collect_prices(products)
# Сохранение в Excel и JSON
df = pd.DataFrame(prices)
df.to_excel("prices.xlsx", index=False)
with open("prices.json", "w", encoding="utf-8") as f:
json.dump(prices, f, ensure_ascii=False, indent=2)
Эта часть системы собирает данные о ценах и передаёт их в модуль обновления. В результате клиент получает актуальную информацию о стоимости товаров, может отслеживать изменения в реальном времени и корректировать цены, не нарушая финансовую модель бизнеса.
От внешнего парсера к собственной системе расчета цен
Использование стороннего парсера оказалось временным решением. Главной проблемой была его стоимость — каждый запрос стоил денег, что при большом объёме данных делало процесс экономически неэффективным. Мы создали собственный парсер, полностью исключив зависимость от внешних сервисов.
Вторая сложность — задержка между обновлением цен на маркетплейсе и моментом, когда парсер успевал их получить. Чтобы избежать некорректных данных, мы ввели верхнюю границу цены и настроили автоматическое обновление при изменении акций. Это позволило минимизировать расхождения между реальными и зафиксированными ценами.
Третья проблема заключалась в том, что товары, которых временно нет в наличии, не имеют публичной цены. Для таких случаев система рассчитывает условную «максимальную скидку» на основе анализа исторических данных. Это помогает сохранить корректность модели и предсказуемость пересчёта цен.
Далее мы разработали собственный модуль расчета. Он анализирует текущие цены маркетплейса и данные о рекомендуемой стоимости, после чего вычисляет оптимальную цену для сайта, не допуская ухода ниже минимально допустимого уровня. При проектировании формул учитывались риски зацикливания пересчета и роста цен при повторных обновлениях.
Ниже приведён пример Python-кода, реализующего логику обновления цены в аналогичной системе:
def calculate_site_price(retail_price, wb_price, wb_old_price, upper_bound):
"""
Расчет оптимальной цены товара для сайта на основе данных маркетплейса.
:param retail_price: рекомендованная цена
:param wb_price: текущая цена на маркетплейсе
:param wb_old_price: предыдущая цена на маркетплейсе
:param upper_bound: верхняя граница допустимой надбавки
:return: рассчитанная цена для сайта
"""
if wb_price <= 0:
# Товар отсутствует — передаем 0, на маркетплейсе цена рассчитывается отдельно
return 0
# Если цена маркетплейса в пределах допустимого диапазона — сохраняем текущую
if retail_price <= wb_price <= retail_price + upper_bound:
return wb_price
# Если маркетплейс повысил цену — возвращаем рекомендованную
if wb_price >= wb_old_price:
return retail_price
# Если цена упала — рассчитываем скидку и корректируем
discount_percentage = (wb_old_price - wb_price) / wb_old_price * 100
adjusted_price = retail_price * (1 - discount_percentage / 100)
# Защита от выхода за пределы верхней границы
return min(adjusted_price, retail_price + upper_bound)
Система логирует все вычисления, что позволяет отслеживать историю изменений и своевременно корректировать формулы при изменении правил маркетплейсов. Такой подход обеспечил контроль над ценообразованием и исключил ручное вмешательство в процесс.
Автоматическое обновление цен
Мы создали собственный модуль, который автоматически пересчитывает и обновляет цены, обеспечивая прибыльность продаж при любых изменениях скидок на маркетплейсах. Модуль легко интегрируется в существующий интернет-магазин — достаточно минимальных изменений в коде или структуре базы данных.
После того как парсер завершает обход площадок и собирает актуальные цены, система сравнивает их с рекомендованными розничными значениями, заданными производителем. Если маркетплейс снижает стоимость товара в рамках акции, модуль пересчитывает цену по внутренней формуле и добавляет наценку, чтобы сохранить целевую маржу. Затем обновлённая цена фиксируется в административной панели сайта и автоматически передаётся в маркетплейсы через интерфейс программного обмена данными.
Основой обмена служит интеграционный модуль, разработанный на базе решений компании «Акрит». Он обеспечивает синхронизацию цен, остатков и других данных между платформами и магазином.
Ниже приведён пример кода, реализующего механизм обновления цен и их выгрузку в маркетплейс:
import requests
import pandas as pd
API_URL = "https://api.marketplace.example.com/update_price"
API_TOKEN = "YOUR_TOKEN"
def recalc_price(rrp, current_market_price, margin_rate=0.12):
"""
Пересчет цены товара с учетом акций и заданной наценки.
:param rrp: рекомендованная розничная цена
:param current_market_price: цена на маркетплейсе
:param margin_rate: целевая наценка магазина
:return: новая цена для загрузки
"""
if current_market_price < rrp:
# Цена маркетплейса снижена — пересчитываем с учетом маржи
new_price = max(rrp * (1 + margin_rate), current_market_price)
else:
# Цена выше или равна рекомендованной — сохраняем уровень рентабельности
new_price = current_market_price
return round(new_price, 2)
def update_price_to_marketplace(product_id, price):
"""Отправка новой цены в маркетплейс по API."""
payload = {"product_id": product_id, "price": price}
headers = {"Authorization": f"Bearer {API_TOKEN}"}
response = requests.post(API_URL, json=payload, headers=headers)
return response.status_code == 200
# Пример обработки данных из отчета
data = pd.read_excel("parsed_prices.xlsx")
for _, row in data.iterrows():
new_price = recalc_price(row["rrp"], row["market_price"])
if update_price_to_marketplace(row["product_id"], new_price):
print(f"Цена для {row['product_name']} обновлена до {new_price} ₽")
Такой подход позволил полностью исключить ручное участие в процессе обновления цен. Система стабильно работает в фоновом режиме, выполняя пересчёт несколько раз в день по расписанию, что обеспечивает соответствие цен политике бренда и требованиям маркетплейсов.
Модуль расчета цен и правила его работы
Основой автоматизации стало чёткое определение нижней границы рентабельности — минимальной цены, при которой продажа остаётся прибыльной. Это значение фиксируется как рекомендуемая розничная цена. На него опираются все алгоритмы пересчёта.
Для корректного расчёта наценки важно учитывать, что размер скидки, которую предоставляет маркетплейс, различается по категориям. Поэтому для каждой категории формула пересчёта имеет собственные коэффициенты, основанные на статистике изменений цен.
Базовая формула наценки выглядит так:
import math
# Пример входных данных
wb_old_price = 950 # старая цена на маркетплейсе
wb_price = 900 # текущая цена
retail_price = 1000 # рекомендованная розничная цена
increase = 5 # фиксированная добавка, руб.
# Расчет процента наценки
surcharge_per = (wb_old_price / wb_price) * 100 - 100
# Расчет новой цены с учетом наценки и добавки
new_price_with_surcharge = math.ceil(retail_price * (1 + surcharge_per / 100) + increase)
print(f"Процент наценки: {surcharge_per:.2f}%")
print(f"Новая цена с наценкой: {new_price_with_surcharge} ₽")
Где добавка — это небольшое значение, например 5 рублей, позволяющее гарантировать, что итоговая цена не окажется ниже рекомендованной даже при пересчёте скидок. Верхняя граница диапазона ограничивает рост — если рассчитанная цена превышает рекомендуемую на 10 рублей и более, запускается повторный пересчёт, предотвращающий бесконечное повышение стоимости.
Ниже приведена Python-реализация подобной формулы:
import math
def calc_adjusted_price(retail_price, wb_price, wb_old_price, increase=5, upper_bound=10):
"""
Расчет цены с наценкой и защитой от бесконечного роста.
:param retail_price: рекомендованная розничная цена
:param wb_price: текущая цена на маркетплейсе
:param wb_old_price: предыдущая цена
:param increase: фиксированная добавка к цене, руб.
:param upper_bound: максимальное отклонение от рекомендованной цены, руб.
:return: новая цена для загрузки
"""
if wb_price <= 0 or wb_old_price <= 0:
return retail_price
surcharge_per = (wb_old_price / wb_price) * 100 - 100
new_price = math.ceil(retail_price * (1 + surcharge_per / 100) + increase)
# ограничиваем рост
if new_price > retail_price + upper_bound:
new_price = retail_price + upper_bound
return round(new_price, 2)
Этот модуль используется совместно с системой парсинга и обновления цен, что позволяет не только корректировать цены автоматически, но и избегать зацикливания или избыточных наценок при частых акциях.
Учет особенностей маркетплейсов
Для корректной работы системы важно учитывать динамику обновлений на торговых площадках. Каждый маркетплейс обновляет цены в разное время, и если парсер обращается к сайту вне этих интервалов, возможны искажения данных.
Парсер работает как неавторизованный пользователь, поэтому персональные скидки, которые Ozon или Wildberries показывают авторизованным покупателям, остаются недоступными. Это не ошибка системы — это ограничение самих платформ.
Кроме того, у Wildberries есть функция автоматического участия товаров в акциях. Мы рекомендуем отключать её, иначе товары будут случайным образом попадать в промо-кампании, что сделает планирование цен невозможным. Также важно учитывать, что Wildberries может включать в цену логистические расходы, а Ozon — комиссию площадки.
Настройка временных интервалов
Мы провели мониторинг обновлений и установили периоды, когда площадки изменяют скидки и условия акций. Для конкретного магазина клиента они распределились так: Ozon — 7:00, 13:00 и 17:00; Wildberries — 2:30, 12:30 и 17:30. Система запускает обновление цен именно в эти интервалы, чтобы пересчёт совпадал с обновлениями маркетплейсов и сохранял рентабельность.
Дополнительно были рассчитаны максимальные значения скидок, применяемых платформами. Эти данные позволяют системе повышать цену новых товаров, попадающих в акции, на заранее известный процент, исключая потери прибыли.
Результаты внедрения
После внедрения автоматической системы ценообразования клиент избавился от ручного контроля и снизил время на управление ценами в несколько раз. Цены стабильно удерживаются выше минимально допустимых значений, а участие в акциях маркетплейсов стало безопасным для маржинальности.
Автоматизация ценообразования — это не просто удобство, а способ поддерживать конкурентоспособность и управлять прибылью на высококонкурентных площадках. Практика показала, что системный мониторинг и алгоритмическое обновление цен дают ощутимый прирост эффективности и устойчивости бизнеса.

Отзывы
Написал Иван
Опубликовано в: Генератор изображений FooocusНаписал Денис
Опубликовано в: Настройка модуля HC-06Написал deman696
Опубликовано в: Настройка модуля HC-06Написал Борис
Опубликовано в: Сравнение современных СУБДНаписал Den
Опубликовано в: Редактирование сейвов Mass Effect 1