Stephen的referrer统计系统使用和改进:如何对来自百度的来源进行统计


referer是HTTP协议中,记录用户访问当前网页前的链接地址,通过referer机制,可以把互联网的上各个节点天然自动关联成一个地图。
目前很多站点上显示的最新来源(referer)统计都是用的是:
Stephen的referrer统计系统

由于他的http://www.downes.ca/每天要承受85万的日统计访问量并承受大量的SPAM(referer作弊),因此已经关闭了referrers统计系统,但系统程序本身是基于GNU版权公开发布的,所以其实每个服务器上都可以安装(我在51.net上安装没成功)

以下是我的安装和改进简介:

目前有2个版本:
一个是1.0版本,也是我目前网站上在用的
另外一个是开发中的2.0版本,加入了对数据的支持。但是目前还没有找到安装文档。

安装:
一个是嵌入页面中的JavaScript代码referrers.js,一个是后台的CGI统计程序referrers.cgi

比如把referers.js部署在
http://www.example.com/referrers.js
其中的代码指向:
http://www.example.com/cgi-bin/website/referrers.cgi

在需要进行来源统计的页面中将
<script language="Javascript"  src="http://www.chedong.com/referrers.js"></script>
嵌入就可以了

改进:如何让百度的来源得以显示
以前遇到一个问题,来源统计中来自搜索引擎的应该很多,但是没有百度的:我检查了一下发现通过以下方式可以记录。可能是百度的搜索页面baidu?word=xxx做了一些特别的设置导致了无法统计吧
可能是因为http://www.google.com/search参数为空,Google仍然可以返回带有标题的网页,但是百度http://www.baidu.com/baidu如果没有参数,就是“找不到网页”了。所以REFERER系统在去掉参数后,就可能找不到来源。

我发现在代码中加入以下修改,按照真对类似Google的方式统计来自百度和3721的来源,搜索结果也就会有统计了:
if ($in =~ /google/ig) { $in = "http://www.google.com"; } # Standardize Google
if ($in =~ /baidu/g) {$in = "http://www.baidu.com";} # Standardize Baidu
if ($in =~ /3721/g) {$in = "http://www.3721.com";} # Standardize 3721

其实,目前的REFERER统计系统是精确到页面级的,在后面的版本中都变成域名级的了。

另外:字符集问题
由于JS的显示页面和来源页面的字符集不一致:比如来源网站是简体中文GBK字符集,而JS嵌入的页面是UTF-8,这样在显示的时候就有可能乱码。另外:MT的TRACKBACK中也有类似问题。

因此需要进行一些字符集的检测和转换过程。近期我打算参照在AWStats中做的UTF-8自动检测改进对referer.js做一些改造。

总体来说:referrers系统 1.0由于记录是基于CGI对文本的操作的,总体效率不是很高,但是配置简单,很适合小访问量的个人站点使用,包括很多BLOG系统本身,都是非常小巧,适合个人构建,这样很多服务和内容就不会因为个别服务商网站的倒掉对内容,也就是互联网所提倡的所谓的“分权”和“无中心化”(Decentralization)

注释:
HTTP标准中的referer的确是一个笔误:少了一个'r',应该是referrer,但用的时间长了,也就成了标准。

后记:
6E完成了一个修正后的版本,并提供了服务。

作者:车东 发表于:2004-03-23 13:03 最后更新于:2007-04-15 19:04
版权声明:可以转载,转载时请务必以超链接形式标明文章 的原始出处和作者信息及本版权声明

引用通告

以下是前来引用的链接: Stephen的referrer统计系统使用和改进:如何对来自百度的来源进行统计:

» 彻底解决 refer 编码问题 来自 六翼的天使
只要将下面的代码加入您的网页,就能够跟踪有谁联接您的网页: 这个网页的反向跟踪,比较适合放在blog 的主网页里面。 UTF-8 编码请使用如下的代码: GB 汉字编码,请使用下面的代码: 很粗略... [阅读更多细节]

» ReferrersӸټ 来自 Ragnarok Studio
ReferrersһInternetӵCGIűһЩطʹáǿSunnyҲŷֵġʵܻ/ӷĺܺõķַʵһӦõĺļCMSеԶӡܣ˳˼صӣ Stephe... [阅读更多细节]

» NewGator: 带反相连接统计的RSS订阅服务和Bloglines的成本分析 来自 车东[Blog^2]
前2天BlogLines闹水管工的时候,尝试将BlogLines上的RSS书签通... [阅读更多细节]

» 年终总结:2006 chedong.com 年终小结 来自 车东[Blog^2]
又到了年终小结的时候了: chedong.com: 网站大部分流量来源仍然是Go... [阅读更多细节]

Comments

你的办法确实好用!
如果用百度搜索“3721 车东”,这个referrer不知道会算到谁的头上,^_^

根据先后顺序,这个结果应该是3721。
最好匹配完整一些,例如:

if ($in =~ /seek.3721.com/g) 就不会出现匹配多次成功。

参照了在AWStats中做的UTF-8自动检测和hedong的帮助,我把字符集问题解决了,谢谢你的文章的启发
http://www.5ilinux.com/blog/archives/000135.html

基本思想是这样的,就是做两套的refer系统,一个专门显示gb2312,另外一个专门显示utf-8

在utf-8的系统里,所有的title都经过 gb --> utf-8 的转换,当然gb 转换会有正确的结果,但是utf-8 本身是3字节code,因此转换成2字节的gb2312会有 exception,可以catch exception,就知道它本身就是 utf-8 了。
简单增加了3行程序:

$dtittmp = $dtit ;
$dtit = $converter->convert($dtit);
unless ($dtit) { $dtit = $dtittmp; }

改过以后的程序:
http://luliang.dhs.org/luliang/download/chinese/referrers.txt

我也做了一个refer,感觉不错
http://www.douzhe.com/

能找到baidu,3721,psearch.163.com.........

我也做了一个反向链接(Referrers)系统,用ASP+Access做的,而且是开源的。
请访问我的Blog:http://blog.csdn.net/caviler/

发表一个评论

(如果你此前从未在此 Blog 上发表过评论,则你的评论必须在 Blog 主人验证后才能显示,请你耐心等候。)

Creative Commons License
此 Blog 中的日记遵循以下授权 Creative Commons(创作共用)授权.
Powered by
Movable Type 3.36