GMBSPYLAB: FB Ad Library → лента в Telegram
Конвейер сбора рекламы из публичной FB Ad Library на Playwright и асинхронном Python. Интересное здесь в том, что происходит дальше: приведение к единому виду, отсев повторов, очереди и доставка. 30-75 тыс. карточек в день по 30+ рынкам, вывод в Telegram — отдельная ветка на каждую страну.
Готовые сервисы слежения за чужой рекламой: дорого, медленно и без нужных стран
Платные сервисы (AdHeart, AdSpy, агрегаторы рекламных библиотек) берут $300–800 в месяц и покрывают ограниченный набор стран. По редким рынкам (менее популярные страны Европы, Латинская Америка, Азия) данных либо нет, либо они приходят с задержкой в 1-2 дня.
Meta API через дев-приложение требует прохождения App Review — для маленькой команды это недели ожидания ради данных, которые и так открыты публично. При этом facebook.com/ads/library рисуется прямо в браузере, поэтому простой сбор HTML отдаёт пустую страницу.
Цель — собрать живой поток рекламы из 30+ стран самостоятельно, в свою базу, с фильтром по формату (картинка, видео, PWA), длительности показа, единой системой тегов и публикацией в Telegram.
Конвейер из четырёх ступеней: сбор → единый вид → хранение → доставка
Playwright, но без разбора вёрстки
Витрина рисуется прямо в браузере, поэтому Chromium без окна открывает страницу один раз — дальше сбор идёт по тому же ответу, что получает сам браузер, и не тратит время на разбор вёрстки. Разбирать HTML на каждой карточке в десятки раз дороже.
Запросы идут с обычного пользовательского темпа: пул сессий с привязкой к рынку, не чаще одного запроса в 2,5 с и жёсткий потолок на сессию. Смысл в том, чтобы поток был предсказуемым и его хватало на суточный объём.
Сбор переживает изменения на той стороне
Источник живой: разметка и параметры выдачи меняются несколько раз в сутки, и простой сборщик после каждого такого изменения молча отдаёт нули. Здесь схема ответа проверяется на каждом шаге, при расхождении сессия переинициализируется и поток не прерывается. Если источник отвечает ошибкой или притормаживает — сессия уходит в паузу с экспоненциальным откатом и возвращается сама. За сутки такое случается десятки раз, и ни один такой случай не требует моего участия.
Postgres 16 + arq + MinIO для медиа
SQLAlchemy 2 async + asyncpg + alembic миграции, индексы по рекламодателю, стране и дате первого появления. arq через Redis для фоновых задач (загрузка файлов, отсев повторов). Картинки и видео → MinIO / R2 через aioboto3. Повторы отсеиваются по перцептивному хешу изображения — 75 тыс. собранных → 5-12 тыс. уникальных в день.
Telegram через aiogram 3 — два формата вывода
v1 — форум-супергруппа: createForumTopic
для каждой из 30+ стран (ЕС-27, Великобритания, Бразилия, Танзания, Мексика, Индия, Канада, ЮАР, Сербия и другие). Каждая страна — своя ветка, удобно смотреть по рынку.
v2 — канал с хештегами: единый поток и теги
#GEO #PWA #VIDEO #1DAY #FBPAGE.
Задача по расписанию ежедневно обновляет тег #NDAY
— видно, сколько дней объявление уже крутится.
Технологии
- Playwright (Chromium headless)
- Пул сессий с привязкой к рынку
- Ограничение частоты запросов и экспоненциальный откат
- Валидация схемы ответа на каждом шаге
- Python 3.12 + uv (package manager)
- SQLAlchemy 2 async + asyncpg
- PostgreSQL 16 и миграции alembic
- Pydantic v2 для всех схем данных
- arq + Redis 7 (фоновые задачи)
- APScheduler (запуск по расписанию)
- MinIO / Cloudflare R2 (aioboto3)
- SQLite (кэш и локальное состояние)
- aiogram 3 (Bot API)
- Форум-супергруппа: ветка на каждую страну
- Канал с хештегами и ежедневное обновление счётчика дней
- Проверка состояния → оповещения в Discord и Telegram
- Playwright-FB (основной источник)
- ScrapeCreators (платный запасной источник вне ЕС)
- Meta Graph API (для подтверждённых идентификаторов)
- Реестр EU DSA (данные, раскрываемые по регламенту)
- structlog (структурированные логи)
- 16 из 16 тестов проходят (pytest)
- Проверка состояния и аварийная остановка
- Вебхуки Discord для статусов
Что в итоге
после отсева повторов: 5-12 тыс. уникальных
ЕС-27, Великобритания, Бразилия и ещё 30 рынков вне ЕС
в месяц за всю инфраструктуру — сервер и хранилище. Платные сервисы берут $300-800
Применимость для клиентов: та же схема (сбор → единый вид → отсев повторов → доставка) переносится на любой источник, к которому у клиента есть законный доступ: свой кабинет на Avito, WB Seller или Ozon Seller, официальные выгрузки, открытые рекламные библиотеки. На созвоне разбираем конкретный источник и что по нему разрешено регламентом площадки.
Похожие кейсы
Сквозная атрибуция: от рекламного клика до заказа
Свой сервис на стандартной библиотеке Python принимает вебхуки Shopify, проверяет HMAC, шлёт заказ в трекер и…
Оплаченные заказы Shopify → рабочие таблицы склада
Заказы, номера отправлений, статусы и отмены проставляются сами каждые 30 минут. Приёмник на Advanced Sheets…
Обмен с партнёром по отгрузке: файл дня туда, стоимость и треки обратно
Файл дня собирается сам по дате в книге и повторяет её раскраску настоящим условным форматированием. Ответ…
Аудит за 9 900 ₽ — с конкретным отчётом и сметой
Расскажу что внедрить в вашем бизнесе в первую очередь, какая будет окупаемость, и нужен ли вообще AI для вашей задачи (иногда — нет).
Или просто напишите свой вопрос — отвечу в течение 2 часов