1.数据分析的概念、分类

数据分析系统的主要功能是从众多的外部系统中,采集相关的业务数据,集中存储到系统的数据库中。系统内部对所有的原始数据通过一系列的处理转换之后存储到数据仓库的基础库中;然后根据业务需要进行一系列的数据转换到相应的数据集市,供其他数据应用组件进行专题分析或者展示。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

数据仓库和数据集市的区别:https://student-lp.iteye.com/blog/2211473

根据数据的流转流程,一般会有以下几个模块:数据采集、数据存储、数据计算、数据分析、数据展示等待。当然也会有在这基础上进行相应变化的系统模型。

按照数据分析的时效性,将数据分析分为实时分析和离线分析两种。实时分析是在时效上有强烈的保证,数据是实时流动的,相应的分析情况也是实时的。而离线分析更多的是对已有的数据进行分析,失效性的要求略低。失效性的标准都是以人可以接收的程度来划分的。

2.数据采集原理分析

当用户访问页面时,浏览器对页面进行加载,同时也会触发页面中的埋点。

埋点是指:在网页中预先加入一小段javascript代码,这个代码片段会动态的创建一个script标签,并将src属性指向一个单独的js文件,此时这个单独的js文件(下图中的绿色节点)会被浏览器请求并执行,这个js文件实际上就是真正的前端数据采集脚本。

数据收集完成以后,js会请求一个后端的数据收集脚本(下图中的backend),这个脚本一般是一个伪装成图片的动态脚本程序,js会将收集到的数据通过http参数的方式传递给它,后端收集脚本解析http参数,并按照固定的格式记录到访问日志,同时可能会在http响应中给客户种植一些用于追踪的cookie,并返回一个1*1像素的图片。整个采集过程,对于用户是透明的。

数据分析之数据采集-学习笔记 随笔 第1张

三、数据采集系统的设计实现

根据原理分析并结合Google Analytics,想搭建一个用户行为数据采集系统,要完成以下几件事情:

1.前端开发

  • 确定要收集的信息以及途径
  • 确定埋点代码
  • 编写javascript日志采集脚本

2.后端开发

  • 设计日志格式
  • 编写后端脚本
  • 做日志切分

3.集成测试

  • 在网站页面进行埋点
  • 检测日志数据

 四、确定需要采集的信息

数据主要来源于Web服务器和前端页面:

数据分析之数据采集-学习笔记 随笔 第2张

五、编写埋点代码

 埋点是网站分析的一种常用的数据采集方法。核心就是在进行数据采集的关键点植入统计代码,进行数据的采集。以下代码为谷歌分析系统(Google Analytics)的埋点代码:

数据分析之数据采集-学习笔记 随笔 第3张

拓展知识:js自调用匿名函数

 格式:(function(){})()

红色括号向脚本返回匿名函数,蓝色括号表示立即执行红色括号返回的匿名函数。

自调用匿名函数的好处:

避免重名,自调用匿名函数只会运行一次,一般用于初始化。

 

 

六、前端数据收集脚本的编写

前端数据收集脚本就是埋点代码中的匿名函数引入并创建在被统计页面的节点树中的外部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>

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄