[PYTHON] L'histoire de la création d'une base de données à l'aide de l'API Google Analytics

introduction

Google Analytics est un outil d'analyse d'accès à la mer fourni par google. Vous pouvez obtenir diverses informations telles que la zone d'accès, l'heure, l'appareil utilisé, le navigateur, etc. du visiteur du site Wed. Puisque l'interface graphique est également substantielle, il suffit de dire que c'est suffisant, mais comme l'API est également fournie gratuitement, j'ai essayé de faire une connexion API et de créer une base de données.

Connectez-vous à l'API et enregistrez sur MySQL

1. 1. Activer l'API Analytics

Activez l'API depuis la console API Google.

2. Installez la bibliothèque cliente Google

sudo pip install --upgrade google-api-python-client

3. Essayez de vous connecter

Entrez la date et les informations que vous souhaitez obtenir dans la fonction principale et renvoyez le DataFrame.

'''fetch_analytics_data.py'''

from googleapiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
import pandas as pd

SCOPES = ['https://www.googleapis.com/auth/analytics.readonly']
KEY_FILE_LOCATION = '<REPLACE_WITH_JSON_FILE>'
VIEW_ID = '<ID_NUMBER>'


def initialize_analyticsreporting():
    """Initializes an Analytics Reporting API V4 service object.

    Returns:
      An authorized Analytics Reporting API V4 service object.
    """
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        KEY_FILE_LOCATION, SCOPES)

    # Build the service object.
    analytics = build('analyticsreporting', 'v4', credentials=credentials)

    return analytics


def get_report(analytics, start_day, end_day, dimension_list):
    """Queries the Analytics Reporting API V4.

    Args:
      analytics: An authorized Analytics Reporting API V4 service object.
    Returns:
      The Analytics Reporting API V4 response.
    """
    return analytics.reports().batchGet(
        body={
            'reportRequests': [
                {
                    'viewId': VIEW_ID,
                    'dateRanges': [{'startDate': start_day, 'endDate': end_day}],
                    # 'metrics': [{'expression': 'ga:sessions'}],
                    'dimensions': dimension_list
                    #                         [{'name': 'ga:country'},
                    #                          {'name': 'ga:browser'},
                    #                          {'name': 'ga:city'},
                    #                          {'name': 'ga:sex'}
                    #                         ]
                }]
        }
    ).execute()


def fetch_columns_name(response):
    col_name = [i.lstrip('ga:') for i in list(list(list(response.values())[0][0].values())[0].values())[0]]
    #     col_name.append('visitor')
    return col_name


def split_dimensions(response, col_name):
    df = pd.json_normalize(response.get('reports'), sep=' ')["data rows"]
    df = pd.json_normalize(df[0])

    # split dimensions
    for i in range(len(df['dimensions'][0])):
        new_feature = [df['dimensions'][j][i] for j in range(df.shape[0])]
        feature_name = col_name[i]
        df[feature_name] = new_feature
    df.drop(["dimensions"], axis=1, inplace=True)

    # fetch visitor (not use now)
    # df["visitor"] = [int(list(df['metrics'][i][0].values())[0][0]) for i in range(df.shape[0])]
    df.drop(['metrics'], axis=1, inplace=True)

    return df

def main(start_day, end_day, dim_list):
    analytics = initialize_analyticsreporting()
    response = get_report(analytics, start_day, end_day, dim_list)
    col_name = fetch_columns_name(response)
    df = split_dimensions(response, col_name)
    return df

if __name__ == "main":
    main()

4. Exporter vers la base de données

Comme il y a une limite à la quantité d'informations qui peuvent être tirées en même temps dans la version gratuite, elles sont acquises en quatre parties.

import pandas as pd
import fetch_analytics_data as fa
from database_connect import database_engine
import sys
from sqlalchemy import create_engine

# -----------------------------------------------------------------
dim_list1 = [
    # Geo Network
    {'name': 'ga:country'},
    {'name': 'ga:city'},
    {'name': "ga:continentId"},

    ## Platform of Device
    {'name': "ga:browser"},

    ## Users
    {'name': 'ga:userType'},
    {'name': 'ga:sessionCount'},
    {'name': 'ga:daysSinceLastSession'},
    # {'name': 'ga:userDefinedValue'},
    # {'name': 'ga:userBucket'},

    ## session
    {'name': 'ga:sessionDurationBucket'},

    ## Time
    {'name': 'ga:dateHourMinute'},
]

# ----------------------------------------------------------------
dim_list2 = [
    ## Geo Network
    {'name': 'ga:city'},

    ## Platform of Device
    # {'name':"ga:operatingSystem"},
    # {'name':'ga:mobileDeviceBranding'},
    # {'name':'ga:mobileDeviceModel'},
    # {'name':"ga:mobileInputSelector"},
    # {'name':"ga:mobileDeviceInfo"},
    # {'name':'ga:mobileDeviceMarketingName'},
    {'name': 'ga:deviceCategory'},

    ## Page Tracking
    {'name': 'ga:pagePath'},
    {'name': 'ga:exitPagePath'},
    {'name': 'ga:pageDepth'},
    # {'name':'ga:pageTitle'},

    ## Time
    {'name': 'ga:dateHourMinute'},
]

# ---------------------------------------------------------------
dim_list3 = [
    # Geo Network
    {'name': 'ga:city'},

    ## Traffic Sources
    {'name': "ga:referralPath"},
    # {'name': "ga:campaign"},  # all not set
    {'name': "ga:source"},
    {'name': "ga:medium"},
    {'name': "ga:sourceMedium"},
    {'name': "ga:hasSocialSourceReferral"},

    ## Time
    {'name': 'ga:dateHourMinute'},
]

# -----------------------------------------------------------------
dim_list4 = [
    ## Geo Network
    {'name': 'ga:city'},

    ## Platform of Device
    {'name': "ga:operatingSystem"},
    {'name': 'ga:mobileDeviceBranding'},
    {'name': 'ga:mobileDeviceModel'},
    {'name': "ga:mobileInputSelector"},
    {'name': "ga:mobileDeviceInfo"},

    ## Time
    {'name': 'ga:dateHourMinute'},
]

# -----------------------------------------------------------

def database_engine():
      db_url = '<Database_URL>'
      engine = create_engine(db_url)
      return engine

def main():
    start_day = sys.argv[1]
    end_day = sys.argv[1]
    df1 = fa.main(start_day, end_day, dim_list1)
    df2 = fa.main(start_day, end_day, dim_list2)
    df3 = fa.main(start_day, end_day, dim_list3)
    df4 = fa.main(start_day, end_day, dim_list4)
    # merge
    df = pd.merge(df1, df2, on=['city','dateHourMinute'], how='outer').merge(df3, on=['city','dateHourMinute'], how='outer').merge(df4, on=['city','dateHourMinute'], how='outer')
    en = database_engine()
    df.to_sql('analytics_table', con=en, if_exists='append', index=False)

if __name__ == '__main__':
    main()


Recommended Posts

L'histoire de la création d'une base de données à l'aide de l'API Google Analytics
Une histoire sur un débutant Python essayant d'obtenir des résultats de recherche Google à l'aide de l'API
L'histoire de l'exportation d'un programme
L'histoire de la création d'un site qui répertorie les dates de sortie des livres
L'histoire du traitement A du blackjack (python)
Créer une feuille de calcul Google à l'aide de l'API Python / Google Data
Une histoire qui visualise le présent de Qiita avec Qiita API + Elasticsearch + Kibana
J'ai essayé d'utiliser l'API Google Cloud Vision
Laisser Python mesurer le score moyen d'une page à l'aide de l'API PageSpeed Insights
L'histoire de Django créant une bibliothèque qui pourrait être un peu plus utile
L'histoire de la création de Botonyan qui renvoie le contenu de Google Docs en réponse à un mot-clé spécifique sur Slack
L'histoire de sys.path.append ()
L'histoire du lancement d'un serveur Minecraft depuis Discord
Une histoire qui réduit l'effort de fonctionnement / maintenance
Découpez une partie de la chaîne à l'aide d'une tranche Python
L'histoire de la création d'un réseau neuronal de génération musicale
Créez une carte thermique de tweet avec l'API Google Maps
J'ai essayé d'utiliser l'API de Sakenowa Data Project
Une histoire sur le changement du nom principal de BlueZ
Le problème Zip 4 Gbyte est une histoire du passé
Une histoire qui a analysé la livraison de Nico Nama.
L'histoire de l'utilisation de Circleci pour construire des roues Manylinux
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
L'histoire de l'introduction d'une fonction d'authentification multifacteur utilisant un mot de passe à usage unique dans une application Java
Je suis à Singapour en ce moment Une histoire sur la création d'un LineBot et la volonté de faire un travail mémorable
Éviter les pièges de l'utilisation d'un Mac (pour les utilisateurs Linux?)
L'histoire de la construction de Zabbix 4.4
L'histoire de la création d'un «espace de discussion sur l'esprit et le temps» exclusivement pour les ingénieurs de l'entreprise
À propos de l'événement de changement de caméra de l'API Google Maps Android
Essayez d'utiliser l'API Twitter
L'histoire du champ de modèle Django disparaissant de la classe
Création d'un script Python prenant en charge l'API e-Stat (ver.2)
Créez un robot de réponse automatique en temps réel à l'aide de l'API Twitter Streaming
Essayez d'utiliser l'API Twitter
Une histoire qui contribue à une nouvelle analyse corona à l'aide d'un essai gratuit de Google Cloud Platform
Afficher le contenu de la file d'attente à l'aide de l'API Web de gestion RabbitMQ
Essayez d'utiliser l'API PeeringDB 2.0
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
Publions l'API de super résolution à l'aide de Google Cloud Platform
L'histoire de la création d'un bot de boîte à questions avec discord.py
J'ai essayé d'automatiser la construction d'un environnement pratique à l'aide de l'API SoftLayer d'IBM Cloud
Un mémorandum d'utilisation de eigen3
[Affichage de la carte] Affichez une carte à partir de l'adresse enregistrée par l'utilisateur à l'aide de l'API JavaScript de Google Maps et de l'API de géocodage!
J'ai essayé d'utiliser l'API Google avec Ruby et Python - Faites de la base de données une feuille de calcul et gérez-la avec Google Drive
L'histoire de la création d'un Bot qui affiche les membres actifs dans un canal spécifique de Slack avec Python
Une histoire coincée avec l'installation de la bibliothèque de machine learning JAX
J'ai essayé d'obtenir une base de données sur les courses de chevaux en utilisant Pandas
L'histoire de l'erreur de hachage est apparue lors de l'utilisation de Pipenv
L'histoire de la création d'un pilote standard pour db avec python.
Évaluer les performances d'un modèle de régression simple à l'aide de la validation d'intersection LeaveOneOut
Essayez d'utiliser Elasticsearch comme base de votre système de questions et réponses
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 1)
Les débutants en Python utilisent l'API non officielle de Google Play Music pour jouer de la musique
[SEO] Flux / exemple de code lors de l'utilisation de l'API Google Analytics en Python