← Все статьи
24 июня 2026 г.

Как автоматически импортировать товары поставщиков в OpenCart или WooCommerce

Большинство владельцев интернет-магазинов еженедельно тратят часы на одно и то же: загружают прайс-лист поставщика, находят изменения, обновляют товары в админпанели. Иногда это 50 товаров. Иногда —

Проблема ручного импорта

Большинство владельцев интернет-магазинов еженедельно тратят часы на одно и то же: загружают прайс-лист поставщика, находят изменения, обновляют товары в админпанели. Иногда это 50 товаров. Иногда — 5 000.

Это как раз тот тип повторяющихся задач, которые стоит автоматизировать. Настроил один раз — и оно работает самостоятельно.

Что нужно знать сначала

Прежде чем что-то строить, дайте ответы на эти вопросы:

  1. В каком формате ваш поставщик предоставляет данные? — CSV, Excel, XML, JSON API, FTP?
  2. Как часто они обновляются? — Ежедневно? Еженедельно? В реальном времени?
  3. Что нужно обновлять? — Только цены? Уровень запасов? Новые товары? Описание?
  4. Как вы сопоставляете товары? — 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 готова взять эту работу на себя. Просто свяжитесь с нами, и мы настроим синхронизацию под вашего поставщика.

Нужна помощь с этим?

DevCev Digital специализируется именно на таких задачах. Расскажите что нужно — ответим в течение нескольких часов.

Бесплатная диагностика →Автоматизация и веб-скрапинг
← Назад в блогЕсть проект? Поговорим →