GA因为其强大的功能而备受一些企业的青睐,但由于是免费的,GA提供的数据存在抽样的,导致数据的准确大大降低,但GA也提供一些API接口给用户,通过GA API分页查询功能能降低抽样的比例,甚至是没有抽样。
首先在Google APIs创建GA API授权,其中一共有三种授权方式:
- API密钥:简单通用型;
- Oauth2.0客户端ID:应用访问型,如web端;
- 服务账户密钥: 主要适用于服务器间
整体来说是通用的,要适用GA API,需要先创建服务账号密钥,生成id
R
需要安装 RGoogleAnalytics
library(httpuv)
require(RGoogleAnalytics)
token <- Auth(client.id=paste("156582067107-2c86apnook88a9fnn1knu7egbpjst***.",
"apps.googleusercontent.com", sep=""),
client.secret="bKu-j2SYVpbkQYWAyvuFepKJ")
save(token,file="./1token_file")
ValidateToken(token)
query.list <- Init(start.date = "2016-8-10", # 设置开始日期
end.date = "2016-8-24", # 设置结束日期
dimensions = "ga:eventAction, ga:eventLabel",
metrics = "ga:totalEvents",
max.results = 10000,
#segments="users::condition::ga:dimension1=~[a-zA-z0-9]",
sort = "-ga:totalEvents",
table.id = "ga:******") # 设置分站 view id
ga.query <- QueryBuilder(query.list)
ga.data <- GetReportData(ga.query, token, split_daywise = T)
write.csv(ga.data,file="D:/gadata/0810-0824/test.csv",fileEncoding = "UTF-8") # 设置导出文件名
RGoogleAnalytics这个包已经将GA提供的分页查询功能封装进去了,所以RGoogleAnalytics官方说是能够提供接近精确的数据。
Python
Python的比较简单,基本是按照官方两个例子导入,再加载就可以,具体提取数据是用service.data().ga().get()方法,
import install_ga_demo as gaapi
import json
service=gaapi.get_service('analytics','v3','scope','client_secrets.json')
profile_id='10506***'
data=service.data().ga().get(
ids='ga:'+profile_id,
start_date='2016-07-01',
end_date='2016-08-10',
max_results='20000',
metrics='ga:users',
dimensions='ga:date',
sort='ga:date',
segment='users::condition::ga:deviceCategory==desktop').execute()
a=json.dumps(data['rows'])
print(data['rows'])
分页查询
GA API的数据每次只能够返回1W条数据,GA里面最高为5K,但通过分页查询,可以尽可能的返回数据,虽然还是存在抽样。分页查询其实是往这个URL:https://www.googleapis.com/analytics/v3/data/ga? …\&start-index=10001&max-results=10000请求数据,通过修改每次请求的start-index和max_results再做循环就可以尽可能多抽取数据,下面是我做将在Python将数据扩大到100w,同时插入数据库,耗费1h,主要是GA API对请求频率有一定的限制,而且目前程序还是单线程的。
start_time=time.time()
for i in range(10000):
a=[]
aa=service.data().ga().get(
ids='ga:' + profile_id,
start_index=str(1+i*10000),
max_results='10000',
start_date='2015-01-01',
end_date='today',
samplingLevel=None,
dimensions='ga:date,ga:pagePath,ga:city,ga:language,ga:browser,ga:campaign,ga:medium',
metrics='ga:users,ga:sessions,ga:newUsers').execute()
data1=list(aa['rows'])
try:
# cursor.executemany('insert into gatestp2016 (date,pagePath,city,language,browser,campaign,medium,sessions,users,newusers) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',data1)
# db.commit()
print("已经插入%d万条数据" %int(1+i))
if len(data1)<10000:
break
except TypeError as e:
print(e)
print("Done!")
end_time=time.time()-start_time
print('共耗时:%d s' %int(end_time))
在请求数据的过程中,最重要的就是service.data().ga().get()中的参数吗,如逗号表示or,分号表示和,其他的如:
其他具体查看:https://developers.google.com/analytics/devguides/reporting/core/v3/reference?hl=zh-cn