[PYTHON] Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API

Einführung

Google Analytics ist ein Tool zur Analyse des Mi-Zugriffs, das von Google bereitgestellt wird. Sie können verschiedene Informationen wie den Zugriffsbereich, die Uhrzeit, das verwendete Gerät, den Browser usw. des Besuchers der Mi-Site abrufen. Da die GUI ebenfalls umfangreich ist, reicht es zu sagen, dass sie ausreicht. Da die API jedoch auch kostenlos bereitgestellt wird, habe ich versucht, eine API-Verbindung herzustellen und eine Datenbank zu erstellen.

Stellen Sie eine Verbindung zur API her und speichern Sie sie in MySQL

1. 1. Aktivieren Sie die Analytics-API

Aktivieren Sie die API über die Google API-Konsole.

2. Installieren Sie die Google Client Library

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

3. Versuchen Sie eine Verbindung herzustellen

Geben Sie das Datum und die Informationen ein, die Sie in der Hauptfunktion erhalten möchten, und geben Sie den DataFrame zurück.

'''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. In Datenbank exportieren

In der kostenlosen Version ist die Menge an Informationen, die gleichzeitig abgerufen werden können, begrenzt, sodass sie in vier Schritten erfasst werden.

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

Die Geschichte des Erstellens einer Datenbank mithilfe der Google Analytics-API
Eine Geschichte über einen Python-Anfänger, der versucht, Google-Suchergebnisse mithilfe der API abzurufen
Die Geschichte des Exportierens eines Programms
Die Geschichte der Erstellung einer Website, auf der die Veröffentlichungsdaten von Büchern aufgeführt sind
Die Geschichte der Verarbeitung A von Blackjack (Python)
Erstellen einer Google-Tabelle mit der Python / Google Data-API
Eine Geschichte, die die Gegenwart von Qiita mit Qiita API + Elasticsearch + Kibana visualisiert
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Lassen Sie Python die durchschnittliche Punktzahl einer Seite mithilfe der PageSpeed Insights-API messen
Die Geschichte von Django, wie er eine Bibliothek erstellt, die vielleicht etwas nützlicher ist
Die Geschichte der Erstellung von Botonyan, das den Inhalt von Google Text & Tabellen als Antwort auf ein bestimmtes Keyword in Slack zurückgibt
Die Geschichte von sys.path.append ()
Die Geschichte des Starts eines Minecraft-Servers von Discord
Eine Geschichte, die den Aufwand für Betrieb / Wartung reduziert
Schneiden Sie einen Teil der Zeichenfolge mit einem Python-Slice aus
Die Geschichte eines neuronalen Netzwerks der Musikgeneration
Erstellen Sie eine Tweet-Heatmap mit der Google Maps-API
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Eine Geschichte über die Änderung des Master-Namens von BlueZ
Zip 4 Gbyte Problem ist eine Geschichte der Vergangenheit
Eine Geschichte, die die Lieferung von Nico Nama analysierte.
Die Geschichte der Verwendung von Circleci zum Bau vieler Linux-Räder
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Die Geschichte der Einführung einer Multi-Faktor-Authentifizierungsfunktion unter Verwendung eines Einmalkennworts in einer Java-Anwendung
Ich bin gerade in Singapur. Eine Geschichte über das Erstellen eines LineBot und den Wunsch, einen unvergesslichen Job zu machen
Vermeiden Sie die Fallstricke bei der Verwendung eines Mac (für Linux-Benutzer?)
Die Geschichte des Baus von Zabbix 4.4
Die Geschichte der Schaffung eines "Geist- und Zeit-Chatrooms" exklusiv für Ingenieure im Unternehmen
Informationen zum Kamerawechselereignis der Google Maps Android API
Versuchen Sie es mit der Twitter-API
Die Geschichte des Django-Modellfeldes verschwindet aus der Klasse
Erstellen eines Python-Skripts, das die e-Stat-API unterstützt (Version 2)
Erstellen Sie mithilfe der Twitter-Streaming-API einen Echtzeit-Bot für die automatische Antwort
Versuchen Sie es mit der Twitter-API
Eine Geschichte, die mithilfe einer kostenlosen Testversion der Google Cloud Platform zu einer neuen Koronaanalyse beiträgt
Zeigen Sie den Inhalt der Warteschlange mithilfe der RabbitMQ Management-Web-API an
Versuchen Sie es mit der PeeringDB 2.0-API
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Lassen Sie uns die Super Resolution API mithilfe der Google Cloud Platform veröffentlichen
Die Geschichte, wie man mit discord.py einen Fragenkasten-Bot erstellt
Ich habe versucht, die Erstellung einer praktischen Umgebung mithilfe der SoftLayer-API der IBM Cloud zu automatisieren
Ein Memorandum zur Verwendung von eigen3
[Kartenanzeige] Zeigen Sie eine Karte anhand der vom Benutzer registrierten Adresse mit der JavaScript-API und der Geokodierungs-API von Google Maps an!
Ich habe versucht, die Google-API mit Ruby und Python zu erreichen. Machen Sie die Datenbank zu einer Tabelle und verwalten Sie sie mit Google Drive
Die Geschichte des Erstellens eines Bots, der aktive Mitglieder in einem bestimmten Slack-Kanal mit Python anzeigt
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
Ich habe versucht, mit Pandas eine Pferderenn-Datenbank zu erstellen
Die Geschichte, dass ein Hash-Fehler bei der Verwendung von Pipenv auftrat
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
Bewerten Sie die Leistung eines einfachen Regressionsmodells mithilfe der LeaveOneOut-Schnittstellenvalidierung
Versuchen Sie, Elasticsearch als Grundlage für Ihr Frage- und Antwortsystem zu verwenden
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 1)
Python-Anfänger nutzen die inoffizielle API von Google Play Music, um Musik abzuspielen
[SEO] Flow / Beispielcode bei Verwendung der Google Analytics-API in Python