Как работать с отчетом Яндекс.Директ API Reports с Python
Впервые столкнувшись с работой сервиса Reports в Яндекс.Директ API, меня удивило, что сервис возвращает файл TSV. Видимо, я избалован готовыми решениями и библиотеками от Google, где вы легко найдете методы типа to_dataframe() и подобные. Есть несколько способов сохранять такие файлы, мы покажем лишь несколько из них.
Яндекс.Директ API возвращает ответ в TSV-файле, который представлен в виде потока байтов, поэтому задача состоит из следующих этапов:
- Сделать запрос
- Прочитать ответ методом content
- Обработать в зависимости от способов представленных ниже
Получаем TSV отчет Яндекс.Директ API сразу в DataFrame
Для начала разберемся как сохранить поток байтов в файл. В этом нам поможет BytesIO и Pandas. Конечно, мы можем работать через библиотеку csv. Но мы уже взрослые и будем пользоваться серьезными игрушками. И так, сначала вкратце объясним код приведенный ниже:
- Получаем ответ в виде потока байтов response.content
- Создаем объект BytesIO передав в него наш response.content
- Воспользуемся функцией read_csv с использованием кастомного разделителя. В нашем случае разделителем выступает символ табуляции \t так как TSV (Tab Separated Values).
- Все! В наших руках готовый к работе DataFrame, но что если мы хотим сохранить его в CSV?
- Для этого вызываем функцию 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('ЛОГИН', 'ТОКЕН')
Сегодня мы научились:
- Получать поток байтов в ответ запрос к сервису Reports Яндекс.Директ API
- Создавать объект BytesIO, для его последующего использования
- Создавать DataFrame из объекта BytesIO
- Сохранять ответ 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