计算忽略搜索引擎的页面的观看次数?
我注意到StackOverflow对每个问题都有一个视图计数,并且这些视图编号相当低且准确。
我的一个网站上也有类似的东西。当页面在后端代码中加载时,它基本上记录"命中"。不幸的是,它也会对搜索引擎中的点击数产生giving肿和不准确的结果。
我猜不算机器人的一种方法是在页面加载后通过AJAX调用进行视图计数,但是我敢肯定还有其他更好的方法可以忽略点击计数器中的搜索引擎,同时仍然让它们进入抓取网站。你知道任何?
解决方案
回答
堆栈溢出具有准确的视图计数的原因是,它仅对每个视图/用户计数一次。
第三方点击计数器(和网络统计信息)应用程序通常会过滤掉搜索引擎,并在单独的窗口/标签/部分中显示它们。
回答
我们或者必须使用AJAX来完成我们在问题中所说的话。或者排除已知的搜索引擎的用户代理字符串。停止机器人的唯一肯定方法是使用AJAX。
回答
可以使用AJAX调用,但是通常搜索引擎不会加载图像,JavaScript或者CSS文件,因此在页面中包含这些文件之一并传递我们要针对其记录请求的页面的URL可能会更容易。作为文件请求中的参数。
例如,在页面中...
http://www.example.com/example.html
我们可能会包括在头部
<link href="empty.css?log=example.html" rel="stylesheet" type="text/css" />
并让服务器端记录该请求,然后返回一个空的CSS文件。尽管在所有情况下都需要仔细查看可能发生的缓存,但是相同的方法也适用于JavaScript或者图像文件。
另一种选择是根据搜索引擎的用户代理消除搜索引擎。 http://user-agents.org/上有很多可能的用户代理,可以入门。当然,我们可以采用另一种方式,并且只计算来自我们所知道的Web浏览器的请求(覆盖IE,Firefox,Safari,Opera和这种新颖的Chrome可以使我们获得99%的访问权限)。
使用awstats之类的日志分析工具或者Google Analytics等之类的服务会更加容易,这两种工具都已经解决了这个问题。
回答
我们实际上不需要使用AJAX,只需使用JavaScript在屏幕外添加iFrame。把事情简单化
<script type="javascript"> document.write('<iframe src="myLogScript.php" style="visibility:hidden" width="1" height="1" frameborder="0">'); </script>
回答
为了解决此问题,我实现了一个简单的过滤器,该过滤器将查看HTTP请求中的User-Agent标头并将其与已知机器人的列表进行比较。
我从www.robotstxt.org获得了机器人列表。它可以以简单的文本格式下载,可以轻松地对其进行解析以自动生成"黑名单"。
回答
Matt Sheppard的答案的扩展可能类似于以下内容:
<script type="text/javascript"> var thePg=window.location.pathname; var theSite=window.location.hostname; var theImage=new Image; theImage.src="/test/hitcounter.php?pg=" + thePg + "?site=" + theSite; </script>
可以将其插入页面页眉或者页脚模板中,而无需替换服务器端的页面名称。请注意,如果包含查询字符串(window.location.search),则该字符串的健壮版本应对该字符串进行编码,以防止邪恶者基于URL中的怪异内容来设计利用漏洞的页面请求。与常规的<img>标签或者<iframe>相比,这样做的好处是,如果hitcounter脚本有问题,用户将看不到红色的x。
在某些情况下,了解服务器端发生的重写之前在浏览器中看到的URL也很重要,这可以为我们提供帮助。如果两种方法都想要,则在服务器端添加另一个参数,该参数还将页面名称的该版本插入查询字符串中。
来自此页面测试的日志文件示例:
10.1.1.17 - - [13/Sep/2008:22:21:00 -0400] "GET /test/testpage.html HTTP/1.1" 200 306 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16" 10.1.1.17 - - [13/Sep/2008:22:21:00 -0400] "GET /test/hitcounter.php?pg=/test/testpage.html?site=www.home.***.com HTTP/1.1" 301 - "http://www.home.***.com/test/testpage.html" "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16"