Проблема ручного импорта
Большинство владельцев интернет-магазинов еженедельно тратят часы на одно и то же: загружают прайс-лист поставщика, находят изменения, обновляют товары в админпанели. Иногда это 50 товаров. Иногда — 5 000.
Это как раз тот тип повторяющихся задач, которые стоит автоматизировать. Настроил один раз — и оно работает самостоятельно.
Что нужно знать сначала
Прежде чем что-то строить, дайте ответы на эти вопросы:
- В каком формате ваш поставщик предоставляет данные? — CSV, Excel, XML, JSON API, FTP?
- Как часто они обновляются? — Ежедневно? Еженедельно? В реальном времени?
- Что нужно обновлять? — Только цены? Уровень запасов? Новые товары? Описание?
- Как вы сопоставляете товары? — SKU? Штрих-код? Название товара?
Ответы определяют, что именно вам нужно создать.
Случай 1: Поставщик предоставляет файл CSV/Excel
Это самый распространенный случай. Поставщик присылает файл по электронной почте, или вы загружаете его с его портала.
Шаг 1: Разбор файла
import pandas as pd
df = pd.read_csv("supplier_prices.csv", encoding="utf-8")
# или для Excel:
# df = pd.read_excel("supplier_prices.xlsx")
print(df.columns.tolist())
# ['SKU', 'Name', 'Price', 'Stock', 'Category']
Шаг 2: Сопоставление с товарами вашего магазина
Ваш магазин имеет собственные ID товаров. Нужно сопоставить SKU поставщика с вашими внутренними ID:
import sqlite3
# Создаем словарь: supplier_sku -> your_product_id
conn = sqlite3.connect("your_store.db") # или используйте БД WooCommerce/OpenCart
sku_map = dict(conn.execute(
"SELECT sku, product_id FROM products"
).fetchall())
for _, row in df.iterrows():
product_id = sku_map.get(row["SKU"])
if product_id:
update_product(product_id, price=row["Price"], stock=row["Stock"])
else:
# Новый товар от поставщика — создаем или записываем для ручной проверки
log_new_product(row)
Шаг 3: Обновление через API или базу данных
WooCommerce REST API (рекомендуется — не нужен прямой доступ к БД):
import requests
def update_woo_product(product_id, price, stock, api_url, key, secret):
r = requests.put(
f"{api_url}/wp-json/wc/v3/products/{product_id}",
auth=(key, secret),
json={
"regular_price": str(price),
"stock_quantity": int(stock),
"manage_stock": True,
}
)
return r.json()
OpenCart — проще всего через прямое обновление базы данных:
import pymysql
def update_opencart_price(product_id, price, stock, db):
with db.cursor() as cur:
cur.execute(
"UPDATE oc_product SET price = %s, quantity = %s WHERE product_id = %s",
(price, stock, product_id)
)
db.commit()
Случай 2: Поставщик предоставляет XML-фид
Распространено среди поставщиков автозапчастей и некоторых оптовых платформ.
import xml.etree.ElementTree as ET
tree = ET.parse("supplier_catalog.xml")
root = tree.getroot()
for product in root.findall(".//product"):
sku = product.find("sku").text
price = float(product.find("price").text)
stock = int(product.find("quantity").text)
update_product_by_sku(sku, price, stock)
Для больших XML-файлов (100MB+) используйте итеративный разбор:
for event, elem in ET.iterparse("large_catalog.xml", events=("end",)):
if elem.tag == "product":
process_product(elem)
elem.clear() # освобождение памяти
Случай 3: У поставщика есть API
Самый чистый вариант. Получите учетные данные API от поставщика и обращайтесь к их конечной точке:
import requests
def fetch_supplier_stock(api_key):
r = requests.get(
"https://supplier.com/api/v1/products",
headers={"Authorization": f"Bearer {api_key}"},
params={"updated_since": "2025-01-01"}
)
return r.json()["products"]
Автоматизация расписания
Запускайте импорт на VPS с помощью cron:
# Обновлять цены каждый день в 2:00 ночи
0 2 * * * /usr/bin/python3 /home/user/importer/run.py >> /home/user/importer/import.log 2>&1
Или для поставщиков, которые обновляются в реальном времени, опрашивайте каждые несколько часов:
0 */4 * * * /usr/bin/python3 /home/user/importer/run.py
Обработка ошибок и крайних случаев
Хороший скрипт импорта учитывает такое:
- Проблемы с кодировкой — CSV поставщиков часто в Windows-1251 или Latin-1:
pd.read_csv(f, encoding="cp1251") - Формат цены — "1.234,56" (европейский) против "1,234.56" (американский): очищайте перед разбором
- Отсутствующие товары — записывайте новые SKU поставщика, которых еще нет в вашем магазине
- Обнуление остатков — решите: скрыть товар или показывать "нет в наличии"?
- Сбои импорта — оберните в try/except, отправьте уведомление в Telegram, если импорт не удался
import telebot
bot = telebot.TeleBot("YOUR_TOKEN")
ADMIN_CHAT = 123456789
def notify(msg):
bot.send_message(ADMIN_CHAT, msg)
try:
count = run_import()
notify(f"✅ Импорт завершен: обновлено {count} товаров")
except Exception as e:
notify(f"❌ Ошибка импорта: {e}")
Если вы попробовали настроить автоматический импорт по этим шагам, но всё ещё не получилось — или вы не хотите делать это самостоятельно — команда DevCev Digital готова взять эту работу на себя. Просто свяжитесь с нами, и мы настроим синхронизацию под вашего поставщика.