目前主流的网站分析工具一般都是通过JavaScript检测的方式进行访问监控的,包括商业产品(Omniture)、免费产品(GA/百度统计/CNZZ)、开源产品(Piwik)。虽然说原理大致相同,但是不同的工具在一些基础的统计方法上方式还是有一些微妙的差别。譬如,你在使用多种网站分析工具对同一个网站进行监控时,经常会发现不同的工具给出的Visits总是会有差异(绝对数量有差异,但趋势一致)。即使理论上所有外部条件都一样,这种差异也是会存在的。这是因为不同网站分析工具在Cookie的使用和访次切分的策略有一些差异。
Visits是网站分析的基础,因此有必要不深入了解一下里面的“秘密”。
在展开这个话题之前,有必要做一些科普性的介绍,当然如果你精通javascript和cookie,完全可以跳过这一段。
两种不同的Cookie:
- 第一方Cookie:由您浏览器访问的网站所设置。
- 第三方Cookie:由您所浏览器访问网站的合作伙伴设置而成,通常通过嵌入javascript的方式实现。安全级别比第一方Cookie要低。
Cookie跨域访问问题:
- 网页中嵌入的第三方javascript有权限读取和设置第一方cookie和第三方Cookie。
- 当浏览器打开某个网站(如:abc.com/index.html)时,在发起HTTP请求时,只会携带abc.com域下的Cookie(第一方Cookie)。
- 网页中嵌入的第三方javascript可以向第三方服务器发起HTTP请求,在发起HTTP请求时,只会携带第三方域下的Cookie(第三方Cookie)。
基于javascript网站监控:
当网民访问一个安装了监控代码(javascript)的网页时,web浏览器会发送两个HTTP请求(如下图)。
- 根据浏览器地址栏的url,访问网站服务器(abc.com),此HTTP请求会携带abc.com域名下Cookie(第一方Cookie)
- 当网页加载完成后,监控代码中的javascript将会被执行,javascript获取referer、第一方Cookie(跨域)、第三方Cookie等信息,组装HTTP请求包后向监控服务器(analytics.com)发送数据。
科普的知识介绍完了,如果你还是有不太理解的地方,建议Google或Baidu一下,这会对你了解网站分析工具非常有帮助。
Cookie的使用,GA vs 百度统计 vs Piwik:
- GA:第一方Cookie
- 百度统计:第一方Cookie+第三方Cookie
- Piwik:第三方Cookie
GA的Cookie设置及访次切分规则
在默认的配置和使用情况下,Google Analytics(分析)仅会设置表中的4 个 Cookie。(详见:http://code.google.com/intl/zh-CN/apis/analytics/docs/concepts/gaConceptsCookies.html)
名称 | 用途 | 有效期 | 类型 |
__utma | Visitor Identifier | 2 年 | 第一方Cookie |
__utmb | Visit(Session) Identifier | 30 分钟 | 第一方Cookie |
__utmc | Visit(Session) Identifier | Session | 第一方Cookie |
__utmz | Campaign Values | 6 个月 | 第一方Cookie |
如果访客在网站上处于非活动状态的时间超过30 分钟(__utmb失效),或者退出了浏览器(__utmc失效),那么这次Visit将结束。无论缺少__utmb或__utmc,GA都会确定开始新的Visit。GA允许你使用 _setSessionCookieTimeout() 方法自定义默认会话时间的长度。
GA Cookie详情:
(1)__utma ,Visitor识别Cookie
通常来说“Time of initial”<“Beginning of previous session”<“Beginning of current session”,但由于这三个时间戳都是由客户端javascript计算得到的,所以三个值并没有严格的顺序关系,在访客操作系统时间出现误差时,有可能出现“Beginning of previous session”>“Beginning of current session”的情况。因此“Time of initial”、“Beginning of previous session”、“Beginning of current session”这三个跟访问相关的时间戳在GA服务器端统计时,只是作为visit unique id使用,并没有统计时间上意义。
Session counter就像它的名字一样就是用来计数的,记录当前访客访问此网站的次数。
(2)__utmb && __utmc,Visit识别Cookie
以上是早些__utmb 和 __utmc的值,非常简单只有Domain Hash的值。从最新GA的Cookie来看,__utmb已经有所变化。
如上图,最新的__utmb包含domain_hash.current_session_pageviews.unknown.current_session_inittime。第三个字段暂时不知道
是什么意思,在我的Firefox和Opera浏览器始终是10,你是知情人的话,请留言,谢谢。
(3)__utmz,来源识别Cookie(Google官方称之为Campaign Values)
__utmz主要是用于记录访客流量来源数据。GA在访客回访时,会根据前后两次的来源决定Visit的“来源归属”。Visit来源归属决策遵循以下规则:
- 投放活动永远能覆盖别的渠道
- 自然搜索永远能覆盖别的渠道
- 推介网站永远能覆盖别的渠道
- 直接输入永远覆盖不了别的渠道
百度统计的Cookie设置及访次切分规则
百度统计使用了两种Cookie,第三方Cookie用于识别访客,第一方Cookie。
名称 | 用途 | 有效期 | 类型 |
HMACCOUNT | Visitor Identifier,全局唯一 | 永久 | 第三方Cookie,hm.baidu.com域 |
Hm_lvt_siteid | 记录访客当前访问序列的开始时间,如果没有设置这个cookie,则访客为新访客。当本次访问是一个新的访问开始时,更新该cookie为当前时间。 |
1年 | 第一方Cookie |
Hm_lpvt_siteid | 当前浏览页面时的时间,每次浏览时设置该cookie为当前时间。 | Session | 第一方Cookie |
在百度统计中,以下三条任意一个条件成立,则认为是一个新访次。
- 流量来源(referer)为非本站
- Hm_lpvt_siteid为空
- 服务器端进行计算,一个visit超过30分钟没有流量,结束当前访次
百度统计对Cookie的使用非常简单,多数的状态信息存储和计算在服务器端进行。这种数据构架方式,对服务器端的统计程序来讲无疑是非常大的挑战(有机会我会单独写一篇文章介绍一下)。
补充:百度统计对于Visit来源归属决策是采用强制覆盖的方式。
Piwik的Cookie设置及访次切分规则
名称 | 用途 | 有效期 | 类型 |
piwik_visitor | 天书 | 2年 | 第三方Cookie |
1%3DYTo2OntpOjE7czozMjoiNDhmODY0MTlhOWUyNmIxYTBlYWI4MjU3NmI4NjgyMmQiO2k6MjtpOjEyOTM3MDI3Njc7aTozO2k6MTI5MzcwMjc2NztpOjQ7czoxOiI3IjtpOjU7czoxOiIyIjtpOjExO2k6MTt9%3A_%3Df755e0a15992cbfa6715890342520e0daa1c562b
上面是一个完整的piwik_visitor Cookie的值,看完后你一定很崩溃,真是又臭又长。还好Piwik是一款开源的工具,不然我这辈子是不能指望能理解上面这段天书的意思了。将“天书”解密,我们会看到它的真实面目。
piwik_visitor解密后是一个多维数组,形式如piwik_visitor[siteid][key],针对某个siteid,有以下几个key-value对。
key名称 | 用途 | 备注 |
IDVISITOR | Visitor Identifier | 2年 |
TIMESTAMP_LAST_ACTION | 当前Visit最近一次行动(浏览)时间 | GA使用第一方Cookie,都是由js进行设置。而Pikiw中的Cookie是由服务器端来设置的,因此TIMESTAMP是服务器端的时间。 |
TIMESTAMP_FIRST_ACTION | 当前Visit第一次行动(浏览)时间 | |
ID_VISIT | Visit Identifier | |
ID_LAST_ACTION | 上一次行动ID | |
REFERER_TIMESTAMP | 来源时间 | |
REFERER_NAME | 来源名称 | |
REFERER_KEYWORD | 来源关键词 | |
VISITOR_RETURNING | 访客类型new or return |
Piwik新访次判断条件:
- 访问来自于一个新访客。
- TIMESTAMP_LAST_ACTION离当前时间超过30分钟
是否新访客,取决是否存在piwik_visitor Cookie,以及Cookie解密后一些合法性的检查。对于第一步检查失败,本应沦为“新访客”的可怜虫,Piwik还提供了一个非常温馨的选项 “enable_detect_unique_visitor_using_settings”。如果 enable_detect_unique_visitor_using_settings设置打开,那么Piwik会根据你当次的ip、浏览器、操作系统等属性在所有的历史记录中寻找你活动的痕迹,如果能匹配到,那么你就有了“旧访客”的身份了(当然这个是以牺牲性能为代价的)。
Piwik使用一个独立第三方的Cookie来管理所有站点信息,适用于单个或少量站点的使用,对于需要监控多个站点的使用者来说存在一定的风险。
评价与总结
GA:
- [Cookie]充分、大胆的使用Cookie进行信息存储。
- [访次切分]访次切分的设计比较合理。
- [备注]基本成为业界的标准。
百度统计:
- [Cookie]Cookie使用上还不够大胆。
- [访次切分]访次切分依赖于来源判断,相对于GA的统计方法容易出现访次虚高的现象。
- [备注]Cookie中没有保持任何访次的状态信息,那么统计程序需要保存所有没有结束的Visit的状态信息。对于每天上亿访次服务来讲,长远来看这种设计的性能和扩展性无疑会受到非常大的挑战。
Piwik:
- [Cookie]Cookie加密验证的方式一定程度上减轻了Cookie的存储量,也提高了恶意攻击者伪造Cookie成本。但Piwik将所有的信息保存在第三方Cookie中,多站点情况下有Cookie溢出的风险。
- [访次切分]访次切分规则GA非常类似。
- [备注]适合单个小流量站点的监控,统计和查询算法性能很差。