
Один агент по расписанию собирает цены, объявления и вакансии с нескольких сервисов, приводит хаос к одной таблице и пишет вам только тогда, когда что-то реально изменилось.
Источник описывается один раз: адрес, способ пагинации и нужные поля. Агент забирает страницу, модель вытаскивает поля по фиксированной схеме, записи дедуплицируются по стабильному ключу, снапшот сохраняется, а изменения относительно прошлого запуска пишутся в отдельную таблицу.
- Таблицы: sources, runs, items, item_changes
- Edge-функция с fetch и очисткой HTML в текст
- Структурированное извлечение по строгой схеме полей
- Запуск по расписанию раз в несколько часов
- Оповещения на почту или вебхук плюс экспорт в CSV
Продавайте мониторинг по подписке за источник: перекупщики платят за цены конкурентов, рекрутеры за вакансии, агентства за списки лидов. Более частый интервал и доступ по API стоят дороже.
Выходные
- Сначала правила: прочитайте robots.txt и условия сервиса, собирайте только публичные страницы и берите официальный API, если он есть.
- Создайте таблицу sources с полями url, шаблон пагинации, подсказка по селектору, список полей, интервал и флаг активности. Одна строка это один отслеживаемый сервис.
- Напишите edge-функцию fetch_source: она загружает HTML с обычным user agent, вырезает скрипты и стили и обрезает текст до блока с объявлениями.
- Передайте этот текст модели со строгой JSON-схемой (заголовок, цена, валюта, ссылка, дата, raw_key) и температурой ноль. Модель не должна придумывать поля, отсутствующие значения остаются null.
- Дедуплицируйте по raw_key: делайте upsert в items, а если отслеживаемое поле отличается от сохранённого, пишите строку в item_changes со старым и новым значением.
- Добавьте повторы с задержкой, лимит запросов на источник и таблицу runs с логом статуса, числом записей и текстом ошибки, чтобы сломанный селектор был виден сразу.
- Поставьте функцию на расписание по интервалу источника и отправляйте письмо или вебхук только с теми строками из item_changes, которые появились после прошлой рассылки.
- Соберите интерфейс: список источников со статусом, история запусков, таблица записей с фильтрами, лента изменений и кнопка экспорта в CSV.
Build a scraping and monitoring agent. Data: table "sources" (name, url, pagination_pattern, selector_hint, fields jsonb, interval_minutes, active). Table "runs" (source_id, status, items_found, error, started_at, finished_at). Table "items" (source_id, raw_key unique per source, title, price numeric, currency, url, published_at, payload jsonb, first_seen_at, last_seen_at). Table "item_changes" (item_id, field, old_value, new_value, created_at). Server: an edge function that takes a source id, fetches the page with a normal user agent, strips scripts, styles and navigation, trims the text to the listing area, then asks the model to extract rows into a strict JSON schema with temperature zero and null for missing values. Upsert rows into items on raw_key and insert item_changes whenever a tracked field differs. Log every attempt into runs, retry twice with backoff on network errors and respect a per source rate limit. Follow pagination up to a configurable page limit. Automation: a scheduled job that picks active sources whose interval has elapsed, runs them one by one, then sends a digest email or webhook containing only item_changes created since the previous digest. UI: sources page with add and edit form, health badge from the last run, run history with error text, items table with search and filters, a change feed and a CSV export button. Rules: only public pages, honour robots.txt, keep all keys and model calls on the server, enable row level security so each user sees only their own sources and items.



