说实话,不喜欢用博客园的编辑器,是在是太low了。
虽然博客园的文章一旦写出来,还是好看,至少在技术博客方面是这样。
但我还是决定来简书写技术博客,虽然简书上可能阅读量会比较小,但我不是来博阅读量的,我只是写博客,仅此而已。
这一次,我们来讲讲谷歌分析。
谷歌分析(Google Analytics)
谷歌分析全名是Google Analytics,俗称GA。GA是一个网站数据统计分析平台,功能非常强大,只要在网站的页面上加入一段代码,就可以提供丰富详尽的图表式报告。
利用GA,我们可以方便的对网站运营状态,用户数据等进行查看,下面就是一个GA视图的主页。
点开左边的实时、受众群体、流量获取、行为等,可以获得更为详尽的内容。
综合来说,常常查看的数据有三类:用户和会话数、网页浏览数量、事件的点击次数,一般的市场人员都可以点击查看。
作为比较专业的数据从业者,则需要通过GA的API接口,获取更为详尽的数据报告。下面我就分享一下,如何用python获取GA上的数据。
使用python快速获取GA数据报告
python是做数据的优秀语言,有许多优秀的数据分析库供选择,如果你还不会python,那赶紧去学一学吧!
python基础学习推荐
所以此处,我便默认你已经有了python的基础。开始吧!
准备工作
准备工作包括:获取秘钥和邮件地址、安装谷歌分析第三方包。
-
秘钥
秘钥分为两种:json类型与p12文件类型
这两种类型对于一般的数据获取工作区别不大,而且一般是由管理员(也就是开发人员)提供,它可以在下面这个链接里面操作生成:秘钥获取
获取到秘钥以后,我们在创建GA的链接服务时需要用到,如下所示,你只需要其中一个即可。
邮件地址则是类似于这样的:admin-××××-com@××××-1141.iam.gserviceaccount.com
使用此电子邮件地址将用户添加到要通过 API 访问的 Google Analytics数据视图。一般来说只需要用到读取和分析权限。 安装谷歌分析库
使用pip安装:
pip install google-api-python-client
注意这个包在安装时候的名字:google-api-python-client,这个api包含了许多东西,也有不少依赖包,并且在引用该包的时候,名字又不一样。
开始写Python代码
1. 创建GA连接服务
我先用json格式的秘钥来创建一个服务,下面是代码:
import os
from oauth2client.service_account import ServiceAccountCredentials
from googleapiclient.discovery import build
import httplib2
class Conn_GA:
"""
google analytic 服务
"""
def __init__(self):
# 以下是各个视图id
self.fot_viewID = 122164865
# path
self.KEY_FILE_LOCATION_JSON = os.path.abspath("static\\Fotor-6cc1808ee2dc.json")
self.SCOPE = ['https://www.googleapis.com/auth/analytics.readonly']
# 服务
self.service = None
def get_service_v3_json(self, api_name='analytics', api_version='v3'):
"""Get a service that communicates to a Google API.
Args:
api_name: string The name of the api to connect to.
api_version: string The api version to connect to.
scope: A list of strings representing the auth scopes to authorize for theconnection.
client_secrets_path: string A path to a valid client secrets file.
Returns:
A service that is connected to the specified API.
"""
credentials = ServiceAccountCredentials.from_json_keyfile_name(self.KEY_FILE_LOCATION_JSON, self.SCOPE)
http = credentials.authorize(httplib2.Http(disable_ssl_certificate_validation=True))
service = build(api_name, api_version, http=http)
return service
解释一下,GA的api现在更新到了v4版本,但v3版本的服务依然可用,这中间的差别一两句话说不清,但是首先要会用了再说。
我们导入包的时候,出现了两个:oauth2client 和 googleapiclient,果然跟我们安装的时候不一样吧!
我们首先新建一个GA类:Conn_GA
在初始化函数中,给出了一个视图id,然后是资源路径,最后就是一个None类型的服务对象。
-
什么是视图id呢,请看下图
明白了吧!这就是确定了我们要获取哪个地方的数据!不过,在创建服务的时候,我们当然没用到,因为还没开始获取数据呢!
资源路径,阐明了我们的json秘钥所在位置,以及SCOPE的路径。
这个SCOPE是什么我没怎么关注,我看别人这么写了,我也这么写,但看字面意思就是代表只读吧!
再来说一下秘钥,我放在当前目录下一个static的文件夹内,最后还使用了函数os.path.abspath
获取到他的绝对路径。
为什么要这么做呢?从我的实践经验来看,是为了在跨平台(比如Windows跨到Linux)运行的时候,不需要再修改路径,因为不同平台,它的路径格式是不一样的,如果遇到使用flask框架或者Django框架,则更是体现了这样获取绝对路径的价值,避免了很多因为路径产生的错误!只因GA服务的初始化会花很长一段时间,所以刚刚开始的时候令其为None,只有在用到的时候才为其赋值。
下面我们来讲讲具体的实现过程:
- 因为我们的秘钥是json格式,所以我们使用
ServiceAccountCredentials.from_json_keyfile_name
函数创建了一个credentials对象,参数便是json秘钥和scope - 接着,我们调取credentials对象的授权函数authorize,获得一个http连接对象。其中的disable_ssl_certificate_validation参数加入,是因为在实践过程中,出现了ssl请求错误的情况,经过查阅资料,便将它设置为True解决的,意思大概是不通过ssl验证,或者说绕过ssl验证。
- 最后,我们通过build函数,传入我们需要创建的服务类型(analytics)、版本(v3)、http连接等参数,获取到了一个GA的服务对象。
当然,我们的服务类型还有诸如webmasters等,版本也有v4可以选择,后面我会一并给出各种不同版本的不同类型服务对象。
如果在这里有任何问题,请留言,我定尽心解答!
2. 使用GA连接服务获取数据
现在有了GA的服务对象,我们便可以调用相关的函数,获取我们想要的数据了。
首先,我们需要将上述的服务对象保存在一个单独的config.py文件中,然后新建一个.py文件,在里面导入服务:
from config import Conn_GA
然后,我们就可以使用它了,下面先贴出代码,再解释:
class GAData:
"""国外网站: 除了订阅以外的数据,只统计H5"""
def __init__(self):
# 服务
self.service_v3 = None
# view id
self.H5_VIEW_ID_NATURAL = '137949420'
self.H5_VIEW_ID_PAYMENT = '148343733'
self.H5_VIEW_ID_COUNT = '148243936'
# 起止时间
self.startDays = 2
self.endDays = 1
def connect(self):
# 如果ga服务已启动,就不必重新获取,减少获取数据的时间
if self.service_v3 is None:
try:
self.service_v3 = Conn_GA().get_service_v3_json()
except Exception, e:
# 最好打印一下异常信息,方便调试
print repr(e)
self.service_v3 = Conn_GA().get_service_v3_json()
def set_days(self, start=1, end=1):
# 设置获取数据的起止天数,ga上可以以N days ago 来定义,很方便
self.startDays = start
self.endDays = end
def get_ga_data(self, view_id='141683925', start_date='91daysAgo', end_date='yesterday',
metrics="ga:sessions",
dimensions='ga:date',
filters=None,
max_results=None, **kwargs):
# 不管何时获取ga数据,保证ga service已启动
self.connect()
start_date = '{}daysAgo'.format(self.startDays)
end_date = '{}daysAgo'.format(self.endDays)
# print start_date, end_date
# 如果参数不存在,可以设置为None,一样能运行
ga_data = self.service_v3.data().ga().get(ids='ga:' + view_id, start_date=start_date, end_date=end_date,
metrics=metrics, dimensions=dimensions,
filters=filters, max_results=max_results, **kwargs).execute()
cleaned = pd.DataFrame(ga_data['rows'])
return cleaned
def get_user_data(self):
"""
DAU: 根据session,获取网站每一天的数据,会话数
"""
df_all = None
try:
"""所有从ga上获取的数据,都是基于set_days(self, start=61, end=1)里面的起止时间,在更新之前,一般会手动设定,默认情况下,就是最近2个月"""
# 用户和页面访问信息
df_usage_page = self.get_ga_data(view_id=self.H5_VIEW_ID_NATURAL,
metrics='ga:sessions,ga:avgSessionDuration,ga:users,ga:newUsers,ga:pageviews,ga:uniquePageviews,ga:timeOnPage,ga:avgTimeOnPage')
df_usage_page.columns = ['date', 'sessions', 'avgSessionDuration', 'users', 'newUsers', 'pageviews',
'uniquePageviews', 'timeOnpage', 'avgTimeOnpage']
df_all = df_usage_page
# 图片保存数量
df_pic_save = self.get_ga_data(view_id=self.H5_VIEW_ID_COUNT,
metrics="ga:pageviews",
filters="ga:pagePath=~export_success")
df_all['picSave'] = df_pic_save.iloc[:, 1]
df_all['picSave'] = df_all['picSave'].map(lambda x: int(x) * 4) # 抽样四分之一
# 订阅时,从哪个模块进入的,弹窗展示出处
edit = self.get_ga_data(view_id=self.H5_VIEW_ID_PAYMENT,
metrics='ga:pageviews',
filters='ga:pagePath=~/show/;ga:pagePath=~editor')
df_all['editPay'] = edit.iloc[:, 1]
collage = self.get_ga_data(view_id=self.H5_VIEW_ID_PAYMENT,
metrics='ga:pageviews',
filters='ga:pagePath=~/show/;ga:pagePath=~collage')
df_all['collagePay'] = collage.iloc[:, 1]
design = self.get_ga_data(view_id=self.H5_VIEW_ID_PAYMENT,
metrics='ga:pageviews',
filters='ga:pagePath=~/show/;ga:pagePath=~design')
df_all['designPay'] = design.iloc[:, 1]
except Exception, e:
print repr(e)
df_all['date'] = df_all['date'].map(lambda a: a[:4] + "-" + a[4:6] + '-' + a[6:])
# 打印
print df_all
我可以先大概讲一下我这样写代码的思维:
- 首先新建一个类,里面初始化一些view_id,还有起止时间,以及空服务。服务对象只有在使用的时候才创建,避免不必要的内存消耗。
- 单独给出一个连接服务的函数,只有服务为空的时候才创建,而且使用的try,不成功则再次连接。
- 然后便是给出一个通用的获取数据函数,里面可以传入:时间,view_id,度量和维度,以及过滤条件等!!
其实,get_ga_data
这个函数就是我们的关键,它通过调用服务对象的.data().ga().get()
函数获得数据。
源生的ga数据是json格式,里面有一个rows键,其内容就是我们要的真正数据,将其转化为dataframe返回。 - 最后就是对这个函数的应用了。我们可以获取网站的会话数、用户数、网页浏览量等。
这里面的知识点还是不少:
- 首先你需要知道,我们的服务对象有哪些函数可以调用,请戳:Google Analytics API v3
- 对于最常用的函数
service.data().ga().get()
,你需要知道它有哪些参数可以设置,请戳:Core Reporting API - 对于最常用到的参数metrics和dimentions,它们都可以取哪些值?分别代表什么意思?请戳:Dimensions & Metrics Explorer
注意,这个是v4版本的,但你完全不用担心,它们是兼容的。 - 最后,对于过滤器filter,它可以使用正则表达式,如果你不熟悉,请戳:正则表达式
说句实话,GA包含的东西真不少,我也是摸索了很久才勉强学会,如果你遇到问题了,千万不要心浮气躁,要学会找方法,多问人,当然,你在评论区留言我也很欢迎,我一定会尽心为你解答的!
最后,祝大家早日掌握,共勉!