Реалізація зберігання результатів парсингу в базі даних

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація зберігання результатів парсингу в базі даних
Проста
від 1 робочого дня до 3 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Реалізація зберігання результатів скрейпінгу у базі даних

Результати скрейпінгу потрібно не просто зберігати — потрібно зберігати так, щоб можна було відстежити історію змін, швидко робити вибірки та не втратити дані при повторному обході.

Схема таблиць

Два рівні: сирові дані та нормалізовані.

-- Сирий HTML або JSON-ответ (для відладки та повторного парсингу)
CREATE TABLE scrape_raw (
    id          BIGSERIAL PRIMARY KEY,
    site_id     INTEGER NOT NULL,
    url         TEXT NOT NULL,
    body        TEXT,
    status_code SMALLINT,
    scraped_at  TIMESTAMP DEFAULT NOW(),
    CONSTRAINT uq_scrape_raw UNIQUE (site_id, url, DATE(scraped_at))
);

-- Нормалізовані товари
CREATE TABLE scraped_products (
    id          BIGSERIAL PRIMARY KEY,
    site_id     INTEGER NOT NULL,
    external_id VARCHAR(255),
    url         TEXT NOT NULL,
    name        TEXT,
    price       NUMERIC(12,2),
    currency    CHAR(3),
    in_stock    BOOLEAN,
    data        JSONB,          -- усе решта, що не вошло в колонки
    scraped_at  TIMESTAMP DEFAULT NOW(),
    updated_at  TIMESTAMP DEFAULT NOW(),
    CONSTRAINT uq_scraped_product UNIQUE (site_id, external_id)
);

CREATE INDEX idx_scraped_products_site ON scraped_products (site_id);
CREATE INDEX idx_scraped_products_data ON scraped_products USING gin(data);

JSONB-колонка data зберігає усе, що не стандартизовано: характеристики, зображення, атрибути. GIN-індекс дозволяє робити швидкі запити по вмісту.

Upsert при повторному парсингу

def save_product(conn, site_id: int, product: dict):
    conn.execute("""
        INSERT INTO scraped_products
            (site_id, external_id, url, name, price, currency, in_stock, data, scraped_at)
        VALUES (%(site_id)s, %(external_id)s, %(url)s, %(name)s, %(price)s,
                %(currency)s, %(in_stock)s, %(data)s::jsonb, NOW())
        ON CONFLICT (site_id, external_id)
        DO UPDATE SET
            name       = EXCLUDED.name,
            price      = EXCLUDED.price,
            in_stock   = EXCLUDED.in_stock,
            data       = EXCLUDED.data,
            updated_at = NOW(),
            scraped_at = NOW()
    """, {**product, 'site_id': site_id, 'data': json.dumps(product.get('extra', {}))})

Час реалізації

Базова схема з upsert-логікою та індексами — 1–2 робочі дні.