网站访问统计模块研究

发布: 2008-05-28 20:20

网站统计所需要的基础数据:

示例 URL:cnzz stat.htm?id=527226&agt=mozilla/5.0%20%28×11%3B%20u%3B%20linux%20i686%3B%20en-us%3B%20rv%3A1.8.1.6%29%20gecko/20070723%20iceweasel/2.0.0.6%20%28debian-2.0.0.6-0etch1+lenny1%29&r=&aN=Netscape&lg=undefined&OS=Linux%20i686&aV=5.0%20%28X11%3B%20en-US%29&ntime=0.47376000%201189490530&repeatip=0&rtime=14&cnzz_eid=25620072-http%3A//www.muzone.cn/html/bbs.html&showp=1400×1050

从此URL可以得到下面几个字段:
id : 站点ID
agt : 浏览器
ref : referrer 引用页URL
aN : appName 浏览器应用程序名称
lang : language 浏览器的语言
OS : 操作系统名称
aV : 浏览器应用程序版本号
showp : 用户屏幕分变率 格式:1024×768 ……………
上面这些可以直接用js从用户 的客户端上获取的,这些直接传递到 统计服务器即可。

repeatip:
ntime:
rtime:

参数传递流程:

explorer
stat js
stat serv
database
id

从嵌入到站点的URL获取
从stat js 生成的URL获取

agt
生成
获取
获取,统计数据源,并临时存储
永久存储
url

下面的统计结构体处理步骤:
typedef struct {
struct hash_table *pages; // 请求页面
struct hash_table *visitors; // 最近访客

struct hash_table *referers; // 来源
struct hash_table *screenres; // screen
struct hash_table *screendepth; // 色彩
struct hash_table *flashversions; // flash版本
struct hash_table *javaenabled; // 是否安装 java
struct hash_table *os; // os
struct hash_table *browsers; // browsers
struct hash_table *agents; // user agent
struct hash_table *returnvisits; // 回访
struct hash_table *entries; // 入口
struct hash_table *locations; // 区域
struct hash_table *pageviews; // 访问页面数
struct hash_table *searchengines; // 搜索引擎
struct hash_table *keywords; // 关键词

int pv; // total pv
int uv; // total uv

} counter_t;

pages , referers , screenres , screendept , flashversions , javaenabled , os 这几个处理都差不多,处理:
从统计URL的参数中取出相应的值,累加到哈希表中。

其中referers为空的时候必须也要记录的,这点要特别注意了。这时的referers可以指定一个固定值,如: http://dummy.noreferer.org

borwsers的处理:只关心浏览器的名字即可,这个名字在user-agent字段的第一个词。版本号为第二个词 这两 个之间是用 / 隔开的

agents 的处理:这个不是和上面的重复了吗?就是把全部内容记录下来吧。上面的只记录user-agent中的浏览器名字而已。
entries 是什么意思,即浏览此网站的referers是其他的网站的访问,此时的url 便是entries中的一个元素。
returnvisits: 这个现在应该是做不了的,需要和数据结合。其实这个功能应该是在显示的时候完成计算的吧。而不是在这个统计模块中实现的。因为这个模块关心的一小段时间内的站点访问情况。

locations : 在模块中调用 取远程客户端地址的函数,得到IP地址,再转为城市名称即可。这个不需要统计URL传递。
pageviews: 这个是不是和pages 一个意思的,重复信息了吧。

searchengines: 这个搜索引擎指的是发出这个请求的客户端,如果这个请求客户端是一些已知的搜索引擎蜘蛛程序,则统计在这里面了。这里面的数据应该是 browsers 哈希表中的一个子集了,是否需要呢。

keywords : 这个表存储的是由搜索引擎引导过来的,可以从引用中取到搜索引擎中的关键词,由于每个搜索引擎的关键词参数名不一样,所以还得针对每种搜索引擎做特殊处理。这个就是维护一个搜索引擎查询URL格式了,另一种方法是记录下这个来自搜索引擎的referer,这样在显示关键词的时候,可以直接显示这个引用URL,可以再次浏览这个搜索引擎页面了。如果使用后者,那么这个哈希表还要变了。

关于UV:访问者个数,在用户访问此站点时如果不带我们统计所给的cookie 则认为是一个新访问者. 关于 cookie有效存活时间,有等讨论。这个cookie可以在 嵌入站点中的URL中写入,并作为一个统计URL的参数传入到统计的server中。

统计模块导出数据的时间记录问题:
为了让这个时间准确一点,导出的时间字段有两个,1 是统计结束计时时间,2 是统计入库时间,前面一个字段是由统计模块维护并在导出时传出来的,这样的时间更精确一些,这两个时间有点间隔,正常情况下不会间隔太长,10秒以内,是不是需要这个字段呢。在发生异常时有用,这时我们把数据导到一个临时文件,就没有入库时间了。所以还是带着吧。

我遇到过cnzz的统计显示出来的那几个字是编码的时候。这个地方要注意了,指定输出的编码类型。

跳出页面:
访问时长(页面停留时间:
访问深度:
网络位置:
网络速度:
最近访客:

统计数据定时导出详细步骤:

数据库结构:

测试:编写脚本程序,生成一些随机数据,测试此统计模块的运行情况。

wget 中提供的哈希表的用法小结


原文: http://qtchina.tk/?q=node/146

Powered by zexport