想要进行网站数据的分析,就先要知道网站数据是怎么来的。
用户在访问互联网的时候,会向服务器发送服务的请求。发送的请求,就被服务器以一条单独记录的方式记录在服务器的日志中,这就是最原始的网站数据日志。
先看apache的日志
10.1.1.95 - user [18/Mar/2005:12:21:42 +0800] “GET /stats/awstats.pl?config=user HTTP/1.1″ 200 899 “http://10.1.1.1/pv/” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon)”
以上是一条apache的标准日志。
这行内容由9项构成,上面的例子中有两项空白,但整行内容仍旧分成了9项。
· 第一项信息是远程主机的地址。也就是访问者本机器的ip。服务器就是根据这个IP给访问者发回复的信息的。
· 第二项是空白,用一个“-”占位符替代。实际上绝大多数时候这一项都是如此。这个位置用于记录浏览者的标识,这不只是浏览者的登录名字,而是浏览者的 email地址或者其他唯一标识符。这个信息由identd返回,或者直接由浏览器返回。很早的时候,这个位置往往记录着浏览者的email地址。然而,由于有人用它来收集邮件地址和发送垃圾邮件,所以它未能保留多久,很久之前市场上几乎所有的浏览器就取消了这项功能。因此,到了今天,我们在日志记录的第二项看到email地址的机会已经微乎其微了。
· 第三项也是user。这个位置用于记录浏览者进行身份验证时提供的名字。当然,如果网站的某些内容要求用户进行身份验证,那么这项信息是不会空白的。但是,对于大多数不要求登录验证的网站来说,日志文件的大多数记录中这一项仍旧是空白的。
· 日志记录的第四项是请求的时间。这个信息用方括号包围,而且采用所谓的“公共日志格式”或“标准英文格式”。因此,上例日志记录表示请求的时间是2005年3月18日12:21:42。时间信息最后的”+0800″表示服务器所处时区位于世界标准时间之后的8小时,事实上国内服务器的时间都是+8000。
· 日志记录的第五项信息或许是整个日志记录中最有用的信息,它告诉我们服务器收到的是一个什么样的请求。该项信息的典型格式是“方法 资源 协议”。
在上例中,方法是GET,其他经常可能出现的方法还有POST和HEAD。此外还有不少可能出现的合法方法,但主要就是这三种。
资源是指浏览者向服务器请求的文档,或URL。在这个例子中,浏览者请求的是“/stats/awstats.pl?config=user ”。
协议通常是HTTP,后面再加上版本号。
· 日志记录的第六项信息是状态代码。它告诉我们请求是否成功,或者遇到了什么样的错误。大多数时候,这项值是200,它表示服务器已经成功地响应浏览器的请求,一切正常。一般地说,以2开头的状态代码表示成功,以3开头的状态代码表示由于各种不同的原因用户请求被重定向到了其他位置,以4开头的状态代码表示客户端存在某种错误,以5开头的状态代码表示服务器遇到了某个错误。
· 日志记录的第七项表示发送给客户端的总字节数。它告诉我们传输是否被打断(即,该数值是否和文件的大小相同)。把日志记录中的这些值加起来就可以得知服务器在一天、一周或者一月内发送了多少数据。
· 日志记录的第八项记录的是客户在提出请求时所在的目录或URL。这次的是“http://10.1.1.1/pv/”即10.1.1.1的pv目录下的首页。大多数情况下,首页会是在httpd.conf中DocumentRoot 指令后面规定的那些类型和名字的web文件。
· 日志记录的第九项表示客户端的详细信息。
上面是apache日志的记录的解释。
那么换成是IIS的日志呢,记录也大同小异,只是由identd返回的登录身份验证,由于一直是空的,变成了发送或者接受的cookie内容,还有多了一些协议的子状态的内容。
从上面可以看到,我们所有分析的大部分数据都可以得到了,但是还是有一些问题,用户点击浏览器上的前进和后退按钮,客户端的浏览器是先读取缓存的,只有在缓存找不到的情况下,才重新向服务器请求,所以服务器是否能记下用户点击了后退或者前进之后的页面,完全看页面的写法和本机的状态。
采用原始日志进行分析的,一些分的很小的ifram等的页面会被分别请求,导致打开一个页面的请求数并不一定是1,这也是原始日志的一些弊端。
同时,这些记录主要是为了跟踪服务器状态和服务器安全的,还有一些数据没有被记录下来。
· 页面的之间的关系没有被记录下来,用户到底是从那个页面访问哪个页面的关系没有。
· 不能区分出一个用户来的某一次访问来,尤其是对不需要就能访问的网站。
· 不能记录页面的操作,尤其是点击的操作。
于是一些网站制作了自己的记录方法,一般是用JS或者一个一像素图片的请求去记录这些些信息。
这样有几个信息又被记录下来了,访问的来源页面refer,session的编号,cookie的编号,以及点击所产生的数据。并且这些数据可以被直接记录进数据库里面。
采用这样的方式,的确降低了分析的难度,并且增加了可分析的信息,但是确是牺牲了一定的准确性。可谓是有得有失。
· 首先是可记录的数据,由于是在客户端产生的,所有凡是出现服务器错误的情况,数据100%会丢失,服务器根本没有相应,怎么能出数据呢!并且,由于需要启动了js才能呢高进行数据的传送,所有数据也会有一定的丢失,一般,服务器状态不差的情况下,98%的准确率是可以被接受的。
· 来源页面的数据还是会丢失,由于页面间跳转和协议的关系,来源页面中有一定的量会出现丢失的问题,比较麻烦的是https的页面由于是采用加密的协议进行传输的,无论采用什么方法,到http的页面上都会丢失。
· 受页面语言和协议的影响比较大,页面上的调用,Ajax,js什么的都可能影响的记录的准确性。
· 最后是所有页面都要加上代码,别小看这点,如果是页面多的话,这点上还真是个问题,那个页面如果是忘记了,都会去整体的数据产生影响。
· 找不到机器的IP,这点上的IP和日志上IP有一些区别,在某些多机器共用IP的情况下,记录的不是用户最终机器上的IP而是互联网接入路由上的IP。
综合以上,网站分析上面,由于数据的取得方式和网站本身的程序方式的关系比较复杂,所以在分析网站数据的时候,需要比较谨慎,数据中的故障和陷阱随时都可能发生。
文章来源:兰思的记录本