读书人

偶的高效率统计分享做自己网站的访问记

发布时间: 2012-09-21 15:47:26 作者: rapoo

偶的高效统计分享做自己网站的访问记录系统,用于推广统计

为了了解网站的访问情况,很多网站用了第三方的统计,比如google统计,百度统计,51.la,CNZZ等,但是统计的准确性不能而之,有的网站干脆放多个第三方的统计,以便做个比较,得到更准确的结果。

根据笔者对第三方统计的使用经验,第一:第三方统计有一定的水分存在,第二:因为具有通用性,并不能得到个性化的统计结果。第三:无法确定某个推广源的统计信息。因为这种问题的存在,公司有新的需要,便开发了一个简单的推广访问记录功能。

说起来并不复杂,只要用AJAX方法在后台添加访问记录即可,系统并没有根据Cookie来做跟踪记录,只是根据IP来,所以统计结果上可能有点出入,会少统计些。如果要更真实的统计结果,还是根据cookie统计为好,好了,下面就来介绍这个功能的实现。

思路是这样的,页面中只有加入一个js文件,就能统计到该页面的访问信息,如果运用了模板功能,就只要在模板中加入此js即可,此js我们暂命名为visit.js,放在根目录下,建议链接放在页面的底部即可。js文件里通过xmlhttpRequest这个对象把访问记录信息添加到数据库Visit表中,表设计的字段如下:

偶的高效率统计分享做自己网站的访问记录系统,用于推广统计

下面来介绍js的实现,js方法需异步调用后台方法,这个文件我们定义为AJAX.aspx,方法比较简单,就是获取js文件当中传递过来的参数,然后添加到数据库中去。

js中代码如下:

// 异步请求发送 req.open("GET", url + "?id=" + escape(link) + "&oldlink=" + escape(oldlink) + "&title=" + escape(titleName) + "&sys=" + getSysInfo() + "&s=" + screen + "&b=" + GetBrowserType() + " " + GetBrowserVersion() + "&p=" + remote_ip_info.province + "&c=" + remote_ip_info.city + "&k=" + GetKeyword(oldlink), true); req.onreadystatechange = callback; // 制定回调函数 req.send(null); }}// 获取当前网站的更目录,这比较重要,全局通用的保证function getRootPath() { return window.location.protocol + "//" + window.location.host + "/";}// 获取来自搜索引擎的关键词function GetKeyword(url) { if (url.toString().indexOf("baidu") > 0) { return request(url, "wd"); } else if (url.toString().indexOf("google") > 0) { return request(url, "q"); } else if (url.toString().indexOf("sogou") > 0) { return request(url, "query"); } else if (url.toString().indexOf("soso") > 0) { return request(url, "w"); } else { return ""; }}// 获取链接地址中某个参数的值function request(url, paras) { var paraString = url.substring(url.indexOf("?") + 1, url.length).split("&"); var paraObj = {} for (i = 0; j = paraString[i]; i++) { paraObj[j.substring(0, j.indexOf("=")).toLowerCase()] = j.substring(j.indexOf("=") + 1, j.length); } var returnValue = paraObj[paras.toLowerCase()]; if (typeof (returnValue) == "undefined") { return ""; } else { return returnValue; }}// 回调函数,可以获取添加后的访问ID,以便其他操作。function callback() { if (req.readyState == 4) { if (req.status == 200) { visitID = req.responseText.toString(); } else { } } else { }}// 获取系统信息function getSysInfo() { var ua = navigator.userAgent.toLowerCase(); isWin7 = ua.indexOf("nt 6.1") > -1 isVista = ua.indexOf("nt 6.0") > -1 isWin2003 = ua.indexOf("nt 5.2") > -1 isWinXp = ua.indexOf("nt 5.1") > -1 isWin2000 = ua.indexOf("nt 5.0") > -1 isWindows = (ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1) isMac = (ua.indexOf("macintosh") != -1 || ua.indexOf("mac os x") != -1) isAir = (ua.indexOf("adobeair") != -1) isLinux = (ua.indexOf("linux") != -1) var broser = ""; if (isWin7) { sys = "Windows 7"; } else if (isVista) { sys = "Vista"; } else if (isWinXp) { sys = "Windows xp"; } else if (isWin2003) { sys = "Windows 2003"; } else if (isWin2000) { sys = "Windows 2000"; } else if (isWindows) { sys = "Windows"; } else if (isMac) { sys = "Macintosh"; } else if (isAir) { sys = "Adobeair"; } else if (isLinux) { sys = "Linux"; } else { sys = "Unknow"; } return sys;}// 获取浏览器类型function GetBrowserType() { var ua = navigator.userAgent.toLowerCase(); if (ua == null) return "ie"; else if (ua.indexOf('chrome') != -1) return "chrome"; else if (ua.indexOf('opera') != -1) return "opera"; else if (ua.indexOf('msie') != -1) return "ie"; else if (ua.indexOf('safari') != -1) return "safari"; else if (ua.indexOf('firefox') != -1) return "firefox"; else if (ua.indexOf('gecko') != -1) return "gecko"; else return "ie";}// 获取浏览器版本function GetBrowserVersion() { var ua = navigator.userAgent.toLowerCase(); if (ua == null) return "null"; else if (ua.indexOf('chrome') != -1) return ua.substring(ua.indexOf('chrome') + 7, ua.length).split(' ')[0]; else if (ua.indexOf('opera') != -1) return ua.substring(ua.indexOf('version') + 8, ua.length); else if (ua.indexOf('msie') != -1) return ua.substring(ua.indexOf('msie') + 5, ua.length - 1).split(';')[0]; else if (ua.indexOf('safari') != -1) return ua.substring(ua.indexOf('safari') + 7, ua.length); else if (ua.indexOf('gecko') != -1) return ua.substring(ua.indexOf('firefox') + 8, ua.length); else return "null";}

?这里有一个特殊说明,根据IP来获取省份和城市信息,目前用的是新浪提供的js文件,没有用网上流传的IP库信息,用新浪的这个js有时候获取的是乱码信息,这个问题偶尔会出现。

?这是新浪的地址引用:<script language='javascript' type='text/javascript' src='http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js'></script>

下面说后台,AJAX.aspx文件的前台删除大部分内容,只留下第一行信息,后台就是获取js传递过来的信息,代码如下:

这是测试的结果

当然随着数据量的增加,数据记录越来越多,感觉要做一张结果分析统计表,把每天的信息分析统计结果直接放到里面去,每天分析,以后直接查询该表即可

如果需要其他的分析报表,比如根据地区进行分析,根据浏览器进行兼容性分析,这里就不一一探讨了。还有一些就是跟踪统计分析,这里也没有实现,如果需要更好的记录访问信息,

笔者认为,还是基于Cookie实现比较合理,尤其是电子商务网站,可以跟踪用户是否注册,是否购买商品等转化率问题

4 楼 sanshizi 2011-12-26 这个直接保存到数据库, 貌似不能算高效啊 5 楼 dcdc723 2011-12-27 直连库的方式对高并发时的处理,会发生悲剧的.

读书人网 >编程

热点推荐