一, 概述
像CNZZ那样提供一段js代码然后帮助站长们统计网页的PV流量是如何实现的呢? 这里浅谈了一下实现方法, 其实很多网站内部的PV统计也是如此的, 只不过需要记录的数据比较多而已.
二, 需求
实现一个网站访问量统计工具, 能够得到被访问页面的URL, 被访问页面的前导URL, 以及访客所在地理位置.
三, 设计
分为两部分, 一是前端, 一是后端.
前端部分主要做一段js, 通过js动态创建一个<img>标签, 这时候会像统计的服务端发起一个http请求, 这个http请求就能得到当前的访问页面, 而http请求的url参数中可以传递当前页面的前导页面(referrer), 就能得到当前页面的前导页面, 而服务端可以获取到当前对该资源的请求者的IP地址, 这样通过IP地址库就能知道该用户位于哪个位置了.
后端部分, 主要是处理请求, 简单的话可以仅仅记录一条日志, 包括 refer, 资源的URL, 以及客户端的IP地址.
通过日志分析处理工具(大规模的话可以用hadoop集群), 得到用户访问的当前页面(对应的refer), 用户访问的前导页面(对应在资源URL的参数值里边, 用户的地理位置).
四, 实现.
用户先在系统中注册账号, 账号能够得到唯一码, 然后生成一段含有该唯一码的js代码, 为了在记录日志的时候可以验证是否是合法的统计.
js的伪代码如下:
var uuid = 123456; //唯一码 var ref = document.referrer; var randnum = Math.random(); //防止缓存 var img_url = "http://www.pvloghost.com/1.gif?pre="+ref+"&uuid="+uuid+"&rnum="+randnum; document.write("<img src='"+url+"' width='0px' height='0px' style='display:none;' />");
后端记录的伪代码如下:
String current = request.getRefer(); String hostname = request.getHostname(); String refer = request.getUrl().toURI().getParamValue("pre"); String uuid = request.getUrl().toURI().getParamValue("uuid"); String ipaddr = request.getIPAddr(); if( checkValidate(uuid,hostname) ){ logSys.warn(hostname+"\u0001"+refer+"\u0001"+current+"\u0001"+ipaddr); }
日志分析的代码就省去了(简单的话可以用关系数据库来算, 但是数据量大起来需要用云计算平台)
发表评论
沙发空缺中,还不快抢~