Как работать с отчетом Яндекс.Директ API Reports с Python

Как работать с отчетом Яндекс.Директ API Reports с Python

Впервые столкнувшись с работой сервиса Reports в Яндекс.Директ API, меня удивило, что сервис возвращает файл TSV. Видимо, я избалован готовыми решениями и библиотеками от Google, где вы легко найдете методы типа to_dataframe() и подобные. Есть несколько способов сохранять такие файлы, мы покажем лишь несколько из них.

Яндекс.Директ API возвращает ответ в TSV-файле, который представлен в виде потока байтов, поэтому задача состоит из следующих этапов:

  1. Сделать запрос
  2. Прочитать ответ методом content
  3. Обработать в зависимости от способов представленных ниже

Получаем TSV отчет Яндекс.Директ API сразу в DataFrame

Для начала разберемся как сохранить поток байтов в файл. В этом нам поможет BytesIO и Pandas. Конечно, мы можем работать через библиотеку csv. Но мы уже взрослые и будем пользоваться серьезными игрушками. И так, сначала вкратце объясним код приведенный ниже:

  1. Получаем ответ в виде потока байтов response.content
  2. Создаем объект BytesIO передав в него наш response.content
  3. Воспользуемся функцией read_csv с использованием кастомного разделителя. В нашем случае разделителем выступает символ табуляции \t так как TSV (Tab Separated Values).
  4. Все! В наших руках готовый к работе DataFrame, но что если мы хотим сохранить его в CSV?
  5. Для этого вызываем функцию to_csv
import requests
import pandas as pd
from io import BytesIO

def get_last_week_cost_report(login, token):
    # Создание тела запроса
    body = {
        "params": {
            "SelectionCriteria": {
            },
            "FieldNames": [
                "Date",
                "CampaignName",
                "CampaignId",
                "Clicks",
                "Cost"
            ],
            "ReportName": "Yesterday Costs Report",
            "ReportType": "CAMPAIGN_PERFORMANCE_REPORT",
            "DateRangeType": "LAST_WEEK",
            "Format": "TSV",
            "IncludeVAT": "YES",
            "IncludeDiscount": "NO"
        }
    }

    # адрес для отправки json-запросов
    url = 'https://api.direct.yandex.com/json/v5/reports'

    # заголовки
    headers = {"Authorization": "Bearer " + token,  # OAuth-токен. Использование слова Bearer обязательно
               "Client-Login": login,  # Логин клиента рекламного агентства
               "Accept-Language": "en",  # Язык ответных сообщений
               "skipReportHeader": "true",  # Убрали заголовок, чтобы не попал в dataframe
               "returnMoneyInMicros": "false",  # Получаем деньги округленные до двух знаков
               "skipReportSummary": "true"  # Убрали тотал, чтобы не крашить apply
               }

    # POST-запрос к API
    response = requests.post(url, json=body, headers=headers)

    # Способ с Pandas
    file_from_bytes = BytesIO(response.content)
    # Получаем DataFrame из BytesIO
    df = pd.read_csv(file_from_bytes, delimiter='\t')

    # Данный метод сохранит DataFrame в CSV, аналогично можно сохранить и в xlsx через to_excel(), только не забудьте установить xlrd
    df.to_csv('Report.csv')
    return df

to_bq_df = get_last_week_cost_report('ЛОГИН', 'ТОКЕН')

 

Сегодня мы научились:

  1. Получать поток байтов в ответ запрос к сервису Reports Яндекс.Директ API
  2. Создавать объект BytesIO, для его последующего использования
  3. Создавать DataFrame из объекта BytesIO
  4. Сохранять ответ Reports API в CSV

 


Документация по BytesIO: https://docs.python.org/3/library/io.html#io.BytesIO

Документация по Content Requests: https://docs.python-requests.org/en/master/user/quickstart/#response-content