Проблема ручного імпорту
Більшість власників інтернет-магазинів щотижня витрачають години на одне й те саме: завантажують прайс-лист постачальника, знаходять зміни, оновлюють товари в адмінпанелі. Іноді це 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}")
Скільки це зазвичай коштує
Базовий скрипт синхронізації цін/залишків: 100–150 $ — читає CSV або XML, оновлює ціни та залишки, запускається щодня через cron.
З додаванням нових товарів, завантаженням зображень, зіставленням категорій: 200–350 $ — більше логіки для зіставлення категорій, обробки нових товарів, завантаження та зміни розміру зображень.
Кілька постачальників з вирішенням конфліктів: 300–500 $ — об'єднання фідів від кількох постачальників, вибір найкращої ціни, обробка різних форматів SKU.
Якщо ви витрачаєте години на ручний імпорт щотижня, розкажіть мені про формат вашого постачальника та платформу магазину — я назву вам конкретну суму.