Простой ETL для выгрузки не семплированных данных из Google Analytics прямо в DWH BigQuery на python

Источников вдохновения для этой статьи была статья Юрия Борзило http://toolmark.ru/python-ga-api/ из нее я использовал некоторые скрины, но сама реализация кода в этой статье сделана самостоятельно с применением другой логики
Проблема:
Вы превысили лимиты Universal Google Analytics, но при этом хотите продолжать получать отчеты без семплирования бесплатно. Или вам необходимо просто работать с Raw data сайта внутри базы данных dwh.

Решение:
Собственный локальный ETL, который выгружает данные из Google Analytics, делает бэкап в Cloud Storage, далее грузит в таблицы Google Big Query при помощи python.
By the way, вы можете сделать из этого крон на питоне, чтобы он работал автономно.

Содержание:
  1. Получение данных из Google Analytics.
  2. Преобразование данных на python.
  3. Бэкап данных и импорт в google bigquery
  4. Загрузка данных

1. Получение данных из Google Analytics

Для того, что бы начать работать с API google analytics у вас на компьютере должен быть установлен python, а также должен быть pip. PIP система управления пакетами, которая используется для установки и управления программными пакетами, написанными на Python

1.1) Создание сервисного аккаунта google cloud platform
У вас должен быть аккаунт в google cloud platform. Переходим по ссылке https://console.cloud.google.com/

Перед вами появится консоль google cloud.
В левом верхнем углу нажмите "выберите проект"
После создайте свой проект, нажмите «создать проект».
Введите произвольное название проекта и нажмите «создать».
Нужно подождать некоторое время и проект будет создан. После этого нужно включить доступ к api google analytics для этого проекта.

Открываем боковое меню нажав на "гамбургер" в верхнем левом углу и переходим в раздел API и сервисы → библиотека.
Ищем в google analytics, для этого используем поисковую строку.
В открывшемся окне нажимаем кнопку «включить»
После мы попадаем в интерфейс управления analytics reporting API и нажимаем на кнопку создать учетные данные.
Мы попадаем на новую страницу, где в разделе добавление учетных данных нужно кликнуть по ссылке "сервисный аккаунт".
В открывшейся странице создаем сервисный аккаунт, нажимаем на соответствующую кнопку.
На втором шаге нажмите кнопку «продолжить».
На 3 шаге находим кнопку "Создать ключ" и нажимаем на неё.
Выбираем тип ключа JSON и нажимаем «создать». Подробнее о JSON читайте в нашей статье.
К вам на компьютер скачивается JSON файл, откройте его при помощи блокнота. Нужно скопировать значение из поля client_email (то что в кавычках, после двоеточия). Этот файл нам понадобится в дальнейшем, не забывайте о нём.
Теперь нужно перейти в аккаунт google analytics и открыть доступ на уровне аккаунта для скопированного e-mail адреса.

1.2) Настройка google analytics
Переходим в аккаунт GA и на вкладке аккаунт выбираем вкладку управления пользователями.
В правом верхнем углу нажимаем на плюсик и добавляем пользователя.
Вставляем e-mail сервисного аккаунта, который мы скопировали из JSON файла и нажимаем кнопку добавить.
Мы завершили настройку сервисного аккаунта. Теперь перейдем к установке библиотеки python и её настройке.

1.3) Установка библиотеки для работы с Google Analytics (python)
В данной статье я буду использовать библиотеку gaapi4py, ознакомиться с ней можно на github (если вы знаете другие клевые библиотеки для работы с GA, то пишите их в комментарии). Эта библиотека позволяет выгружать данные из core reporting API четвертой версии.
Потом на экране начнут появляться строки — это процесс установки библиотеки, когда он закончится успешно, на экране будет сообщение об этом.

2.Работа с jupyter notebook (Преобразование данных через python)

1. Jupyter notebook
Открываем jupyter notebook и создаем новый notebook. Теперь нам нужен JSON файл, который мы скачали при создании сервисного аккаунта google. Переименуйте этот файл, например в etl1.json. Необходимо поместить этот файл в папку где мы создали наш ноутбук, он нужен для работы всей нашей системы.
Теперь нужно немного настроить этот код. Перед 3 строкой ставим решетку, чтобы закомментировать код в этой строке, в 5 строке указываем название нашего json файла(он должен лежать в папке с ноутбуком, либо нужно прописать полный путь до файла).

Строки 8 — 20 это тело запроса, который будет отправлен в GA, обязательно в строке 9 — view_id замените значение на id вашего представления google analytics из которого вы хотите выгрузить данные.

Также в запросе можно менять диапазон дат, параметры, метрики и фильтры. Подробнее о настройках можно прочесть на github. Подбирать параметры и метрики можно через вот этот сервис google

После того как были сделаны настройки можно нажать shift + enter и этот код запустится, произойдет запрос к api google analytics и если все сделано правильно вы получите запрошенные данные в виде буферного dataframe.

В нашем примере мы запросили в качестве параметров источники/каналы трафика по датам, а в качестве метрик количество сессий. Также был задан фильтр, что нам нужны только данные по источнику google / organic. Ниже полученный ответ в виде таблицы.


Пример кода на python для загрузки данных в google cloud big query

c = GAClient(json_keyfile="etl1.json.json")
 
date = '2020-06-06'
 
time.sleep(240)
 
request_body = {
    'view_id': '77255247',
    'start_date': date,
    'end_date': date,
    'dimensions': {
        'ga:dimension4',
        'ga:dimension1',
        'ga:dimension2',
        'ga:eventCategory',
        'ga:eventAction',
        'ga:eventLabel'
         
 
    },
    'metrics': {
        'ga:users',
    },
    'filter': 'ga:nthHour==000000,ga:nthHour==000001,ga:nthHour==000002,ga:nthHour==000003,ga:nthHour==000004,ga:nthHour==000005,ga:nthHour==000006
         
}
 
response = c.get_all_data(request_body)
response['info']
ga_data = response['data']
ga_data['dimension1'] = ga_data['dimension1'].str.replace('.','-')
ga_data.to_csv("events_info{}-ind00-06.csv".format(date), index = False)
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
print('Job finished time {} - GA-get and transform events_info{}-ind00-06.csv'.format(current_time, date))


date = переменная дня, которая используется в теле запроса
time.sleep переменная, которая задает время ожидания между запросами
filter = фильтры для получения данных кусками из-за лимита по объемам выгрузки

2. Преобразование данных python для импорта в google bigquery

#1
ga_data['dimension1'] = ga_data['dimension1'].str.replace('.','-')
#2
ga_data['transactionId'] = 'tr-' + ga_data['transactionId'].astype(str)
#3
ga_data['dimension3'] = 'uid-' + ga_data['dimension3'].astype(str)
#4
ga_data['productSku'] = 'sku-' + ga_data['productSku'].astype(str)

#1 - float to string
#2 - integer to string
#3 - integer to string
#4 - integer to string

3. Бэкап данных в Cloud Storage и запись в Big Query

Требуется создать bucket в Google Cloud Storage


По bucket нужно иметь расширенные права аккаунтом проекта BigQuery

Для связки между Storage и BigQuery для аккаунта который закреплен за проектом BigQuery требуется предоставить расширенные права в Google Cloud Storage
Пример кода на python для загрузки данных в google cloud bigquery

##### backUp

bucket_uri = 'gs://analytics_1'
bucket_name = 'analytics_1'
#адрес куда записываем данные
bucket_target = "datasets/Trans{}.csv".format(date)
#файл подкачки
local_dataset = "Trans{}.csv".format(date)
#полный адрес куда записываем данные
bucket_target_uri = bucket_uri + '/' + bucket_target
#dataset
bigquery_dataset = 'uploadtest'
#таблица
bigquery_table = 'Trans'

def upload_blob(bucket_name, source_file_name, destination_blob_name):
    """Upload a CSV to Google Cloud Storage.
 
    1. Retrieve the target bucket.
    2. Set destination of data to be uploaded.
    3. Upload local CSV.
    """
    storage_client = storage.Client.from_service_account_json(
        'tactical-gate-storage-credit-account-app-super.json')
    bucket = storage_client.get_bucket(bucket_name)
    blob = bucket.blob(destination_blob_name)
    # Commence Upload
    blob.upload_from_filename(source_file_name)
    print('File {} uploaded to {}.'.format(
        source_file_name,
        destination_blob_name))
 
### Big Query Insert
 
def insert_bigquery(target_uri, dataset_id, table_id):
    """Insert CSV from Google Storage to BigQuery Table.
 
    1. Specify target dataset within BigQuery.
    2. Create a Job configuration.
    3. Specify that we are autodetecting datatypes.
    4. Reserve row #1 for headers.
    5. Specify the source format of the file (defaults to CSV).
    6. Pass the URI of the data storage on Google Cloud Storage from.
    7. Load BigQuery Job.
    8. Execute BigQuery Job.
    """
    bigquery_client = bigquery.Client.from_service_account_json(
        'tactical-gate-storage-credit-account-app-super.json')
    dataset_ref = bigquery_client.dataset(dataset_id)
    job_config = bigquery.LoadJobConfig()
    job_config.autodetect = True
    job_config.skip_leading_rows = 1
    job_config.source_format = bigquery.SourceFormat.CSV
    uri = bucket_target_uri
    load_job = bigquery_client.load_table_from_uri(
        uri,
        dataset_ref.table(table_id),
        job_config=job_config) # API request
    print('Starting job {}'.format(load_job.job_id))
    # Waits for table load to complete.
    load_job.result()
    print('Job finished Trans{} data loaded into BQ'.format(date))
 
 
upload_blob(bucket_name, local_dataset, bucket_target)
insert_bigquery(bucket_target_uri, bigquery_dataset, bigquery_table)

Схема таблиц Big Query должна иметь идентичный тип относительно загружаемых данных : название полей, тип данных (int, str, float, timestamp)

Актуальные креды доступа находятся в админке Big Query https://console.cloud.google.com/apis/credentials

P.S. Дополнительная документация методам работы
Описание методов по работе с BQ
google.cloud.bigquery.client
https://blog.morizyun.com/python/library-bigquery-google-cloud.html

SDK python BigQuery, Cloud Storage
https://dev.to/hackersandslackers/google-bigquerys-python-sdk-creating-tables-programmatically-3cof

REST Reference Big Query https://cloud.google.com/bigquery/docs/reference/rest
Made on
Tilda