1.数据分析的概念、分类javascript
数据分析系统的主要功能是从众多的外部系统中,采集相关的业务数据,集中存储到系统的数据库中。系统内部对全部的原始数据经过一系列的处理转换以后存储到数据仓库的基础库中;而后根据业务须要进行一系列的数据转换到相应的数据集市,供其余数据应用组件进行专题分析或者展现。前端
数据仓库和数据集市的区别:https://student-lp.iteye.com/blog/2211473java
根据数据的流转流程,通常会有如下几个模块:数据采集、数据存储、数据计算、数据分析、数据展现等待。固然也会有在这基础上进行相应变化的系统模型。ajax
按照数据分析的时效性,将数据分析分为实时分析和离线分析两种。实时分析是在时效上有强烈的保证,数据是实时流动的,相应的分析状况也是实时的。而离线分析更多的是对已有的数据进行分析,失效性的要求略低。失效性的标准都是以人能够接收的程度来划分的。数据库
2.数据采集原理分析windows
当用户访问页面时,浏览器对页面进行加载,同时也会触发页面中的埋点。后端
埋点是指:在网页中预先加入一小段javascript代码,这个代码片断会动态的建立一个script标签,并将src属性指向一个单独的js文件,此时这个单独的js文件(下图中的绿色节点)会被浏览器请求并执行,这个js文件实际上就是真正的前端数据采集脚本。跨域
数据收集完成之后,js会请求一个后端的数据收集脚本(下图中的backend),这个脚本通常是一个假装成图片的动态脚本程序,js会将收集到的数据经过http参数的方式传递给它,后端收集脚本解析http参数,并按照固定的格式记录到访问日志,同时可能会在http响应中给客户种植一些用于追踪的cookie,并返回一个1*1像素的图片。整个采集过程,对于用户是透明的。数组
3、数据采集系统的设计实现浏览器
根据原理分析并结合Google Analytics,想搭建一个用户行为数据采集系统,要完成如下几件事情:
1.前端开发
2.后端开发
3.集成测试
4、肯定须要采集的信息
数据主要来源于Web服务器和前端页面:
5、编写埋点代码
埋点是网站分析的一种经常使用的数据采集方法。核心就是在进行数据采集的关键点植入统计代码,进行数据的采集。如下代码为谷歌分析系统(Google Analytics)的埋点代码:
拓展知识:js自调用匿名函数
格式:(function(){})();
红色括号向脚本返回匿名函数,蓝色括号表示当即执行红色括号返回的匿名函数。
自调用匿名函数的好处:
避免重名,自调用匿名函数只会运行一次,通常用于初始化。
6、前端数据收集脚本的编写
前端数据收集脚本就是埋点代码中的匿名函数引入并建立在被统计页面的节点树中的外部js文件:ma.js。
数据收集通常要完成如下几个事情:
1.经过浏览器内置对象收集信息:如页面的标题(document.title)、前一个页面的url(document.referer)、用户显示器分辨率(windows.screen)、cookie信息(document.cookie)等等。
2.解析_maq收集用户自定义信息,包括用户自定义的事件跟踪、业务数据(如商品编号、商品价格等)
3.将以上两步收集的数据按预约格式解析并拼接。
4.请求后端数据收集脚本,将信息放在http request参数中携带给后端脚本。
关于步骤4的说明:
js请求后端脚本的方法一般是ajax,可是aja不能实现跨域请求。ma.js是在被统计的网站的域内执行,然后端脚本是在另外一个域中。所以,在步骤4中不能经过ajax的方式来请求后端数据收集脚本。
另外一种可行的办法是:在js脚本中建立一个image对象,将image对象的src属性指向后端脚本并携带参数,实现跨域请求后端。这也是后端脚本为何一般假装成gif文件的缘由。
<script> (function () { var params ={}; // Document对象数据
if(document) { params.domain = document.domain || ''; // 主机名称
params.url = document.url || ''; // url
params.title = document.title || ''; // 网页标题
params.referer = document.referrer || ''; // 上一个页面
} // Window对象数据
if (window && window.screen) { params.sh = window.screen.height || 0; // 页面高度
params.sw = window.screen.width || 0; // 页面宽度
params.cd = window.screen.colorDepth ||0; // 页面颜色深度
} // navigator对象数据
if (navigator) { params.lang = navigator.language || ''; // 页面语言
} // 解析_maq数组数据
if (_maq) { // 遍历-maq数组
for (var i in _maq) { switch (_maq[i][0]) { case '_setAccount': params.account = _maq[i][1] // 网站访客的帐号
break; default: break; } } } // 拼接参数串
var args = ''; for (var i in params) { if (args != '') { args += '&'; // 每一个参数后添加&
} args += i + '=' + encodeURIComponent(params[i]); } // 经过Image对象请求后端脚本
var img = new Image(1,1); // 建立像素为1*1的
img.src = 'http://xxx.xxxx.xxx/log.gif?' + args; })(); </script>