Google Analytics(GA)谷歌分析快速入门,python代码获取数据

说实话,不喜欢用博客园的编辑器,是在是太low了。
虽然博客园的文章一旦写出来,还是好看,至少在技术博客方面是这样。
但我还是决定来简书写技术博客,虽然简书上可能阅读量会比较小,但我不是来博阅读量的,我只是写博客,仅此而已。


这一次,我们来讲讲谷歌分析。

谷歌分析(Google Analytics)

谷歌分析全名是Google Analytics,俗称GA。GA是一个网站数据统计分析平台,功能非常强大,只要在网站的页面上加入一段代码,就可以提供丰富详尽的图表式报告。
利用GA,我们可以方便的对网站运营状态,用户数据等进行查看,下面就是一个GA视图的主页。

image.png

点开左边的实时、受众群体、流量获取、行为等,可以获得更为详尽的内容。
综合来说,常常查看的数据有三类:用户和会话数、网页浏览数量、事件的点击次数,一般的市场人员都可以点击查看。
作为比较专业的数据从业者,则需要通过GA的API接口,获取更为详尽的数据报告。下面我就分享一下,如何用python获取GA上的数据。

使用python快速获取GA数据报告

python是做数据的优秀语言,有许多优秀的数据分析库供选择,如果你还不会python,那赶紧去学一学吧!
python基础学习推荐
所以此处,我便默认你已经有了python的基础。开始吧!

准备工作

准备工作包括:获取秘钥和邮件地址、安装谷歌分析第三方包。

  1. 秘钥
    秘钥分为两种:json类型与p12文件类型
    这两种类型对于一般的数据获取工作区别不大,而且一般是由管理员(也就是开发人员)提供,它可以在下面这个链接里面操作生成:秘钥获取
    获取到秘钥以后,我们在创建GA的链接服务时需要用到,如下所示,你只需要其中一个即可。


    邮件地址则是类似于这样的:admin-××××-com@××××-1141.iam.gserviceaccount.com
    使用此电子邮件地址将用户添加到要通过 API 访问的 Google Analytics数据视图。一般来说只需要用到读取和分析权限。

  2. 安装谷歌分析库
    使用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版本的服务依然可用,这中间的差别一两句话说不清,但是首先要会用了再说。
我们导入包的时候,出现了两个:oauth2clientgoogleapiclient,果然跟我们安装的时候不一样吧!
我们首先新建一个GA类:Conn_GA
在初始化函数中,给出了一个视图id,然后是资源路径,最后就是一个None类型的服务对象。

  • 什么是视图id呢,请看下图


    视图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返回。
  • 最后就是对这个函数的应用了。我们可以获取网站的会话数、用户数、网页浏览量等。

这里面的知识点还是不少:

  1. 首先你需要知道,我们的服务对象有哪些函数可以调用,请戳:Google Analytics API v3
  2. 对于最常用的函数service.data().ga().get(),你需要知道它有哪些参数可以设置,请戳:Core Reporting API
  3. 对于最常用到的参数metrics和dimentions,它们都可以取哪些值?分别代表什么意思?请戳:Dimensions & Metrics Explorer
    注意,这个是v4版本的,但你完全不用担心,它们是兼容的。
  4. 最后,对于过滤器filter,它可以使用正则表达式,如果你不熟悉,请戳:正则表达式

说句实话,GA包含的东西真不少,我也是摸索了很久才勉强学会,如果你遇到问题了,千万不要心浮气躁,要学会找方法,多问人,当然,你在评论区留言我也很欢迎,我一定会尽心为你解答的!
最后,祝大家早日掌握,共勉!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容