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

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, 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 рабочих дня.