Rusprofile — ведущий сервис проверки и анализа контрагентов. На портале размещена подробная актуальная информация о более чем 10 миллионах российских юридических лиц и 12 миллионах индивидуальных предпринимателей.
При трафике более 500 000 визитов в сутки Rusprofile столкнулся с ограничениями Яндекс Метрики: из-за сэмплирования нельзя получить точные данные за период более двух дней.
Сэмплирование — это метод обработки данных, при котором для анализа используется только часть всей информации. Он применяется, чтобы уменьшить нагрузку на систему и ускорить расчёты, но при этом точность показателей на больших объёмах данных может снижаться.
Несэмплированные данные доступны только за две недели, а для полноценного анализа всего объема информации требуется подключение Метрики ПРО, стоимость которой начинается от 300 000 ₽ в месяц. Это затрудняет контроль SEO и принятие решений по продвижению сайта.
Наша задача — создать систему, которая позволит работать с точными, несэмплированными данными и анализировать большие объемы информации.
Мы разработали ETL и систему дашбордов, которые решают проблему. На старте проекта было обработано более 120 Гб сырых данных из Яндекс Метрики и Топвизора. В результате сформирована исходная таблица с более 700 млн строк.
Главная особенность проекта — большой массив данных. Например, данные из Яндекс.Метрики за один месяц содержат около 15 млн строк и весят более 3 ГБ — и это при использовании всего 14 полей из всех доступных в Logs API.
Чтобы сохранить доступ к данным, мы использовали только российские и опенсорсные решения:
Спроектировали структуру датасета и его хранение в базе данных, чтобы:
Также мы написали коннекторы (программы, которые автоматически забирают данные из внешних сервисов) для Logs API Яндекс Метрики и API Топвизора.
Дашборд работает быстро и надёжно благодаря многоуровневому хранению данных:
Такая структура защищает от ошибок и ускоряет работу дашборда.
При загрузке данных мы дополнительно обогащаем их, чтобы получить дополнительные срезы, недоступные в текущих инструментах:
Группируем поисковые запросы и размечаем их по интентам (смысловым целям) на основе словаря в Google Sheets — это даёт более гибкую сегментацию в отчетах.
Чтобы данные в отчетах всегда были актуальными, мы настроили пайплайн в Apache Airflow:
После каждого запуска система автоматически отправляет уведомления в Telegram-чат о статусе обновления, а все логи сохраняются на сервере в формате Jupyter-ноутбуков. Это упрощает поиск и устранение ошибок, если вдруг что-то пошло не так.
Дашборд мы собрали в Yandex DataLens, опираясь на продуктовую логику и реальные задачи клиента.
Изначально он рассчитывался в DataLens на основе общей формулы по месяцам и неделям. Позже стало ясно, что для Яндекса и Google нужны разные коэффициенты. Мы перенесли вычисления на уровень базы данных — это упростило контроль и ускорило загрузку чартов.
Иногда из-за недостаточного баланса данные о позициях не обновлялись. Мы предусмотрели запасной вариант: добавили возможность задавать позиции вручную через Google Sheets. При агрегации система подхватывает эти значения и записывает их в таблицу.
Выгрузка старых данных оказалась непростой: на MacBook просто не хватило места на диске. Пришлось подключить стационарный ПК и написать скрипт, который всю ночь загружал данные небольшими частями по 1 млн строк.
Как-то раз Сергей Торкунов (наш заказчик) спросил, например, такое: «Сколько страниц нужно взять из 36 млн, чтобы выборка отражала положение дел с точностью 95%?». Нам приходилось вспоминать теорию вероятностей, а один раз даже консультироваться с преподавателем из университета. Работать с экспертом такого уровня (Сергей входит в топ-20 SEO-специалистов в России) было не только ответственно, но и очень увлекательно.
Пока мы писали этот кейс, успели доработать датасет по позициям. Теперь в мониторинге — еженедельные данные по 515 000 запросов, которые можно фильтровать и по сайту клиента, и по конкурентам. При этом у каждого запросов будет разбивка по группам и смысловому интенту.
Проект позволил Rusprofile контролировать SEO, анализировать большие данные и оперативно реагировать на изменения, повышая эффективность продвижения.