从观看次数中排除漫游器的最佳方法是什么?


11

我的网站在某些页面上统计访问者的浏览量。我注意到Google和其他Bot疯狂地“点击”了我的网站,并且某些页面的观看次数不切实际(与人工制作的相比)。

我正在寻求最佳做法,以将这些漫游器排除在我的视野之外。显然,包含“机器人”的简单“用户代理”是不会做的。

我认为没有解决方案,也不需要。

注意:我使用的是PHP + MySQL。


问题的正确答案取决于用于跟踪统计信息的软件类型。
Goboozo 2011年

@Goboozo我正在使用PHP + MySQL。这不是为了跟踪我的统计信息。这是关于“相关”,“热门”和“有趣”条目的查询。
eisberg 2011年

Answers:


19

我很高兴您知道不会有实现这种目标的防弹方法。这意味着您的观点至少是现实的。

由于不是JavaScript选项,所以我会说:

  • 在用户代理中检查单词“ bot”。那将抓住他们中的大多数。

  • 编译已知机器人的列表,并根据某种唯一标识符(可能是用户代理)对其进行过滤。

  • 在网站的页脚中放置一个隐藏链接,该链接链接到一个收集用户代理和/或IP地址的页面。用户看不到,但机器人会看到。因此,访问该页面的任何人都将成为机器人。记录它们,然后从您的统计信息中屏蔽它们。


这看起来很有希望。我喜欢陷阱的想法。对于用户评论,我在网站上使用不可见的输入字段(而不是丑陋的验证码)做了类似的操作。:-)
eisberg 2011年

2
@eisberg,它被称为蜜罐。我本人是他们的忠实粉丝。
约翰·孔德

可能是最好的解决方案...
vkGunasekaran 2014年

7

有三种相当简单的方法:

  1. 使用Google Analytics(分析),它将为您处理和处理所有数据,并为您提供访问者及其访问网站的详细统计信息。到目前为止,这是最简单的解决方案。
  2. 使用Javascript进行计数。页面加载后,向您的计数脚本生成AJAX请求。机器人和蜘蛛不会运行Javascript。
  3. 实际上,在用户代理字符串中检测“ bot”是相当可靠的。另外,您可以只使用Googlebot,Yahoo,MSNbot等已知的漫游器。检查这三个漫游器应该可以覆盖您的漫游器流量的99%。此页面还有其他页面,但看起来已经过时了。

更新:最近,Googlebot和一些主要的bot 运行JavaScript。因此,仅使用选项#2不再可行。但是,这确实意味着将其与#3结合使用应该非常可靠,因为您可以使用JS轻松排除大多数机器人,然后在服务器端排除运行JS的主要机器人(例如Googlebot)。

另外,如评论中所述,您可以尝试使用Google Analytics(分析)API来显示每个页面的视图。


1和2与我的问题无关。也许我应该问过“我如何获得一个像stackechange这样的视图计数器而忽略了机器人?” 所以我的错了:-)尽管如此,在3中的清单还是很不错的。谢谢,我会检查一下。
eisberg 2011年

抱歉,没有意识到您正在页面上显示视图计数。在这种情况下,2和3都是可行的。
DisgruntledGoat

谢谢您的努力。至少对我来说,javascript永远不是答案,所以我坚持使用3,但是指标太多了:-(
eisberg 2011年

实际上,某些机器人确实运行一些JavaScript。我设置了一个Ajax请求来跟踪与屏幕尺寸有关的视口尺寸。Googlebot报告了两种不同的屏幕尺寸。
toxalot

我知道这个问题很旧并且已经有解决方案,但是如果仅是为了显示人类意见计数器,为什么不使用Google Analitycs API?stackoverflow.com/questions/19484009/...
KeizerBridge

3

如果您使用Javascript来计算观看次数,则大多数漫游器都不会运行它,因此不会包含在观看次数中。这个答案可能接近您想要的答案/programming/1973448/how-can-i-count-a-page-views


不,我没有使用Javascript。这是一个正常的PHP + MySQL网站。但是无论如何,谢谢您的答复:-)
eisberg 2011年

不要这么快打折这个答案。即使使用PHP + MySQL的站点,也无法阻止您发出一些JavaScript来生成视图计数器。而不是直接输出计数器,而是输出类似'<script> document.write(<counter-code>)</ script>'之类的内容,其中<counter-code>是创建计数器所需的内容。
Itai

@Itai抱歉,但是我不会使用javascript来统计访问者。但是还是谢谢你。
eisberg 2011年

如果您不想使用JavaScript,只需将其清楚地放在问题中即可。正如Itai所说,没有什么可以阻止我们考虑针对PHP网站的JavaScript解决方案。
天前2012年

实际上,某些机器人确实运行一些JavaScript。我设置了一个Ajax请求来跟踪与屏幕尺寸有关的视口尺寸。Googlebot报告了两种不同的屏幕尺寸。
toxalot

3

我的方法涉及两个步骤:

  1. 通过将用户代理字符串的开头与匹配,仅过滤Web浏览器和控制台Mozilla|Opera|PSP|Bunjalloo|wii。由于用户代理欺骗,此检查将检测到几乎所有浏览器
  2. 通过通用停止字符串排除机器人 bot|crawl|slurp|spider

因此,如果通过了第一步,我们就假定它是一个浏览器,并且背后有一个真正的访客。正如我发现的那样,尽管有些机器人伪装成Mozilla兼容的,然后用它启动用户代理字符串。这就是为什么第二遍可以派上用场并消除它们的原因。

function isBrowser () {

    return preg_match( '/^(Mozilla|Opera|PSP|Bunjalloo|wii)/i', $_SERVER['HTTP_USER_AGENT'] ) && !preg_match( '/bot|crawl|slurp|spider/i', $_SERVER['HTTP_USER_AGENT'] );
}

2

我只使用简单的用户代理解析排除。它消除了99%进入我页面的机器人。

SELECT * FROM `live_visitors` where (
lower(agent) != '%bot%' and
lower(agent) != '%slurp%' and
lower(agent) != '%spider%' and
lower(agent) != '%crawl%' and
lower(agent) != '%archiver%' and
lower(agent) != '%facebook%')

1
这无济于事(至少就我而言),因为几乎我可以通过其行为(速度过快的浏览,所有链接的按时间顺序的浏览...)识别的每个bot都使用有效的User-Agent。但是对于其他项目来说是个好主意。
eisberg 2011年

2

您可以将图片用作计数器,在这种情况下,它不会计算漫游器,并且页面名称将作为带有图片名称的查询传递

我在img.php上使用它来更新数据库中的页面视图:

<?php
$xnt = $_GET["ID"]; if (isset($xnt) && is_numeric($xnt)) {
$DBServer = "localhost"; $DBUser = "xxx"; $DBPass = "xxx"; $DBaze = "xxx";
$conn = mysqli_connect($DBServer, $DBUser, $DBPass, $DBaze); 
mysqli_query($conn, "UPDATE stats SET stats_vz=stats_vz+1 WHERE stats_id=".$xnt);
mysqli_close($conn);}
$im = @imagecreatetruecolor(1, 1); imagesavealpha($im, true); imagealphablending($im, false); $white = imagecolorallocatealpha($im, 255, 255, 255, 127); imagefill($im, 0, 0, $white);
header("Content-type: image/png"); imagepng($im); imagedestroy($im);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.