精华内容
下载资源
问答
  • php网站统计

    2013-02-07 09:25:56
    php网站统计,改程序是网站统计小插件。可以帮助了解和使用网站统计
  • 石青网站统计引流软件是一款向网站统计系统发送信息的软件。通过发送的信息,吸引点击、观看,达到推广品牌、产品,或提高站点排名的效果。 本软件是一款向站点统计系统发
  • Piwik是一套基于Php+MySQL技术构建的开源网站访问统计系统,前身是phpMyVisites。Piwik 网站统计系统可以给你详细的统计信息,比如网页 浏览人数, 访问最多的页面, 搜索引擎关键词等等,并
  • Piwik是一套基于Php+MySQL技术构建的...Piwik 网站统计系统可以给你详细的统计信息,比如网页 浏览人数, 访问最多的页面, 搜索引擎关键词等等,并且采用了大量的AJAX/Flash技术,使得在操作上更加便易。此外,它还采
  • matomo网站统计系统可以给你详细的统计信息,比如网页 浏览人数, 访问最多的页面, 搜索引擎关键词等等,并且采用了大量的AJAX/Flash技术,使得在操作上更加便易。此外,它还采用了插件扩展及开放API架构,可以让开发...
  • html5电商销售网站统计后台模板html5电商销售网站统计后台模板,html5电商销售网站统计后台模板html5电商销售网站统计后台模板
  • 浙江医疗美容网 网站统计程序说明:    1、统计项目:今日 昨日 预计今日 平均每日 本月 总计 的访问量,流量量。  2、分时统计:小时统计、每日统计、每周统计、每月统计、每年统计  3、搜索引擎统计:...
  • Piwik 网站统计系统可以给你详细的统计信息,比如网页 浏览人数, 访问最多的页面, 搜索引擎关键词等等,并且采用了大量的AJAX/Flash技术,使得在操作上更加便易。此外,它还采用了插件扩展及开放API架构,可以让开发...
  • Piwik 网站统计系统可以给你详细的统计信息,比如网页 浏览人数, 访问最多的页面, 搜索引擎关键词等等,并且采用了大量的AJAX/Flash技术,使得在操作上更加便易。此外,它还采用了插件扩展及开放API架构,可以让开发...
  • 日志分析实战之清洗、网站统计小教程.pdf日志分析实战之清洗、网站统计小教程.pdf日志分析实战之清洗、网站统计小教程.pdf
  • 网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析、百度统计和腾讯分析等等。...简单来说,网站统计分析工具需要收集到用户浏览目标网站的行为(如打开某网页、点

    网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析百度统计腾讯分析等等。所有这些统计分析工具的第一步都是网站访问数据的收集。目前主流的数据收集方式基本都是基于javascript的。本文将简要分析这种数据收集的原理,并一步一步实际搭建一个实际的数据收集系统。

    数据收集原理分析

    简单来说,网站统计分析工具需要收集到用户浏览目标网站的行为(如打开某网页、点击某按钮、将商品加入购物车等)及行为附加数据(如某下单行为产生的订单金额等)。早期的网站统计往往只收集一种用户行为:页面的打开。而后用户在页面中的行为均无法收集。这种收集策略能满足基本的流量分析、来源分析、内容分析及访客属性等常用分析视角,但是,随着ajax技术的广泛使用及电子商务网站对于电子商务目标的统计分析的需求越来越强烈,这种传统的收集策略已经显得力不能及。

    后来,Google在其产品谷歌分析中创新性的引入了可定制的数据收集脚本,用户通过谷歌分析定义好的可扩展接口,只需编写少量的javascript代码就可以实现自定义事件和自定义指标的跟踪和分析。目前百度统计、搜狗分析等产品均照搬了谷歌分析的模式。

    其实说起来两种数据收集模式的基本原理和流程是一致的,只是后一种通过javascript收集到了更多的信息。下面看一下现在各种网站统计工具的数据收集基本原理。

    流程概览

    首先通过一幅图总体看一下数据收集的基本流程。

    图1. 网站统计数据收集基本流程

    首先,用户的行为会触发浏览器对被统计页面的一个http请求,这里姑且先认为行为就是打开网页。当网页被打开,页面中的埋点javascript片段会被执行,用过相关工具的朋友应该知道,一般网站统计工具都会要求用户在网页中加入一小段javascript代码,这个代码片段一般会动态创建一个script标签,并将src指向一个单独的js文件,此时这个单独的js文件(图1中绿色节点)会被浏览器请求到并执行,这个js往往就是真正的数据收集脚本。数据收集完成后,js会请求一个后端的数据收集脚本(图1中的backend),这个脚本一般是一个伪装成图片的动态脚本程序,可能由php、python或其它服务端语言编写,js会将收集到的数据通过http参数的方式传递给后端脚本,后端脚本解析参数并按固定格式记录到访问日志,同时可能会在http响应中给客户端种植一些用于追踪的cookie。

    上面是一个数据收集的大概流程,下面以谷歌分析为例,对每一个阶段进行一个相对详细的分析。

    埋点脚本执行阶段

    若要使用谷歌分析(以下简称GA),需要在页面中插入一段它提供的javascript片段,这个片段往往被称为埋点代码。下面是我的博客中所放置的谷歌分析埋点代码截图:

    图2. 谷歌分析埋点代码

    其中_gaq是GA的的全局数组,用于放置各种配置,其中每一条配置的格式为:

     
    1. _gaq.push(['Action', 'param1', 'param2', ...]);

    Action指定配置动作,后面是相关的参数列表。GA给的默认埋点代码会给出两条预置配置,_setAccount用于设置网站标识ID,这个标识ID是在注册GA时分配的。_trackPageview告诉GA跟踪一次页面访问。更多配置请参考:https://developers.google.com/analytics/devguides/collection/gajs/。实际上,这个_gaq是被当做一个FIFO队列来用的,配置代码不必出现在埋点代码之前,具体请参考上述链接的说明。

    就本文来说,_gaq的机制不是重点,重点是后面匿名函数的代码,这才是埋点代码真正要做的。这段代码的主要目的就是引入一个外部的js文件(ga.js),方式是通过document.createElement方法创建一个script并根据协议(http或https)将src指向对应的ga.js,最后将这个element插入页面的dom树上。

    注意ga.async = true的意思是异步调用外部js文件,即不阻塞浏览器的解析,待外部js下载完成后异步执行。这个属性是HTML5新引入的。

    数据收集脚本执行阶段

    数据收集脚本(ga.js)被请求后会被执行,这个脚本一般要做如下几件事:

    1、通过浏览器内置javascript对象收集信息,如页面title(通过document.title)、referrer(上一跳url,通过document.referrer)、用户显示器分辨率(通过windows.screen)、cookie信息(通过document.cookie)等等一些信息。

    2、解析_gaq收集配置信息。这里面可能会包括用户自定义的事件跟踪、业务数据(如电子商务网站的商品编号等)等。

    3、将上面两步收集的数据按预定义格式解析并拼接。

    4、请求一个后端脚本,将信息放在http request参数中携带给后端脚本。

    这里唯一的问题是步骤4,javascript请求后端脚本常用的方法是ajax,但是ajax是不能跨域请求的。这里ga.js在被统计网站的域内执行,而后端脚本在另外的域(GA的后端统计脚本是http://www.google-analytics.com/__utm.gif),ajax行不通。一种通用的方法是js脚本创建一个Image对象,将Image对象的src属性指向后端脚本并携带参数,此时即实现了跨域请求后端。这也是后端脚本为什么通常伪装成gif文件的原因。通过http抓包可以看到ga.js对__utm.gif的请求:

    图3. 后端脚本请求的http包

    可以看到ga.js在请求__utm.gif时带了很多信息,例如utmsr=1280×1024是屏幕分辨率,utmac=UA-35712773-1是_gaq中解析出的我的GA标识ID等等。

    值得注意的是,__utm.gif未必只会在埋点代码执行时被请求,如果用_trackEvent配置了事件跟踪,则在事件发生时也会请求这个脚本。

    由于ga.js经过了压缩和混淆,可读性很差,我们就不分析了,具体后面实现阶段我会实现一个功能类似的脚本。

    后端脚本执行阶段

    GA的__utm.gif是一个伪装成gif的脚本。这种后端脚本一般要完成以下几件事情:

    1、解析http请求参数的到信息。

    2、从服务器(WebServer)中获取一些客户端无法获取的信息,如访客ip等。

    3、将信息按格式写入log。

    5、生成一副1×1的空gif图片作为响应内容并将响应头的Content-type设为image/gif。

    5、在响应头中通过Set-cookie设置一些需要的cookie信息。

    之所以要设置cookie是因为如果要跟踪唯一访客,通常做法是如果在请求时发现客户端没有指定的跟踪cookie,则根据规则生成一个全局唯一的cookie并种植给用户,否则Set-cookie中放置获取到的跟踪cookie以保持同一用户cookie不变(见图4)。

    图4. 通过cookie跟踪唯一用户的原理

    这种做法虽然不是完美的(例如用户清掉cookie或更换浏览器会被认为是两个用户),但是是目前被广泛使用的手段。注意,如果没有跨站跟踪同一用户的需求,可以通过js将cookie种植在被统计站点的域下(GA是这么做的),如果要全网统一定位,则通过后端脚本种植在服务端域下(我们待会的实现会这么做)。

    系统的设计实现

    根据上述原理,我自己搭建了一个访问日志收集系统。总体来说,搭建这个系统要做如下的事:

    图5. 访问数据收集系统工作分解

    下面详述每一步的实现。我将这个系统叫做MyAnalytics。

    确定收集的信息

    为了简单起见,我不打算实现GA的完整数据收集模型,而是收集以下信息。

    名称途径备注
    访问时间web serverNginx $msec
    IPweb serverNginx $remote_addr
    域名javascriptdocument.domain
    URLjavascriptdocument.URL
    页面标题javascriptdocument.title
    分辨率javascriptwindow.screen.height & width
    颜色深度javascriptwindow.screen.colorDepth
    Referrerjavascriptdocument.referrer
    浏览客户端web serverNginx $http_user_agent
    客户端语言javascriptnavigator.language
    访客标识cookie 
    网站标识javascript自定义对象

    埋点代码

    埋点代码我将借鉴GA的模式,但是目前不会将配置对象作为一个FIFO队列用。一个埋点代码的模板如下:

     
    1. <script type="text/javascript">
    2. var _maq = _maq || [];
    3. _maq.push(['_setAccount', '网站标识']);
    4.  
    5. (function() {
    6. var ma = document.createElement('script'); ma.type = 'text/javascript'; ma.async = true;
    7. ma.src = ('https:' == document.location.protocol ? 'https://analytics' : 'http://analytics') + '.codinglabs.org/ma.js';
    8. var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ma, s);
    9. })();
    10. </script>

    这里我启用了二级域名analytics.codinglabs.org,统计脚本的名称为ma.js。当然这里有一点小问题,因为我并没有https的服务器,所以如果一个https站点部署了代码会有问题,不过这里我们先忽略吧。

    前端统计脚本

    我写了一个不是很完善但能完成基本工作的统计脚本ma.js:

     
    1. (function () {
    2. var params = {};
    3. //Document对象数据
    4. if(document) {
    5. params.domain = document.domain || '';
    6. params.url = document.URL || '';
    7. params.title = document.title || '';
    8. params.referrer = document.referrer || '';
    9. }
    10. //Window对象数据
    11. if(window && window.screen) {
    12. params.sh = window.screen.height || 0;
    13. params.sw = window.screen.width || 0;
    14. params.cd = window.screen.colorDepth || 0;
    15. }
    16. //navigator对象数据
    17. if(navigator) {
    18. params.lang = navigator.language || '';
    19. }
    20. //解析_maq配置
    21. if(_maq) {
    22. for(var i in _maq) {
    23. switch(_maq[i][0]) {
    24. case '_setAccount':
    25. params.account = _maq[i][1];
    26. break;
    27. default:
    28. break;
    29. }
    30. }
    31. }
    32. //拼接参数串
    33. var args = '';
    34. for(var i in params) {
    35. if(args != '') {
    36. args += '&';
    37. }
    38. args += i + '=' + encodeURIComponent(params[i]);
    39. }
    40.  
    41. //通过Image对象请求后端脚本
    42. var img = new Image(1, 1);
    43. img.src = 'http://analytics.codinglabs.org/1.gif?' + args;
    44. })();

    整个脚本放在匿名函数里,确保不会污染全局环境。功能在原理一节已经说明,不再赘述。其中1.gif是后端脚本。

    日志格式

    日志采用每行一条记录的方式,采用不可见字符^A(ascii码0x01,Linux下可通过ctrl + v ctrl + a输入,下文均用“^A”表示不可见字符0x01),具体格式如下:

    时间^AIP^A域名^AURL^A页面标题^AReferrer^A分辨率高^A分辨率宽^A颜色深度^A语言^A客户端信息^A用户标识^A网站标识

    后端脚本

    为了简单和效率考虑,我打算直接使用nginx的access_log做日志收集,不过有个问题就是nginx配置本身的逻辑表达能力有限,所以我选用了OpenResty做这个事情。OpenResty是一个基于Nginx扩展出的高性能应用开发平台,内部集成了诸多有用的模块,其中的核心是通过ngx_lua模块集成了Lua,从而在nginx配置文件中可以通过Lua来表述业务。关于这个平台我这里不做过多介绍,感兴趣的同学可以参考其官方网站http://openresty.org/,或者这里有其作者章亦春(agentzh)做的一个非常有爱的介绍OpenResty的slide:http://agentzh.org/misc/slides/ngx-openresty-ecosystem/,关于ngx_lua可以参考:https://github.com/chaoslawful/lua-nginx-module

    首先,需要在nginx的配置文件中定义日志格式:

     
    1. log_format tick "$msec^A$remote_addr^A$u_domain^A$u_url^A$u_title^A$u_referrer^A$u_sh^A$u_sw^A$u_cd^A$u_lang^A$http_user_agent^A$u_utrace^A$u_account";

    注意这里以u_开头的是我们待会会自己定义的变量,其它的是nginx内置变量。

    然后是核心的两个location:

     
    1. location /1.gif {
    2. #伪装成gif文件
    3. default_type image/gif;
    4. #本身关闭access_log,通过subrequest记录log
    5. access_log off;
    6.  
    7. access_by_lua "
    8. -- 用户跟踪cookie名为__utrace
    9. local uid = ngx.var.cookie___utrace
    10. if not uid then
    11. -- 如果没有则生成一个跟踪cookie,算法为md5(时间戳+IP+客户端信息)
    12. uid = ngx.md5(ngx.now() .. ngx.var.remote_addr .. ngx.var.http_user_agent)
    13. end
    14. ngx.header['Set-Cookie'] = {'__utrace=' .. uid .. '; path=/'}
    15. if ngx.var.arg_domain then
    16. -- 通过subrequest到/i-log记录日志,将参数和用户跟踪cookie带过去
    17. ngx.location.capture('/i-log?' .. ngx.var.args .. '&utrace=' .. uid)
    18. end
    19. ";
    20.  
    21. #此请求不缓存
    22. add_header Expires "Fri, 01 Jan 1980 00:00:00 GMT";
    23. add_header Pragma "no-cache";
    24. add_header Cache-Control "no-cache, max-age=0, must-revalidate";
    25.  
    26. #返回一个1×1的空gif图片
    27. empty_gif;
    28. }
    29.  
    30. location /i-log {
    31. #内部location,不允许外部直接访问
    32. internal;
    33.  
    34. #设置变量,注意需要unescape
    35. set_unescape_uri $u_domain $arg_domain;
    36. set_unescape_uri $u_url $arg_url;
    37. set_unescape_uri $u_title $arg_title;
    38. set_unescape_uri $u_referrer $arg_referrer;
    39. set_unescape_uri $u_sh $arg_sh;
    40. set_unescape_uri $u_sw $arg_sw;
    41. set_unescape_uri $u_cd $arg_cd;
    42. set_unescape_uri $u_lang $arg_lang;
    43. set_unescape_uri $u_utrace $arg_utrace;
    44. set_unescape_uri $u_account $arg_account;
    45.  
    46. #打开日志
    47. log_subrequest on;
    48. #记录日志到ma.log,实际应用中最好加buffer,格式为tick
    49. access_log /path/to/logs/directory/ma.log tick;
    50.  
    51. #输出空字符串
    52. echo '';
    53. }

    要完全解释这段脚本的每一个细节有点超出本文的范围,而且用到了诸多第三方ngxin模块(全都包含在OpenResty中了),重点的地方我都用注释标出来了,可以不用完全理解每一行的意义,只要大约知道这个配置完成了我们在原理一节提到的后端逻辑就可以了。

    日志轮转

    真正的日志收集系统访问日志会非常多,时间一长文件变得很大,而且日志放在一个文件不便于管理。所以通常要按时间段将日志切分,例如每天或每小时切分一个日志。我这里为了效果明显,每一小时切分一个日志。我是通过crontab定时调用一个shell脚本实现的,shell脚本如下:

     
    1. _prefix="/path/to/nginx"
    2. time=`date +%Y%m%d%H`
    3.  
    4. mv ${_prefix}/logs/ma.log ${_prefix}/logs/ma/ma-${time}.log
    5. kill -USR1 `cat ${_prefix}/logs/nginx.pid`

    这个脚本将ma.log移动到指定文件夹并重命名为ma-{yyyymmddhh}.log,然后向nginx发送USR1信号令其重新打开日志文件。

    然后再/etc/crontab里加入一行:

     
    1. 59 * * * * root /path/to/directory/rotatelog.sh

    在每个小时的59分启动这个脚本进行日志轮转操作。

    测试

    下面可以测试这个系统是否能正常运行了。我昨天就在我的博客中埋了相关的点,通过http抓包可以看到ma.js和1.gif已经被正确请求:

    图6. http包分析ma.js和1.gif的请求

    同时可以看一下1.gif的请求参数:

    图7. 1.gif的请求参数

    相关信息确实也放在了请求参数中。

    然后我tail打开日志文件,然后刷新一下页面,因为没有设access log buffer, 我立即得到了一条新日志:

     
    1. 1351060731.360^A0.0.0.0^Awww.codinglabs.org^Ahttp://www.codinglabs.org/^ACodingLabs^A^A1024^A1280^A24^Azh-CN^AMozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4^A4d612be64366768d32e623d594e82678^AU-1-1

    注意实际上原日志中的^A是不可见的,这里我用可见的^A替换为方便阅读,另外IP由于涉及隐私我替换为了0.0.0.0。

    看一眼日志轮转目录,由于我之前已经埋了点,所以已经生成了很多轮转文件:

    图8. 轮转日志

    关于分析

    通过上面的分析和开发可以大致理解一个网站统计的日志收集系统是如何工作的。有了这些日志,就可以进行后续的分析了。本文只注重日志收集,所以不会写太多关于分析的东西。

    注意,原始日志最好尽量多的保留信息而不要做过多过滤和处理。例如上面的MyAnalytics保留了毫秒级时间戳而不是格式化后的时间,时间的格式化是后面的系统做的事而不是日志收集系统的责任。后面的系统根据原始日志可以分析出很多东西,例如通过IP库可以定位访问者的地域、user agent中可以得到访问者的操作系统、浏览器等信息,再结合复杂的分析模型,就可以做流量、来源、访客、地域、路径等分析了。当然,一般不会直接对原始日志分析,而是会将其清洗格式化后转存到其它地方,如MySQL或HBase中再做分析。

    分析部分的工作有很多开源的基础设施可以使用,例如实时分析可以使用Storm,而离线分析可以使用Hadoop。当然,在日志比较小的情况下,也可以通过shell命令做一些简单的分析,例如,下面三条命令可以分别得出我的博客在今天上午8点到9点的访问量(PV),访客数(UV)和独立IP数(IP):

     
    1. awk -F^A '{print $1}' ma-2012102409.log | wc -l
    2. awk -F^A '{print $12}' ma-2012102409.log | uniq | wc -l
    3. awk -F^A '{print $2}' ma-2012102409.log | uniq | wc -l

    其它好玩的东西朋友们可以慢慢挖掘。

    参考

    GA的开发者文档:https://developers.google.com/analytics/devguides/collection/gajs/

    一篇关于实现nginx收日志的文章:http://blog.linezing.com/2011/11/%E4%BD%BF%E7%94%A8nginx%E8%AE%B0%E6%97%A5%E5%BF%97

    关于Nginx可以参考:http://wiki.nginx.org/Main

    OpenResty的官方网站为:http://openresty.org

    ngx_lua模块可参考:https://github.com/chaoslawful/lua-nginx-module

    本文http抓包使用Chrome浏览器开发者工具,绘制思维导图使用Xmind,流程和结构图使用Tikz PGF

    转自: codinglabs
    展开全文
  • 友盟添加网站统计步骤

    千次阅读 2019-11-04 11:26:58
    找到你的产品中心,开通网站统计 第二步 点击查看报表,点击添加站点 第三步 编写你的站点,添加站点。 然后回到我的站点页面,点击右侧统计代码,选个统计代码方式(我用的文字方式)。放到你要统计...

    前一阵要用到H5页面的埋点统计,还是用友盟,挺久没用,突然不太会操作了。写一下方便自己自省一下。

     

    第一步

    找到你的产品中心,开通网站统计

     

    第二步

     点击查看报表,点击添加站点

     

    第三步

    编写你的站点,添加站点。

    然后回到我的站点页面,点击右侧统计代码,选个统计代码方式(我用的文字方式)。放到你要统计页面的</body>前。

    最好用个隐藏。

     

     

    第四步

    在我的站点,点击右侧查看报表。

    这里面就是所有的分析内容了,你想加什么就看一下这个部署指南API,  https://open.cnzz.com/a/new/trackevent/

    我们常用的就是事件统计:_czc.push(["_trackEvent",category,action,label,value,nodeid]);

    参数必填/选填类型功能备注
    category必填string表示事件发生在谁身上,如“视频”、“小说”、“轮显层”等等。 
    action必填string表示访客跟元素交互的行为动作,如"播放"、"收藏"、"翻层"等等。 
    label选填string用于更详细的描述事件,如具体是哪个视频,哪部小说。 
    value选填int用于填写打分型事件的分值,加载时间型事件的时长,订单型事件的价格。请填写整数数值,如果填写为其他形式,系统将按0处理。若填写为浮点小数,系统会自动取整,去掉小数点。
    nodeid选填string填写事件元素的div元素id。请填写class id,暂不支持name。

    这是我做的点击事件统计,

    _trackEvent是固定的事件类别,action我这里是发生事件的页面,label我这里是发生的事件类型

     

     

    展开全文
  • 网站统计工具介绍

    千次阅读 2012-08-22 23:44:58
    1、Google Analytics 由大名鼎鼎的 google 公司出品的网站统计分析服务,基本可以算作是世界网站统计分析服务的标杆性产品了。功能强大,数据准确,提供目标监测功能。优点:数据精准,服务稳定,功能强大缺点:...

    1、Google Analytics 

    由大名鼎鼎的 google 公司出品的网站统计分析服务,基本可以算作是世界网站统计分析服务的标杆性产品了。功能强大,数据准确,提供目标监测功能。
    优点:数据精准,服务稳定,功能强大
    缺点:专业性过强,不易学习。google 的统计服务更侧重于整体网站趋势的分析,而缺少流量的细节信息,无访客细节信息。不推荐小型站长,博客和网店主使用。此外,和中国众多提供实时统计数据的服务相比,google 统计的数据有1-2个小时的延迟。


    2、量子统计(Yahoo)
    前身是 yahoo 统计,统计功能不错,有些细节还有待完善

    优点:比较简单易懂,服务稳定,访问速度较快,付费版支持淘宝店铺。

    缺点:统计细节问题有待完善,有时候数据不太准确。


    3、百度统计

    百度统计原本只对使用百度点击付费广告的企业和站长开放,现已全面对用户开放。但是和其他统计服务相比,并没有太多亮点,统计数据准确性有待提高,尤其是对于海外流量。

    优点:服务稳定,访问速度快

    缺点:统计数据准确性有待加强,尤其是来自于国外的流量,统计类目需要进一步细化。


    4、GoStats 
    和 google 一样,gostats.cn 网站统计也是来自于国外的网站统计分析服务,总部位于加拿大。拥有多个国际版本,支持多种语言。功能强大,数据准确。
    优点: 数据实时准确,简单易用,而且和 google 相比,多了很多网站流量的细节分析项目,更适合中国站长。支持网站,博客,淘宝网店等各类平台。中文版广告少。
    缺点: 用户界面偏向欧美风格,中文客服目前仅支持在线问题提交,希望能够提供电话和 等联系方式。

    5、cnzz
    CNZZ数据专家是全球最大的中文互联网数据统计分析服务提供商,为中文网站及中小企业提供专业、权威、独立的第三方数据统计与分析服务。

    优点:广告较少,能分析国外的ip,能分析不常用的屏幕分辨率。
    缺点:无法隐藏统计图标,网页显示速度有所降低,很多统计项未标明是针对pv统计还是针对ip进行统计,比较混乱。

    6、51.La
    我要啦 2005 版从阿江统计 2.2 基础上经过向SQL数据库迁移并经过存储过程优化产生,增加了便捷的用户管理接口。2006 版则以新的设计思路重新编写,效率和功能都有激动人心的增强,所有过程均由阿江亲自完成。

    优点:统计项目多,信息量大
    缺点:界面相对较简陋,不够美观,安装后网页显示速度有所降低,统计数据深度功能的精确度有待加强。

    7、51YES
     51YES.COM是一家从事互联网产品开发的专业公司,为中国的站长免费提供了高质量的统计服务。统计服务中不会弹出任何的插件或者广告,同时会持续的改进这套统计系统,把免费服务提供到底。
    优点:界面美观,客户地理位置统计用地域图显示,并在地域图中用不同颜色标记各省的客户比例,功能较全面
    缺点:广告超多
    
    
    8、textclick(太极链)
    优点:广告少
    缺点:只对PV访问量大于5000的用户开通历史统计功能,统计响应速度偏慢
    
    9、一统天下(已被太极链收购)
    一统天下是一套具有突破性的免费网站流量统计系统,由曾经开发过电信计费系统的专业工程师设计,功能及性能完全超越现有的流行统计系统。太极链统计成功收购一统天下,详见
    
    优点:广告少,界面和太极链完全一样
    缺点:只对Alexa全球排名前10,000名的,或者日IP访问超过20,000的网站开通VIP服务
    
    
    
    
    
    10、AWStats 
    AWStats 是一个免费的强大而有个性的工具,带来先进的网络,流量,FTP或邮件服务器统计图. 本日志分析器作为CGI或从命令行在数个图形网页中显示你日志中包含的所有可能信息. 它利用一部分档案资料就能经常很快地处理大量日志档案, 它能分析日志文件来自从各大服务器工具 ,如 Apache日志档案 s (NCSA combined/XLF/ELF log format or common/CLF log format), WebStar, IIS (W3C的日志格式)及许多其他网站,Proxy(代理服务器)、Wap、流量服务器、邮件服务器和一些 FTP服务器 .(OSChina 使用的统计工具)
    
    优点: 免费开源
    缺点: 界面不够完美
    
    



    应用场景推荐:

    全球范围的网站流量统计,推荐 Google Analytics(全球国家ip定位准确)

    国内的站点流量统计,推荐 百度统计(速度快,统计较准确)

    个人空间博客统计,推荐 量子统计(简单易用,界面清晰)


    此外,GoStats  和 cnzz 功能也很强大,作为参考

    注:CSDN 博客统计,默认推广使用是量子统计



    参考推荐:

    六大最好用的网站统计工具介绍

    网站统计工具介绍有哪些


    展开全文
  • jsp写的网站统计系统源代码 jsp写的网站统计系统源代码 jsp写的网站统计系统源代码
  • 数据采集与网站统计实现全过程

    千次阅读 2017-07-24 10:55:59
    这需要网站要记录客户所访问的轨迹,记录用户访问每个页面的流向,给网站加过百度统计与cnzz的站长们估计都清楚,要想对某个页面进行统计,就要在该页面上加上统计代码,将用户的访问数据记录下来,进而生成统计数据...
    做网站统计首先要有数据,数据从何而来?这需要网站要记录客户所访问的轨迹,记录用户访问每个页面的流向,给网站加过百度统计与cnzz的站长们估计都清楚,要想对某个页面进行统计,就要在该页面上加上统计代码,将用户的访问数据记录下来,进而生成统计数据。现在就来自己实现一个这样的数据采集与统计功能,具体步骤与相关代码如下:
    

    一、设计表结构
    先考虑数据的记录方式与保存位置,由于后期要用户这些数据,因此考虑将数据存储到数据库中,根据需要创建了三个表,Visitor用于记录来访用户的相关数据,VisitorRecord用于记录来访用户访问时间,着陆页面与跳出页面,表ViewRecord是访问记录,用于记录访问的基础数据。表结构如下:

    表ViewRecord 表Visitor 表VisitorRecord

    二、插入数据
    表创建好了,如何向其中插入数据呢,既然ViewRecord是记录基础数据,毫无疑问当用户每访问一次一个页面,就要向该表中插入一条数据;一个访问者就向Visitor表中插入一条数据,现在问题来了,我们如何来判断该用户是否来过呢,这里我们定义一台PC端为一个用户,如果表Vistor中已存在该用户的数据,只需更新表中访问次数visitingNum,而不需要再向Visitor表中添加数据。至于应该如何判断,这里采用的是用一插件fingerprint2.js来帮助识别是否为同一用户,这种文件类似于指纹识别,插件请移步至下载频道下载(下载地址:指纹识别插件 fingerprint2.js)。另外表VisitorRecord用来存储用户的来访时间、跳出时间及访问时长。

    至于各个表插入数据的方法这里就不再赘述了,相信看到此文的读者都不在话下,这里只阐述具体的调用与实现,功能是放到一般处理程序中实现的,读者可自由变通。费话不多说,上代码:

    Stat.ashx
    public class Stat : IHttpHandler
    {
    
        public void ProcessRequest(HttpContext context)
        {
            string url = context.Request.PathInfo;
            string IP = Labbase.Common.Utils.GetIP();
            Labbase.BLL.TJ_LocalIP bllIP = new Labbase.BLL.TJ_LocalIP();
            Labbase.Model.TJ_Visitor mdTJVisitor = new Labbase.Model.TJ_Visitor();
            Labbase.BLL.TJ_Visitor bllTJVisitor = new Labbase.BLL.TJ_Visitor();
            Labbase.Model.TJ_VisitorRecord mdTJVisitorRecord = new Labbase.Model.TJ_VisitorRecord();
            Labbase.BLL.MVisitorRecord bllMVisitorRecord = new Labbase.BLL.MVisitorRecord();
            if (bllIP.Exists("LIP= '" + IP + "'"))
                return;
            if (isEngine(IP, context.Request.ServerVariables["HTTP_USER_AGENT"]))
                return;
    
            if (!string.IsNullOrEmpty(context.Request["InPage"]))
            {
                if (context.Request.Cookies["lbGUID"] == null)
                {
                    HttpCookie cooklbGUID = new HttpCookie("lbGUID");
                    cooklbGUID.Value = Guid.NewGuid().ToString();
                    cooklbGUID.Expires = DateTime.MaxValue;
                    context.Response.Cookies.Add(cooklbGUID);
                }
    
                else
                {
                    Guid lbGUID;
                    try
                    {
                        lbGUID = new Guid(context.Request.Cookies["lbGUID"].Value.ToString());
                    }
                    catch
                    {
                        return;
                    }
    
                    int lbGUIDCount = bllTJVisitor.Exists(new Guid(context.Request.Cookies["lbGUID"].Value)) == false ? 0 : 1;
                    if (lbGUIDCount == 0)
                    {
                        mdTJVisitor.visitingNum = 1;
                        mdTJVisitor.VisitorID = lbGUID;
                        mdTJVisitor.Bfingerprinting = context.Request["fingerprint"];
                        mdTJVisitor.LastVisitingTime = DateTime.Now;
                        mdTJVisitor.VIp = IP;
                        mdTJVisitor.Loction = IPShowAddress(IP);//查询IP库
                        bllTJVisitor.Add(mdTJVisitor);
    
                        mdTJVisitorRecord.VRID = Guid.NewGuid();
                        mdTJVisitorRecord.VisitorID = mdTJVisitor.VisitorID;
                        mdTJVisitorRecord.InTime = DateTime.Now;
                        mdTJVisitorRecord.outTime = DateTime.Now.AddSeconds(1);
                        mdTJVisitorRecord.Entrance = context.Request.UrlReferrer.ToString();
                        mdTJVisitorRecord.ExitPage = context.Request.UrlReferrer.ToString();
                        bllMVisitorRecord.Add(mdTJVisitorRecord);
                    }
                    else
                    {
                        mdTJVisitor = bllTJVisitor.GetModel(lbGUID);
                        if ((DateTime.Now - (DateTime)mdTJVisitor.LastVisitingTime).Minutes > 5)
                        {
                            mdTJVisitorRecord.VRID = Guid.NewGuid();
                            mdTJVisitorRecord.VisitorID = lbGUID;
                            mdTJVisitorRecord.InTime = DateTime.Now;
                            mdTJVisitorRecord.outTime = DateTime.Now.AddSeconds(1);
                            mdTJVisitorRecord.Entrance = context.Request.UrlReferrer.ToString();
                            mdTJVisitorRecord.ExitPage = context.Request.UrlReferrer.ToString();
                            bllMVisitorRecord.Add(mdTJVisitorRecord);
                            mdTJVisitor.LastVisitingTime = DateTime.Now;
                            bllTJVisitor.Update(mdTJVisitor);
                        }
                        else
                        {
                            string vrid = bllMVisitorRecord.GetVRIDByGUID(lbGUID);
                            if (vrid != "")
                            {
                                mdTJVisitor = bllTJVisitor.GetModel(lbGUID);
                                mdTJVisitor.LastVisitingTime = DateTime.Now;
                                bllTJVisitor.Update(mdTJVisitor);
                                mdTJVisitorRecord.VRID = new Guid(vrid);
                            }
                        }
                    }
                    Labbase.Model.ViewRecord mdViewRecord = new Labbase.Model.ViewRecord();
                    Labbase.BLL.MViewRecord bllMViewRecord = new Labbase.BLL.MViewRecord();
                    mdViewRecord.VRID = mdTJVisitorRecord.VRID;
                    mdViewRecord.ViewID = Guid.NewGuid();
                    mdViewRecord.referenceUrl = System.Web.HttpUtility.UrlDecode(context.Request["referrer"]);
                    if (Utils.IsNullOrEmpty(mdViewRecord.referenceUrl))
                        mdViewRecord.referenceUrl = "";
                    mdViewRecord.FullPagePath = System.Web.HttpUtility.UrlDecode(context.Request["InPage"]);
                    mdViewRecord.ViewIP = IP;
                    mdViewRecord.Localarea = IPShowAddress(IP);//查询IP库
                    mdViewRecord.Vtitle = System.Web.HttpUtility.UrlDecode(context.Request["title"]);
                    mdViewRecord.ViewTime = DateTime.Now;
    
                    if (!Utils.IsNullOrEmpty(mdViewRecord.referenceUrl))
                        mdViewRecord.SId = Enginer(new Uri(mdViewRecord.referenceUrl).DnsSafeHost);
                    else
                        mdViewRecord.SId = 0;
                    string AbsolutePath = context.Request.UrlReferrer.AbsolutePath.TrimStart(new char[] { '/' });
                    if (AbsolutePath.Contains('-'))
                    {
                        AbsolutePath = AbsolutePath.Substring(0, AbsolutePath.IndexOf('-'));
                    }
                    if (AbsolutePath.Contains('.'))
                    {
                        AbsolutePath = AbsolutePath.Substring(0, AbsolutePath.IndexOf('.'));
                    }
                    int parID = 0;
                    string[] pars;
                    object objCompany;
                    Labbase.BLL.supply bllsupply = new Labbase.BLL.supply();
                    Labbase.BLL.product_category bllcategory = new Labbase.BLL.product_category();
                    Labbase.Model.supplyInfo mdSupply = new Labbase.Model.supplyInfo();
                    int companyID = 0;
                    switch (AbsolutePath)
                    {
                        case "IndustryNewsDetial":
                            parID = int.Parse(context.Request.UrlReferrer.PathAndQuery.Split('-').Last().TrimEnd(".html".ToCharArray()));
                            Labbase.BLL.News bllNews = new Labbase.BLL.News();
                            objCompany = bllNews.GetCompanyID("NewsID=" + parID);
                            if (objCompany != null && !string.IsNullOrEmpty(objCompany.ToString()) && objCompany.ToString() != "0")
                            {
                                mdViewRecord.Querypar1 = int.Parse(objCompany.ToString());
                            }
                            else
                            {
                                mdViewRecord.Querypar1 = 0;
                            }
                            mdViewRecord.channel = "技术资料";
                            break;
                        case "SupplyDetial"://供应详情
                            parID = int.Parse(context.Request.UrlReferrer.PathAndQuery.Split('-').Last().TrimEnd(".html".ToCharArray()));
                            string supplyID = parID.ToString();
                            mdSupply = bllsupply.GetModel(Int32.Parse(supplyID));
                            DataTable dtclass = bllcategory.GetProductClassInfo(" ClassXXID=" + mdSupply.ClassXXID);
    
                            mdViewRecord.Querypar1 = mdSupply.CompanyID;
                            companyID = int.Parse(mdSupply.CompanyID.ToString());
                            if (dtclass.Rows.Count > 0)
                            {
                                mdViewRecord.QueryPar2 = Int32.Parse(dtclass.Rows[0]["ClassID"].ToString());
                                mdViewRecord.QueryPar3 = Int32.Parse(dtclass.Rows[0]["ClassXID"].ToString());
                            }
                            mdViewRecord.QueryPar4 = mdSupply.ClassXXID;
                            mdViewRecord.channel = "供求信息";
                            break;
                        case "ProductLDetail"://产品详情
                            parID = int.Parse(context.Request.UrlReferrer.PathAndQuery.Split('-').Last().TrimEnd(".html".ToCharArray()));
                            companyID =  new Labbase.BLL.product().GetCompanyIDByProductID(parID);
                            mdViewRecord.Querypar1 = companyID;
                            mdViewRecord.channel = "产品信息";
                            break;
                        case "CompanyIndex"://公司库首页
                        case "CompanyNewsList"://公司技术资料
                        case "CompanyContact":
                        case "CompanyInfo":
                            parID = int.Parse(context.Request.UrlReferrer.PathAndQuery.Split('-').Last().TrimEnd(".html".ToCharArray()));
                            mdViewRecord.Querypar1 = parID;
                            companyID = parID;
                            mdViewRecord.channel = "公司主页";
                            break;
                        case "CompanyProduct"://公司供应
                        case "CompanyProdutDetail"://公司供应详情
                        case "CompanyNews"://公司技术资料详情
                            pars = context.Request.UrlReferrer.PathAndQuery.TrimEnd(".html".ToCharArray()).Split('-');
                            mdViewRecord.Querypar1 = int.Parse(pars[1]);
                            companyID = int.Parse(pars[1]);
                            mdViewRecord.channel = "公司主页";
                            break;
                        case "NewsLDetails":
                        case "PrimeList":
                            mdViewRecord.Querypar1 = 0;
                            mdViewRecord.channel = "资讯";
                            break;
                        case "IndustryNewsList":
                            mdViewRecord.Querypar1 = 0;
                            mdViewRecord.channel = "技术资料";
                            break;
                        case "SupplyList":
                        case "ProClass":
                            mdViewRecord.Querypar1 = 0;
                            mdViewRecord.channel = "供求信息";
                            break;
                        case "ProductBList":
                            mdViewRecord.Querypar1 = 0;
                            mdViewRecord.channel = "产品信息";
                            break;
                        case "BrandsList":
                            mdViewRecord.Querypar1 = 0;
                            mdViewRecord.channel = "品牌专区";
                            break;
                        case "CompanyList":
                            mdViewRecord.Querypar1 = 0;
                            mdViewRecord.channel = "公司库";
                            break;
                        case "Exhibition":
                        case "Exhibition/Detail":
                            mdViewRecord.Querypar1 = 0;
                            mdViewRecord.channel = "展会信息";
                            break;
                        case "ProductSearch":
                        case "SupplySearch":
                        case "NewsSearch":
                        case "CompanySearch":
                        case "BrandSearch":
                            mdViewRecord.Querypar1 = 0;
                            mdViewRecord.channel = "搜索";
                            break;
                        case "purchase":
                        case "AboutmUs":
                        case "ContactmUs":
                        default:
                            mdViewRecord.Querypar1 = 0;
                            mdViewRecord.channel = "其它";
                            break;
                    }
                    if (!Utils.IsNullOrEmpty(mdViewRecord.referenceUrl))
                    {
                        //Engine_wrod EW = EngineWord(WebRequest.Create(mdViewRecord.referenceUrl));
                        string keyws = GetKeyWord(mdViewRecord.referenceUrl);
                        if (!string.IsNullOrEmpty(keyws))
                        {
                            Labbase.BLL.SearchWord bllSearchWord = new Labbase.BLL.SearchWord();
                            Labbase.Model.SearchWord mdSearchWord = new Labbase.Model.SearchWord();
    
                            object obj = bllSearchWord.GetSearchWordId("Word='" + keyws + "'");
                            if (obj == null)
                            {
                                mdSearchWord.SWID = Guid.NewGuid();
                                mdSearchWord.LastDate = DateTime.Now;
                                mdSearchWord.SumNum = 1;
                                mdSearchWord.UserIP = IP;
                                mdSearchWord.Word = keyws;
                                mdSearchWord.CompanyID = companyID;
                                bllSearchWord.Add(mdSearchWord);
                                mdViewRecord.SWId = mdSearchWord.SWID;
                            }
                            else
                            {
                                mdViewRecord.SWId = new Guid(obj.ToString());
                                mdSearchWord = bllSearchWord.GetModel(new Guid(obj.ToString()));
                                mdSearchWord.SumNum = mdSearchWord.SumNum + 1;
                                mdSearchWord.LastDate = DateTime.Now;
                                mdSearchWord.CompanyID = companyID;
                                bllSearchWord.Update(mdSearchWord);
                            }
                        }
                    }
                    bllMViewRecord.Add(mdViewRecord);
    
                }
            }
            if (!string.IsNullOrEmpty(context.Request["OutPage"]))
            {
                Guid lbGUID;
                try
                {
                    lbGUID = new Guid(context.Request.Cookies["lbGUID"].Value.ToString());
                }
                catch
                {
                    return;
                }
                int lbGUIDCount = bllTJVisitor.Exists(new Guid(context.Request.Cookies["lbGUID"].Value)) == false ? 0 : 1;
                if (lbGUIDCount < 1) return;
                string vrid = bllMVisitorRecord.GetVRIDByGUID(lbGUID);
                if (vrid != "")
                {
                    mdTJVisitorRecord = bllMVisitorRecord.GetModel(new Guid(vrid));
                    mdTJVisitorRecord.outTime = Convert.ToDateTime(DateTime.Now);
                    mdTJVisitorRecord.ExitPage = context.Request.UrlReferrer.ToString();
                    bllMVisitorRecord.Update(mdTJVisitorRecord);
                }
            }
            context.Response.ContentType = "text/plain";
            context.Response.Write("");
        }
        private class Engine_wrod
        {
            public bool isEngine { get; set; }
            public string keyWord { get; set; }
        }
    
        /// <summary>
        /// 获取全部的搜索引擎
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        private int Enginer(string input)
        {
            Labbase.BLL.SearchEngine bll = new Labbase.BLL.SearchEngine();
    
            foreach (DataRow dr in bll.GetList("").Tables[0].Rows)
            {
                if (input.Contains(dr["SDomin"].ToString()))
                {
                    return int.Parse(dr["SID"].ToString());
                }
            }
            return 0;
        }
    
        /// <summary>
        /// 判定是否是搜索引擎
        /// </summary>
        /// <param name="IP"></param>
        /// <param name="useragent"></param>
        /// <returns></returns>
        private bool isEngine(string IP, string useragent)
        {
            Labbase.BLL.SerchEngineMark bllSerchEngineMark = new Labbase.BLL.SerchEngineMark();
            Labbase.BLL.SearchEngineIP bllSearchEngineIP = new Labbase.BLL.SearchEngineIP();
    
            if (string.IsNullOrEmpty(useragent)) return true;//如果没有useragent 设定为搜索引擎,不再继续统计.
    
            foreach (DataRow dr in bllSerchEngineMark.GetList("").Tables[0].Rows)
            {
                if (useragent.Contains(dr["SEMString"].ToString()))
                {
                    return true;
                }
            }
            return bllSearchEngineIP.Exists("SEIP='" + IP + "'");
        }
    
        /// <summary>
        /// 获取搜索关键词
        /// </summary>
        /// <param name="url">来源地址</param>
        /// <returns></returns>
        private string GetKeyWord(string url)
        {
            string keyword = "";
            string[] _uOsr = { "google", "yahoo", "baidu", "soso", "bing", "sogou", "so.com" };   //将几个搜索引擎与对应的搜索关系词写入对应的数组中
            string[] _uOkw = { "q", "q", "wd|word|kw|keyword", "w", "q", "query", "q" };
            for (int i = 0; i < _uOsr.Length; i++)
            {
                if (url.Contains(_uOsr[i]))                                             //如果URL中包含这几个搜索引擎则进入处理
                {
                    if (_uOsr[i] == "baidu")
                    {
                        string[] temp = _uOkw[i].Split('|');                            //来自百度的关系词 有WD和WORD,分开处理
                        #region 现在的代码
                        keyword = GetQuerystring(temp[0], url);                      //当以WD取不到的时候,则用WORD取词
                        if (string.IsNullOrEmpty(keyword))                                  //指定对应的编码来消除乱码 
                        {
                            keyword = GetQuerystring(temp[1], url);                     //从URL中取得关键词的方法
                        }
                        if (string.IsNullOrEmpty(keyword))
                        {
                            keyword = GetQuerystring(temp[2], url);
                        }
                        if (string.IsNullOrEmpty(keyword))
                        {
                            keyword = GetQuerystring(temp[3], url);
                        }
                        #endregion
                    }
    
                    else
                    {
                        keyword = GetQuerystring(_uOkw[i], url);
                    }
                    break;
                }
            }
    
            string ecode = GBorUTF(keyword, url);                                //获得文字的编码格式
    
            keyword = HttpUtility.UrlDecode(keyword, Encoding.GetEncoding(ecode));
            keyword = HttpUtility.UrlEncode(keyword, Encoding.GetEncoding("UTF-8"));
            keyword = HttpUtility.UrlDecode(keyword, Encoding.GetEncoding("UTF-8"));
            return keyword;
        }
    
    
        /// <summary>
        /// 获取文字的编码
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        private string GBorUTF(string input, string url)
        {
            string en_code = "UTF-8";
            if (url.Contains("baidu"))
            {
                if (url.Contains("ie="))
                {
                    if (url.Contains("ie=gb2312"))
                    {
                        en_code = "GB2312";
                    }
                }
                else
                {
                    string R_TO_U = HttpUtility.UrlDecode(input, Encoding.GetEncoding("UTF-8"));
                    string U_TO_R = HttpUtility.UrlEncode(R_TO_U, Encoding.GetEncoding("UTF-8"));
                    if (input.ToLower() != U_TO_R.ToLower())
                    {
                        en_code = "GB2312";
                    }
                    else
                    {
                        en_code = "UTF-8";
                    }
                }
            }
            else if (url.Contains("sogou"))
            {
                if (url.Contains("ie="))
                {
                    if (url.Contains("ie=gb2312"))
                    {
                        en_code = "GB2312";
                    }
                }
                else
                {
                    string R_TO_U = HttpUtility.UrlDecode(input, Encoding.GetEncoding("UTF-8"));
                    string U_TO_R = HttpUtility.UrlEncode(R_TO_U, Encoding.GetEncoding("UTF-8"));
                    if (input.ToLower() != U_TO_R.Replace("(", "%28").Replace(")", "%29").ToLower())
                    {
                        en_code = "GB2312";
                    }
                }
            }
            else if (url.Contains("so.com"))
            {
                if (url.Contains("ie="))
                {
                    if (url.Contains("ie=gb2312"))
                    {
                        en_code = "GB2312";
                    }
                }
                else
                {
                    string R_TO_U = HttpUtility.UrlDecode(input, Encoding.GetEncoding("UTF-8"));
                    string U_TO_R = HttpUtility.UrlEncode(R_TO_U, Encoding.GetEncoding("UTF-8"));
                    if (input.ToLower() != U_TO_R.ToLower())
                    {
                        en_code = "GB2312";
                    }
                }
    
            }
    
    
            return en_code;
    
        }
    
    
        /// <summary>
        /// 从URL地址中通过queryname提取关键词
        /// </summary>
        /// <param name="queryname">wd,word,q,query,w...</param>
        /// <param name="url">URL地址</param>
        /// <returns></returns>
        private string GetQuerystring(string queryname, string url)
        {
            string keyword = string.Empty;
            Dictionary<string, string> dic = new Dictionary<string, string>();
            string re = "[?&]([^=]+)(?:=([^&]*))?";                                 //通进正则将URL中参数分拆 放入字典中
            MatchCollection mc = Regex.Matches(url, re);
            foreach (Match item in mc)
            {
                if (item.Success)
                {
                    dic.Add(item.Groups[1].Value, item.Groups[2].Value);
                }
            }
            if (dic.ContainsKey(queryname))                                         //如果字典中有传入的匹配关键词的键,则取其值返回
            {
                keyword = dic[queryname];
            }
            return keyword;
    
        }
    
        /// <summary>
        /// 获取链接的参数
        /// </summary>
        /// <param name="strQuery"></param>
        /// <param name="strSplit"></param>
        /// <returns></returns>
        protected string wordFromUrlQuery(string strQuery, string strSplit)
        {
            strQuery = strQuery.TrimStart('?');
            strSplit += "=";
            foreach (string str in strQuery.Split('&'))
            {
                if (str.StartsWith(strSplit))
                {
                    string[] qValue = str.Split('=');
                    if (qValue.Length > 1)
                        return qValue[1];
                }
            }
            return "";
        }
    
        /// <summary>
        ///根据IP获取地址
        /// </summary>
        /// <param name="strChar"></param>
        /// <returns></returns>
        protected string IPShowAddress(string strChar)
        {
            string ip = strChar;
            IPScaner objScan = new IPScaner();
            objScan.DataPath = System.Web.HttpContext.Current.Server.MapPath(@"/js/QQWry.Dat");
            objScan.IP = ip;
            string addre = objScan.IPLocation();
            return addre;
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

    三、数据采集
    在实现了具体功能之后,我们所要做的就是需要一个js脚本来控制该一般处理程序Stat.aspx的运行,具体脚本如下:

    statistics.js:
    $(function () {
    
        var urlreferrer = escape(document.referrer);
    
        var locationurl = escape(document.location);
        var ffreashed = getCookie("freash");
        if (ffreashed == document.location) {
            return;
        }
    
        if (getCookie("lbGUID") == null) {
            $.ajax({
                url: "/js/fingerprint2.js",
                dataType: "script",
                cache: true
            }).done(function (data, status, jqxhr) {
                var fp = new Fingerprint2();
                fp.get(function (result) {
                    $.ajax({
                        type: "POST",
                        url: "/tools/Stat.ashx",
                        data: { InPage: locationurl, referrer: urlreferrer, title: escape(document.title) },
                        async: false,
                        success: function () {
                            $.ajax({
                                type: "POST",
                                url: "/tools/Stat.ashx",
                                data: { InPage: locationurl, fingerprint: result, referrer: urlreferrer, title: escape(document.title) },
                                async: false
                            });
                        },
                        error: function (XMLHttpRequest, textStatus, errorThrown) {
                            alert(XMLHttpRequest.status)
                        }
                    });
                });
            });
        }
        else {
            $.ajax({
                type: "POST",
                url: "/tools/Stat.ashx",
                data: { InPage: locationurl, referrer: urlreferrer, title: escape(document.title) },
                async: false,
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert(XMLHttpRequest.status)
                }
            });
        }
    });
    //给重新刷新设置一个cookie
    $(window).unload(function () {
        $.ajax({
            type: "POST",
            url: "/tools/Stat.ashx",
            data: { OutPage: escape(document.location) },
            async: false
        });
        setCookie("freash", document.location);
    });
    function setCookie(name, value) {
        var exp = new Date();
        exp.setTime(exp.getTime() + 2.5 * 1000);
        document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
    }
    function getCookie(name) {
        var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
        if (arr = document.cookie.match(reg))
            return unescape(arr[2]);
        else
            return null;
    }
    function delCookie(name) {
        var exp = new Date();
        exp.setTime(exp.getTime() - 1);
        var cval = getCookie(name);
        if (cval != null)
            document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
    }

    到此基本的工作已经做完,剩下的就是直接将脚本引用到页面中,用户点击相应的页面自然也就可以实现数据采集与数据统计了。为了避免重复动作,最好将脚本引用到页面共用的用户控件中,下面是经过规范化处理的引用示例:

    <script type="text/javascript">
        (function () {
            //网站内部统计
            var oHead = document.getElementsByTagName('HEAD').item(0);
            var oScript = document.createElement("script"); oScript.type = "text/javascript"; oScript.async = true;
            oScript.src = "/js/statistics.js";
            oHead.appendChild(oScript);
        })();
    </script>

    总的来说,数据采集无非就是记录下用户在本网站各页面的具体浏览轨迹,从而用于对用户的需求进行分析,采集就是统计的数据来源。

    展开全文
  • 网站访问统计能为你带来什么? 第一,查看访问者的国家和地区; 第二,查看访问者来源,如用是从搜索引擎,还是从其他站点的友情链接链接引入 第三,查看访问者使用的操作系统...最好最著名的免费网站统计和解析工具
  • 网站统计指标定义

    千次阅读 2017-11-09 14:51:16
    (一)流量统计 1. 独立用户数:在当前计算周期内,访问统计对象的不重复用户数。万瑞数据系统通过对用户所使用的浏览器赋予唯一标识来识别用户的身份。同一浏览器在当前计算周期内多次访问同一统计对象时,该...
  • 网站统计代码

    2012-06-18 17:41:09
    网站访问次数的统计,这是一个具体的代码,同志们如果要用,可稍作修改即可
  • 六款网站统计工具介绍

    万次阅读 2013-09-07 07:31:38
    1、Google Analytics 由大名鼎鼎的 google 公司出品的网站统计分析服务,基本可以算作是世界网站统计分析服务的标杆性产品了。功能强大,数据准确,提供目标监测功能。优点:数据精准,服务稳定,功能强大缺点:...
  • 网站统计中的数据收集原理及实现网站统计 埋点 Web Openresty网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析、百度统计和腾讯分析等等。所有这些统计分析工具的第一步都是...
  • PHP做网站统计,怎么知道访客从哪个网站来的
  • 今天我给大家分析一下网站统计显示被违禁词搜索进来原因。 今天我们的主题:网站统计显示被违禁词搜索进来原因 最近,很多网站中站长向林汉文简介反应,他们的网站统计工具中出现了很多莫名其妙跟网站无关的搜索...
  • 网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析、百度统计和腾讯分析等等。...简单来说,网站统计分析工具需要收集到用户浏览目标网站的行为(如打开某网页、点
  • 计数器,网店网站统计

    2010-04-26 03:04:32
    一个用于统计网站网店的程序,一个用于统计网站网店的程序,一个用于统计网站网店的程序
  • 百度网站统计分析

    千次阅读 2018-02-09 16:54:35
    统计跳出率的高低是网站分析的一个重要指标,通常用于评估网站的用户体验,可以用于指导网站以及页面的改善。跳出率越高就说明该网站对访问者的吸引力越低,当跳出率达到一定的程度时,就说明网站需要做些优化或者...
  • 近期在查看网站统计中经常看到某个来自北京的用户,51啦统计显示该用户一般每天凌晨到早晨这段时间访问网站,系统环境为ios,Safari浏览器。经过几天的观察,开始怀疑这个IP是否为普通用户。一般来讲,像51LA、CNZZ...
  • Busuanzi网站统计失效问题

    千次阅读 2019-02-26 08:59:50
    在 Hexo 博客中,我使用的 Next 5.1 主题中默认集成了第三方统计服务 Busuanzi 来统计网站数据,但是实际并没有生效。 问题原因是由于 busuanzi(不蒜子) 的域名更新,导致了使用 Hexo Next 主题时统计数据失效。 不...
  • Piwik——最好用的开源网站统计系统

    千次阅读 2017-06-26 14:04:53
    Piwik——最好用的开源网站统计系统 前段时间一直在寻找开源的网站统计系统,在网上发现了开源的Piwik,它简洁强大,有时一个开源的系统,可以部署在任何PHP+MYSQL上,可以说是最好用的网站统计系统,如果你不想...
  • 很多站长第一次使用51.la的网站统计进行个人网站埋点后,还不是很熟悉如何分析报表,当看不到统计数据时会不知所措,于是整理该文章让大家清楚什么原因造成的?又该如何解决? 如果在报表分析中发现数据统计异常,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 277,221
精华内容 110,888
关键字:

网站统计