#python #api #google-analytics
#python #API #google-analytics
Вопрос:
Однако я могу успешно подключиться к API Google Analytics, используя Python в Jupyter Notebook. Если я выберу слишком широкий диапазон дат, я определенно получу выборочные данные. Если я выберу слишком узкий диапазон дат, мне придется сбрасывать даты, вручную запускать мой код снова и снова и объединять несколько CSV. Мне нужны данные как минимум за 2-3 года.
Я думаю, что лучший способ сделать это — разделить запрос и программно перебирать нужные временные рамки, объединяя отчет после завершения. Таким образом, когда вы извлекаете отчет, он будет выглядеть так, как будто вы выполняете один запрос, но на самом деле он выполняет количество запросов за кулисами, основываясь на том, как вы настраиваете детализированное определение разбиения запросов.
Мне также нужен способ автоматического запуска этого кода API для ежедневного или еженедельного получения свежих данных и сохранения их в формате CSV.
Кто-нибудь может помочь мне добавить в мой существующий код способ разбиения запросов (добавить функцию обработки времени) и продолжать дублировать?
# Setup Variables
SCOPES = ["https://www.googleapis.com/auth/analytics.readonly"]
KEY_FILE_LOCATION = "client_secrets.json"
VIEW_ID = "12345678"
# Initializes amp; Authorizes Google Analytics Reporting API v4 Service Object
def initialize_analyticsreporting():
credentials = ServiceAccountCredentials.from_json_keyfile_name(KEY_FILE_LOCATION, SCOPES)
analytics = build("analyticsreporting", "v4", credentials=credentials)
return analytics
# Queries the Google Analytics Reporting API amp; Returns the Response
def get_report(analytics):
return analytics.reports().batchGet(
body={
"reportRequests": [
{
"viewId": VIEW_ID,
"dateRanges": [{"startDate": "2017-01-01", "endDate": "2020-10-30"}],
"metrics": [{"expression": "ga:avgTimeOnPage", "alias": "Avg. Time on Page"},
{"expression": "ga:pageviewsPerSession", "alias": "Pages / Session"},
{"expression": "ga:pageviews","alias": "Pageviews"},
{"expression": "ga:uniquePageviews", "alias": "Unique Pageviews"},
{"expression": "ga:avgSessionDuration", "alias": "Avg. Session Duration"},
{"expression": "ga:bounceRate", "alias": "Bounce Rate"},
{"expression": "ga:sessions", "alias": "Sessions"},
{"expression": "ga:users", "alias": "Users"}],
'dimensions': [{"name": "ga:campaign"},
{"name": "ga:medium"},
{"name": "ga:source"},
{"name": "ga:userType"},
{"name": "ga:date"},
{"name": "ga:pagePath"}],
"samplingLevel": "LARGE",
}]
}
).execute()
response = get_report(initialize_analyticsreporting())
print(response)
# Parses amp; Prints Google Analytics Reporting API Response
def print_response(response):
list = []
for report in response.get("reports", []):
columnHeader = report.get("columnHeader", {})
dimensionHeaders = columnHeader.get("dimensions", [])
metricHeaders = columnHeader.get("metricHeader", {}).get("metricHeaderEntries", [])
rows = report.get("data", {}).get("rows", [])
for row in rows:
dict = {}
dimensions = row.get("dimensions", [])
dateRangeValues = row.get("metrics", [])
for header, dimension in zip(dimensionHeaders, dimensions):
dict[header] = dimension
for i, values in enumerate(dateRangeValues):
for metric, value in zip(metricHeaders, values.get("values")):
if "," in value or "." in value:
dict[metric.get("name")] = float(value)
else:
dict[metric.get("name")] = int(value)
list.append(dict)
df = pd.DataFrame(list)
return df
# Create a Pandas DataFrame With Google Analytics Data
ga_df = pd.DataFrame(print_response(response))
ga_df = ga_df.rename(
columns={"ga:campaign": "Campaign",
"ga:date": "Date",
"ga:medium": "Medium",
"ga:pagePath": "Page",
"ga:source": "Source",
"ga:userType": "User Type",
})
ga_df.head()
ga_df
# Export to CSV
ga_df.to_csv("savedReport.csv")
Ответ №1:
Выделенной функции нет, вы можете создать ее, проверив значение samplesReadCounts
и samplingSpaceSizes
(https://developers.google.com/analytics/devguides/reporting/core/v4/basics#sampling ) в ответе при каждом вызове и в случае выборки предоставьте новый вызов с уменьшенным интервалом, реализующим экспоненциальный откат, чтобы избежать ошибки квоты (https://developers.google.com/analytics/devguides/reporting/core/v4/errors#backoff ).