Перейти к содержанию
Business MetricБизнес-Метрика
Назад в блог

Практика аналитики

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

5 мин чтения

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

Проблема: Вы превысили лимиты Universal Google Analytics, но при этом хотите продолжать получать отчеты без семплирования бесплатно. Или вам необходимо просто работать с Raw data сайта внутри базы данных dwh. Решение: Собственный локальный ETL, который выгружает данные из Google Analytics, делает бэкап в Cloud Storage, далее грузит в таблицы Google Big Query при помощи python.

By the way, вы можете сделать из этого крон на питоне, чтобы он работал автономно. Содержание : Получение данных из Google Analytics. Преобразование данных на python. Бэкап данных и импорт в google bigquery Загрузка данных 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.

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

В левом верхнем углу нажмите "выберите проект"

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

После создайте свой проект, нажмите «создать проект».

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

Введите произвольное название проекта и нажмите «создать».

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

Нужно подождать некоторое время и проект будет создан. После этого нужно включить доступ к api google analytics для этого проекта. Открываем боковое меню нажав на "гамбургер" в верхнем левом углу и переходим в раздел API и сервисы → библиотека.

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

Ищем в google analytics, для этого используем поисковую строку.

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

В открывшемся окне нажимаем кнопку «включить»

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

После мы попадаем в интерфейс управления analytics reporting API и нажимаем на кнопку создать учетные данные.

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

Мы попадаем на новую страницу, где в разделе добавление учетных данных нужно кликнуть по ссылке "сервисный аккаунт".

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

В открывшейся странице создаем сервисный аккаунт, нажимаем на соответствующую кнопку.

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

На втором шаге нажмите кнопку «продолжить».

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

На 3 шаге находим кнопку "Создать ключ" и нажимаем на неё.

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

Выбираем тип ключа JSON и нажимаем «создать». Подробнее о JSON читайте в нашей статье.

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

К вам на компьютер скачивается JSON файл, откройте его при помощи блокнота. Нужно скопировать значение из поля client_email (то что в кавычках, после двоеточия). Этот файл нам понадобится в дальнейшем, не забывайте о нём.

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

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

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

В правом верхнем углу нажимаем на плюсик и добавляем пользователя.

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

Вставляем e-mail сервисного аккаунта, который мы скопировали из JSON файла и нажимаем кнопку добавить.

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

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

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

Потом на экране начнут появляться строки — это процесс установки библиотеки, когда он закончится успешно, на экране будет сообщение об этом. 2.Работа с jupyter notebook (Преобразование данных через python) 1. Jupyter notebook Открываем jupyter notebook и создаем новый notebook. Теперь нам нужен JSON файл, который мы скачали при создании сервисного аккаунта google.

Переименуйте этот файл, например в etl1.json. Необходимо поместить этот файл в папку где мы создали наш ноутбук, он нужен для работы всей нашей системы.

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

Теперь нужно немного настроить этот код. Перед 3 строкой ставим решетку, чтобы закомментировать код в этой строке, в 5 строке указываем название нашего json файла(он должен лежать в папке с ноутбуком, либо нужно прописать полный путь до файла).

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

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

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

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

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

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

SQL
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))
Иллюстрация: Простой ETL для выгрузки не семплированных данных из Google Analytics прямо в DWH BigQuery на python

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

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

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

Схема таблиц 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

SQL
##### 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)

Читайте также

Обсудить внедрение аналитики

Оставьте заявку — эксперт Business Metric свяжется с вами

+7

Нажимая на кнопку, вы соглашаетесь с политикой конфиденциальности и офертой на услуги.