• 网站流量分析项目day01


    1. 背景介绍

    为了盈利,需要收集用户的访问日志来进行分析,根据分析结果提高用户的体验,最终转化为自己会员。

    2. 三种角度分析

    • 网站的眼睛(营销人员):用户喜欢什么,用户常去的页面,用户从哪里来。
    • 网站的神经(技术人员):网站界面不好看,不合理。
    • 网站的大脑(商业角度):投资回报率(ROI)

    3. 三个方面分析

    • 流量:质量和数量的比率
    • 内容:看了导航页就走了,在内容页与导航页来回切换
    • 漏斗模型:两个指标,转换率和流失率

     4. 项目执行流程

    5. 模块开发之数据采集

    a. 数据采集方式

    • web服务器采集:nginx,tomcat(数据有局限性)
    • 埋点采集:采用js埋点

    b. 如何采用js埋点

    • 确定收集信息
    • 确定埋点代码(如何引入:动态创建标签)
    • 埋点实现方式 ms.js 
    (function () {
        var params = {};
        //Document对象数据
        if(document) {
            params.domain = document.domain || ''; 
            params.url = document.URL || ''; 
            params.title = document.title || ''; 
            params.referrer = 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) {
            for(var i in _maq) {
                switch(_maq[i][0]) {
                    case '_setAccount':
                        params.account = _maq[i][1];
                        break;
    				case '_a_value':
                        params.avalue = _maq[i][1];
                        break;
    				case 'type0':
                        params.type0 = _maq[i][1];
                        break;
    				case 'type1':
                        params.type1 = _maq[i][1];
                        break;
    				case 'type2':
                        params.type2 = _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); 
        img.src = 'http://192.168.30.130/log.gif?' + args;
    })();
    
    • 后端代码实现(openrestry(nginx+lua))
    worker_processes  2;
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
    	#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
        #access_log  logs/access.log  main;
    	
        log_format tick "$msec||$remote_addr||$u_domain||$u_url||$u_title||$u_referrer||$u_sh||$u_sw||$u_cd||$u_lang||$http_user_agent||$u_utrace||$u_account||$u_avalue||$u_type0||$u_type1||$u_type2";
        
        #access_log  logs/access.log  tick;
    
        sendfile        on;
    
        keepalive_timeout  65;
    
        server {
            listen       80;
            server_name  localhost;
    		location /log.gif {
    			#伪装成gif文件
    			default_type image/gif;    
    			#本身关闭access_log,通过subrequest记录log
    			access_log off;
    		
    			access_by_lua "
    				-- 用户跟踪cookie名为__utrace
    				local uid = ngx.var.cookie___utrace        
    				if not uid then
    					-- 如果没有则生成一个跟踪cookie,算法为md5(时间戳+IP+客户端信息)
    					uid = ngx.md5(ngx.now() .. ngx.var.remote_addr .. ngx.var.http_user_agent)
    				end 
    				ngx.header['Set-Cookie'] = {'__utrace=' .. uid .. '; path=/'}
    				if ngx.var.arg_domain then
    				-- 通过subrequest到/i-log记录日志,将参数和用户跟踪cookie带过去
    					ngx.location.capture('/i-log?' .. ngx.var.args .. '&utrace=' .. uid)
    				end 
    			";  
    		
    			#此请求不缓存
    			add_header Expires "Fri, 01 Jan 1980 00:00:00 GMT";
    			add_header Pragma "no-cache";
    			add_header Cache-Control "no-cache, max-age=0, must-revalidate";
    		
    			#返回一个1×1的空gif图片
    			empty_gif;
    		}   
    	
    		location /i-log {
    			#内部location,不允许外部直接访问
    			internal;
    		
    			#设置变量,注意需要unescape
    			set_unescape_uri $u_domain $arg_domain;
    			set_unescape_uri $u_url $arg_url;
    			set_unescape_uri $u_title $arg_title;
    			set_unescape_uri $u_referrer $arg_referrer;
    			set_unescape_uri $u_sh $arg_sh;
    			set_unescape_uri $u_sw $arg_sw;
    			set_unescape_uri $u_cd $arg_cd;
    			set_unescape_uri $u_lang $arg_lang;
    			set_unescape_uri $u_utrace $arg_utrace;
    			set_unescape_uri $u_account $arg_account;
    			set_unescape_uri $u_avalue $arg_avalue;
    			set_unescape_uri $u_type0 $arg_type0;
    			set_unescape_uri $u_type1 $arg_type1;
    			set_unescape_uri $u_type2 $arg_type2;
    		
    			#打开日志
    			log_subrequest on;
    			#记录日志到track.log,实际应用中最好加buffer,格式为tick
    			access_log /var/nginx_logs/ma.log tick;
    		
    			#输出空字符串
    			echo '';
    		}	
    	
        }
    }
    
    • 日志格式:对后面的结构化处理很重要一般来说要使用要采集数据里面不存在的
    • 日志切换:如果项目运行时间及,收集数据大,将不容易处理,我们要设置任务定时复制拆分日志文件

     

     

  • 相关阅读:
    windows 程序设计自学:窗口正中显示Hello,World
    为网站图片增加延迟加载功能,提升用户体验
    线性表顺序存储
    sys.stdout sys.stderr的用法
    python 跳出嵌套循环方法
    * 与 ** 在调用函数时的作用
    twisted 学习笔记二:创建一个简单TCP客户端
    给命令行上色
    __new__ 的简单应用
    网友对twisted deferr的理解
  • 原文地址:https://www.cnblogs.com/qidi/p/11588862.html
Copyright © 2020-2023  润新知