Данные Яндекс Директа по API в ClickHouse, Postgres и MySQL на Python

Данные Яндекс Директа по API в ClickHouse, Postgres и MySQL на Python

Рекламу в Яндекс Директе ведут многие, а вот забирать данные к себе в базу умеют не все. Собрать статистику за полгода, построить дашборд в Power BI, свести расходы с продажами из CRM - всё это требует хранения данных на своей стороне. 

В этой статье покажу, как забирать данные из Яндекс Директа через API на Python и складывать их в базу данных: ClickHouse, PostgreSQL или MySQL. Использовать будем бесплатную библиотеку morin, а начнём с простой демонстрации, которую можно запустить локально без сервера и без Docker.

Зачем выгружать данные из Яндекс Директа

Интерфейс Директа хорош для оперативного управления, но плох для аналитики. Как только задач становится много, упираешься в потолок:

  • История ограничена, а хочется хранить данные за все годы.
  • Свести Директ с другими источниками (Метрика, CRM) внутри интерфейса нельзя.
  • Строить сложные срезы и свои метрики неудобно.
  • Автоматизировать выгрузку под дашборд руками невозможно.

Решение одно: забрать данные из Яндекс Директа через API в свою базу данных и работать там. В базе хранится вся история, к ней подключается любой BI-инструмент, а данные обновляются автоматически.

Что такое API Яндекс Директа

API Яндекс Директа - интерфейс, через который программа получает данные рекламного аккаунта напрямую, без захода в интерфейс. Через Директ API можно вытянуть список кампаний, статистику по дням (клики, показы, расход), список объявлений и множество других параметров и показателей.

Работает яндекс директ API так: вы отправляете HTTP-запрос с токеном авторизации, а в ответ получаете данные. Статистика приходит в виде отчёта (формат TSV), справочные данные вроде кампаний и объявлений - в JSON. Библиотека morin прячет эти детали внутри, отдавая на выходе готовые строки для базы данных.

Как устроены отчёты и запросы к ним, подробно описано в справке API Яндекс Директа по отчётам.

Получаем доступ к API: токен и логин

Для работы с API Яндекс Директа нужны две вещи:

  • OAuth-токен - ключ авторизации.
  • Client-Login - логин рекламного аккаунта, данные которого забираем.

Токен получить просто - по готовой ссылке, регистрировать своё приложение и слать заявку на доступ не нужно:

  1. Перейдите по ссылке для получения токена.
  2. Авторизуйтесь под аккаунтом Яндекса, к которому привязан Директ, и подтвердите доступ.
  3. Вас перекинет на страницу с токеном - длинной строкой вида y0_Ag... Скопируйте её, это и есть ваш OAuth-токен.

Client-Login - это логин того аккаунта, чью статистику собираете (например, my-agency-client). Токен привязан к аккаунту и действует ограниченное время (обычно около года), после чего получается заново по той же ссылке.

Токен даёт доступ к вашему рекламному аккаунту, поэтому храните его в секрете. Посмотреть, каким приложениям выдан доступ, и при необходимости отозвать токены можно на странице доступа аккаунта Яндекса.

Устанавливаем библиотеку morin

morin - бесплатная библиотека для получения данных из разных API (Директ, Метрика, WB, OZON и другие) и загрузки в базу. Ставится обычным pip:

pip install morin

Дополнительно поставьте драйвер той базы, куда будете грузить данные:

pip install clickhouse-connect   # для ClickHouse
pip install psycopg2-binary      # для PostgreSQL
pip install pymysql              # для MySQL

Для первой демонстрации без базы данных хватит одной morin.

Бесплатный старт: получаем данные Директа на Python

Начнём с самого простого - просто вытащим данные Директа в Python и посмотрим на них. Никакой базы и Docker пока не нужно, всё запускается локально и бесплатно.

Создаём объект коннектора с токеном и логином:

from morin import YDbyDate

yd = YDbyDate(
    login='ВАШ_CLIENT_LOGIN',      # логин рекламного аккаунта
    token='ВАШ_OAUTH_ТОКЕН',       # OAuth-токен Яндекс Директа
    start='2025-01-01',            # с какой даты собирать статистику
    columns='Date,Clicks,Cost,Impressions',  # какие поля нужны
    report='date',
)

Список кампаний. Проверим, что доступ работает, получив кампании аккаунта:

campaigns = yd.get_campaigns()
for c in campaigns:
    print(c['Id'], c['Name'])

Статистика по дням. Главный отчёт - цифры по кликам, расходам и показам за период с start по вчерашний день:

stats = yd.get_data()
for row in stats:
    print(row)
    
# Каждая строка - словарь:
{'Date': '2025-01-15', 'Clicks': 120, 'Cost': 3450.5, 'Impressions': 8900}

На выходе - список словарей, по одному на строку отчёта. Это и есть статистика Яндекс Директа, готовая к анализу: можно сразу закинуть в pandas, посчитать суммы или сохранить.

Объявления. Отдельным методом забираем тексты объявлений по всем кампаниям:

ads = yd.collect_campaign_ads()
for ad in ads[:5]:
    print(ad['CampaignName'], ad['Title'], ad['Href'])

Всё это работает без базы данных - чистое получение данных из Яндекс Директа на Python. Уже на этом этапе библиотеку можно использовать как обычный клиент директ API.

Какие поля можно запросить

В параметре columns перечисляются поля отчёта Яндекс Директа. Самые ходовые:

  • Date - дата.
  • CampaignName, CampaignId - кампания.
  • Impressions - показы.
  • Clicks - клики.
  • Cost - расход.
  • Conversions - конверсии (нужны цели, параметр goals).

Типичная таблица в БД по данным Яндекс Директа выглядит так:

Полный список полей есть в документации по параметрам и показателям Яндекс Директа. Библиотека сама определит типы столбцов, поэтому при добавлении новых полей код менять не нужно.

Расчётные поля типа CPC или CTR лучше всего рассчитывать в самом отчёте, так как они будут зависеть от выбранного списка параметров - дат, кампаний, итд и по API их обычно не получают. Ведь тот же CTR обычно интересен в разрезе Поиск/РСЯ, а не по каждому объявлению и дате.

Загрузка данных Яндекс Директа в ClickHouse

Теперь самое интересное - сложим статистику в базу данных. Начнём с ClickHouse, популярной аналитической СУБД (про неё у нас есть отдельные статьи). Нужен запущенный ClickHouse: локально его поднимают одной командой Docker или ставят на сервер.

Добавляем в конструктор параметры подключения к базе и вызываем один метод:

from morin import YDbyDate

yd = YDbyDate(
    subd='clickhouse',              # тип базы данных
    host='localhost', port='8123',
    username='default', password='',
    database='direct',
    add_name='client1',      # префикс таблиц этого аккаунта
    login='ВАШ_CLIENT_LOGIN',
    token='ВАШ_OAUTH_ТОКЕН',
    start='2025-01-01',
    backfill_days=3,          # сколько последних дней пересобирать
    columns='Date,Clicks,Cost,Impressions',
    report='date',
)

yd.collecting_manager()

Что делает collecting_manager:

  • сам создаёт таблицу в ClickHouse и определяет столбцы по данным отчёта;
  • работает по принципу Airflow - в служебной таблице фиксирует, за какие дни данные уже собраны;
  • при повторном запуске догружает только недостающие дни, а не тянет всё заново;
  • параметр backfill_days заставляет перезабрать несколько последних дней (статистика Директа задним числом уточняется).

После запуска в базе появится таблица со статистикой по дням. Дальше к ней подключается любой дашборд.

То же самое в PostgreSQL и MySQL

Главный плюс morin: чтобы грузить не в ClickHouse, а в PostgreSQL или MySQL, меняется ровно один параметр - subd. Весь остальной код и логика те же.

Для PostgreSQL:

yd = YDbyDate(
    subd='postgresql',
    host='localhost', port='5432',
    username='postgres', password='postgres',
    database='direct',
    add_name='client1',
    login='ВАШ_CLIENT_LOGIN', token='ВАШ_OAUTH_ТОКЕН',
    start='2025-01-01', backfill_days=3,
    columns='Date,Clicks,Cost,Impressions',
    report='date',
)
yd.collecting_manager()

Для MySQL меняем subd на 'mysql' и порт на 3306:

yd = YDbyDate(
    subd='mysql',
    host='localhost', port='3306',
    username='root', password='',
    database='direct',
    add_name='client1',
    login='ВАШ_CLIENT_LOGIN', token='ВАШ_OAUTH_ТОКЕН',
    start='2025-01-01', backfill_days=3,
    columns='Date,Clicks,Cost,Impressions',
    report='date',
)
yd.collecting_manager()

morin сама переведёт типы столбцов под выбранную базу данных и создаст таблицу. То есть один и тот же коннектор Яндекс Директа умеет наполнять три разные СУБД.

Какие отчёты умеет получать коннектор

У коннектора Директа три режима, они задаются параметром report:

  • date - статистика по дням (клики, расходы, показы). Обновляется инкрементально по датам, это основной отчёт.
  • ads - объявления: тексты, заголовки, ссылки. Обновляется целиком.
  • nodate - сводная статистика за весь период без разбивки по дням.

Для регулярного сбора обычно используют date: он копит историю день за днём и не перегружает API повторными запросами.

Автоматизация через Docker

Скрипты выше запускаются руками, что не совсем удобно. Чтобы данные Яндекс Директа обновлялись сами, morin разворачивают в Docker - это позволяет запускать скрипт по расписанию, с логами и уведомлениями в Telegram. Мы подробно разобрали такой сценарий в статье про коннекторы к API в ClickHouse на Docker

У нас есть удобный excel-файл для заполнения настроек подключения, а также конфиг для clickhouse. 

Всё это доступно на нашей платформе по подписке "базовый уровень". Но при желании вы можете сами написать похожий скрипт используя примеры из этой статьи - все функции загрузки данных бесплатны и доступны после установки библиотеки morin. 

FAQ

Как получить данные из Яндекс Директа через API на Python?

Установите библиотеку morin (pip install morin), создайте объект YDbyDate с OAuth-токеном и Client-Login и вызовите методы get_campaigns, get_data (статистика) или collect_campaign_ads. Данные вернутся списком словарей.

Бесплатно ли пользоваться API Яндекс Директа?

Да, сам API Яндекс Директа бесплатный, библиотека morin тоже. Платить нужно только за сервер и базу данных, если вынесете сбор в облако. Для теста всё запускается локально без затрат.

В какую базу данных можно грузить данные Директа?

Коннектор morin умеет ClickHouse, PostgreSQL и MySQL. База выбирается одним параметром subd, остальной код не меняется.

Чем директ API лучше выгрузки из интерфейса?

Через API данные забираются автоматически, за любой период и сразу в базу. Это снимает ручную работу и позволяет строить дашборды и сводить Директ с другими источниками.

Как обновлять статистику Яндекс Директа инкрементально?

morin запоминает собранные дни в служебной таблице и при следующем запуске догружает только новые даты. Параметр backfill_days дополнительно перезабирает несколько последних дней, потому что статистика Директа уточняется задним числом.

Заключение

Мы разобрали, как забирать данные и статистику из Яндекс Директа через API на Python и грузить их в ClickHouse, PostgreSQL или MySQL с помощью бесплатной библиотеки morin. Начали с простой локальной демонстрации без сервера, а затем одной строкой направили те же данные в базу.

Главное: получение данных Директа сводится к паре методов, а выбор базы данных - к одному параметру. Дальше остаётся подключить к базе дашборд и автоматизировать сбор. По такому же принципу morin работает и с другими источниками - Метрикой, WB, OZON, VK, о них будут отдельные статьи.

Полезные ссылки