`
wangxiaohigh
  • 浏览: 1459299 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

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

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

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

js中代码如下:

Visit.js
var req;
var visitID;
creatReq();

function creatReq() {

    // 获取当前网站的更目录,这比较重要,全局通用的保证
    var path = getRootPath();
    // 后台处理的文件地址,注意,必须把这个文件的前台页面大部分清空,只留下第一行
    var url = path + "AJAX.aspx";

    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest;
    }
    else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHttp");
    }
    if (req) {
        // 获取当前的网址
        var link = window.location.href;
        // 获取上页地址
        var oldlink = document.referrer;
        // 获取当前访问页的标题
        var titleName = document.title;
        // 屏幕分辨率
        var screen = window.screen.width + "*" + window.screen.height;    
        // 异步请求发送
        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传递过来的信息,代码如下:

AJAX.ASPX
//放在Page_load里面的内容
            visitModel.VisitReferrer =   Request.QueryString["oldlink"].ToString() ;
            visitModel.VisitReferrerType = int.Parse(GetVisitReferrerType(Request.QueryString["oldlink"].ToString()));
            visitModel.VisitResolution = Request.QueryString["s"].ToString();
            visitModel.VisitURL = Request.QueryString["id"].ToString();
            visitModel.VisitTimeIn  = System.DateTime.Now;
            visitModel.VisitIP = GetClientIP();
            visitModel.VisitOS = Request.QueryString["sys"].ToString();
            visitModel.VisitURLTitle = Request.QueryString["title"].ToString();
            visitModel.VisitBrowserType = Request.QueryString["b"].ToString();
            visitModel.VisitReferrerKeywords = ;
            visitModel.VisitProvince = Request.QueryString["p"].ToString();
            visitModel.VisitCity = Request.QueryString["c"].ToString();

            // 获取source后面的内容]
            string url = Request.QueryString["id"].ToString();
            if (url.IndexOf("fromsource=") > 0)
            {
                int startindex= url.IndexOf("fromsource=");
                int endindex = url.Length - startindex  - 11 ;
                string id = url.Substring(startindex + 11, endindex);
                visitModel.FromSource= id;
             }
            
      // 这里执行添加到数据库的操作并返回添加以后ID信息
            int newID =visitDAL.Add(visitModel);
            Response.Write(newID.ToString());
        

       

        // 获取IP地址
        private string GetClientIP()
        {
            string result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if (null == result || result == String.Empty)
            {
                result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
            }
            if (null == result || result == String.Empty)
            {
                result = HttpContext.Current.Request.UserHostAddress;
            }
            return result;
        }

        // 获取来源类型

        protected string GetVisitReferrerType(string url)
        {
            url = url.Trim();
            if ("" == url)
            {
                return "0"; //没有来源
            }
            else if (url.IndexOf("fromsource=") > -1)
            {
                return "1"; //推广链接
            }
            else if (url.IndexOf("baidu.com") > -1 )
            {
                return "2"; // 百度搜索引擎
            }
            else if (url.IndexOf("google.com") > -1)
            {
                return "3"; // Google搜索引擎
            }
            else if (url.IndexOf("sogou.com") > -1)
            {
                return "4"; // 搜狗搜索引擎
            }
            else if (url.IndexOf("soso.com") > -1)
            {
                return "5"; // 搜搜搜索引擎
            } 
            else
            {
                return "6"; // 其他浏览
            }
        }

目前还有几个主要问题:

1、一是MAC地址没法获取,

2、用户离开网站的时间基本上获取不到,之前用js获取过,但实际效果还是不理想。

3、关键词的获取目前还有时是乱码,不能正确的获取。google出现乱码的机会多些。

好了,到这里一个简单的访问记录便好了,根据Fromsource字段可以统计推广来源信息,但各种各样的统计报表服务还需要根据需求来做。

目前举个简单的例子,统计每天访问的UV,PV,来自百度的访问IP,推广来源IP数,还有就是一跳率信息。根据我们上面的表结构,SQL语句如下:

统计每日UV,PV
            SELECT CONVERT(VARCHAR(12), visittimein, 23) + '(' + DATENAME(weekday,
                                                                        CONVERT(VARCHAR(12), visittimein, 23))+ ')' 访问日期 ,
                  COUNT(DISTINCT visitip) UV ,
                  ( SELECT    SUM(RealVisitPageCount) VisitOne
                    FROM      ( SELECT    n.VisitIP ,
                                          COUNT(DISTINCT n.VisitURL) RealVisitPageCount
                                FROM      dbo.VisitInfo n
                                WHERE     CONVERT(VARCHAR(12), n.VisitTimeIn, 23) = CONVERT(VARCHAR(12), t.visittimein, 23)
                                GROUP BY  n.VisitIP
                              ) a
                  ) PV ,
                  COUNT(DISTINCT CASE WHEN visitreferrertype = 3 THEN visitip
                                 END) 来自百度IP ,
                  COUNT(DISTINCT CASE WHEN CustomLinkID != '' THEN visitip
                                 END) 推广IP ,
                  CAST (( SELECT  SUM(RealVisitPageCount) VisitOne
                          FROM    ( SELECT    n.VisitIP ,
                                              COUNT(DISTINCT n.VisitURL) RealVisitPageCount
                                    FROM      dbo.VisitInfo n
                                    WHERE     CONVERT(VARCHAR(12), n.VisitTimeIn, 23) = CONVERT(VARCHAR(12), t.visittimein, 23)
                                    GROUP BY  n.VisitIP
                                    HAVING    COUNT(DISTINCT n.VisitURL) = 1
                                  ) a
                        ) * 100 / COUNT(DISTINCT visitip) AS VARCHAR(2)) + '%' AS 一跳率
                 
           FROM    VisitInfo t
           
           GROUP BY CONVERT(VARCHAR(12), visittimein, 23) 
           ORDER BY 访问日期 DESC

 结果显示如下:

这是测试的结果

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

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

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

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

不知道楼主是怎么处理每日pv过千W的情况呢?

或者过百万的情况~
2 楼 tron.lu 2011-12-26  

js 方面还穾加入容错,不要因为一丝错误而导致整个网站的问题~
1 楼 kelloKitty 2011-12-26  
学习一下,谢谢分享

相关推荐

    网站访问统计需求分析

    网站访问统计是对网站运营至关重要的一个环节,它能提供关于用户行为、网站性能以及市场策略效果的宝贵数据。通过对这些数据的深入分析,网站管理...因此,建立一个高效且全面的网站访问统计系统是提升网站价值的关键。

    阿江酷站访问统计系统V2.02.rar_V2 _网站统计

    阿江酷站访问统计系统V2.02是一款专门用于网站数据分析和监控的软件,它为网站管理员提供了全面且深入的访问数据统计功能。这款系统是V2.02版本,意味着它在前一版本的基础上进行了优化和更新,旨在提供更稳定、更...

    网站流量统计系统,asp后台

    网站流量统计系统是一种用于收集、分析和报告网站访问数据的重要工具。在ASP(Active Server Pages)背景下构建这样的系统,可以为网站管理员提供深入洞察用户行为、优化网站性能和制定营销策略的数据支持。以下是对...

    医生工作室简单统计系统

    3. **每日访问量统计**:通过每天的独立访客数量,分析网站访问的日常规律,比如周末或工作日的访问量差异,从而调整内容发布或推广策略。 4. **今日访问量统计**:显示当前日期内的访问量,用于实时监控当日网站...

    会员推广系统源码 PHP+MYSQL开发而成的广告链接智能推广程序.zip

    会员推广系统源码是互联网营销领域中常见的工具,主要用于帮助网站或平台进行高效的广告链接推广。这个特定的系统是基于PHP编程语言和MYSQL数据库管理系统构建的,这两种技术都是Web开发中的核心组件。PHP是一种广泛...

    Web流量统计源码_Net(带IP库)

    1. **浏览者IP地址统计**:系统能够记录每个访问者的IP地址,这有助于分析来自不同地区的用户分布,为地区定向推广提供数据支持。 2. **地理位置信息**:由于系统带有IP库,它能够根据IP地址解析出用户所在的区域或...

    统计功能设计

    在设计统计功能时,我们需要构建一个能够全面、深入地分析用户行为和系统资源使用的系统。以下是对各个统计功能模块的详细说明: 1. **用户登录统计**:此部分旨在跟踪和分析用户登录行为,以便了解用户活跃度和...

    基于PHP的阿西网站推广系统php广告系统源码.zip

    PHP作为一款广泛使用的服务器端脚本语言,因其开源、免费、跨平台和丰富的扩展性,常被用于开发各种网络应用,包括网站推广系统和广告系统。本文将围绕"基于PHP的阿西网站推广系统php广告系统源码"进行深入探讨,...

    PHP实例开发源码-阿西网站推广系统 php广告系统.zip

    在这个实例开发源码中,我们将探讨“阿西网站推广系统”以及与其配套的“PHP广告系统”,这两个组件如何协同工作,以实现高效的网站推广和广告管理。 首先,让我们关注“阿西网站推广系统”。这个系统通常包含了...

    最新网站推广裂变系统源码_通过邀请链接注册可兑换卡密系统_兼职付费入职系统.txt

    ### 最新网站推广裂变系统源码解析 #### 一、引言 随着互联网技术的飞速发展,网站推广已成为企业提升品牌知名度、增加用户流量的重要手段之一。裂变营销作为近年来兴起的一种新型营销方式,因其高效性及低成本受...

    移动统计平台

    移动统计平台是现代移动应用开发不可或缺的一个组成部分,它主要用于收集、分析和报告应用程序的使用数据。这样的平台能够帮助开发者理解用户行为,优化产品性能,并作出数据驱动的决策。本篇文章将深入探讨移动统计...

    单科学生成绩管理信息系统

    "单科学生成绩管理信息系统"是一个专为教育领域设计的应用程序,主要用于高校或班级对学生某一特定科目成绩的高效管理和分析。系统的核心功能是整合和跟踪学生的平时成绩、测验成绩以及考试成绩,最终计算出每个学生...

    网站流量统计系统

    网站流量统计系统是一种用于监测和分析网站访问情况的工具,对于网站运营者来说至关重要。它可以帮助我们了解用户的行为、偏好以及网站的性能。本系统基于经典的ASP(Active Server Pages)编程语言开发,ASP是微软...

    网游推广网站php源码含数据库

    【网游推广网站php源码含数据库】是一个基于PHP编程语言和MySQL数据库系统构建的网站源代码,主要用于网络游戏的推广和运营。这样的系统通常包括多个功能模块,以支持游戏广告、用户注册、活动管理、数据分析等一...

    基于php微信小程序的企业产品推广系统源码数据库.zip

    该压缩包文件“基于php微信小程序的企业产品推广系统源码数据库.zip”包含了开发一个企业产品推广系统的完整资源,主要用于在微信平台上实现小程序的交互功能。这个系统的核心是PHP编程语言和微信小程序,两者结合...

    网站统计及其测量.docx

    网站统计和测量是评估网络营销效果的关键环节,涉及多种指标和方法。在传统广告领域,我们关注的几个核心指标包括: 1. 总印象数/印象数:衡量广告展示的总数,无论是否重复。 2. 到达率:特定时间段内至少看到一次...

    档案管理信息系统

    它是一种利用计算机技术、数据库技术和网络技术,对各类档案进行高效、规范化的管理的系统。在本文中,我们将深入探讨基于Delphi和SQL构建的档案管理信息系统。 **Delphi开发环境** Delphi是Embarcadero ...

    ASP毕业管理系统的设计.zip

    asp档案管理系统的设计与实现.zip: 这个系统是一个ASP编写的档案管理系统,用于帮助机构或组织管理和维护档案的存储和访问。系统包括档案信息录入、查询和检索功能。管理员可以在系统中录入档案信息,并能够通过系统...

    ASP004人事人力资源管理系统.zip

    asp档案管理系统的设计与实现.zip: 这个系统是一个ASP编写的档案管理系统,用于帮助机构或组织管理和维护档案的存储和访问。系统包括档案信息录入、查询和检索功能。管理员可以在系统中录入档案信息,并能够通过系统...

    asp档案管理系统的设计与实现.zip

    asp档案管理系统的设计与实现.zip: 这个系统是一个ASP编写的档案管理系统,用于帮助机构或组织管理和维护档案的存储和访问。系统包括档案信息录入、查询和检索功能。管理员可以在系统中录入档案信息,并能够通过系统...

Global site tag (gtag.js) - Google Analytics