我的网站在某些页面上统计访问者的浏览量。我注意到Google和其他Bot疯狂地“点击”了我的网站,并且某些页面的观看次数不切实际(与人工制作的相比)。
我正在寻求最佳做法,以将这些漫游器排除在我的视野之外。显然,包含“机器人”的简单“用户代理”是不会做的。
我认为没有解决方案,也不需要。
注意:我使用的是PHP + MySQL。
我的网站在某些页面上统计访问者的浏览量。我注意到Google和其他Bot疯狂地“点击”了我的网站,并且某些页面的观看次数不切实际(与人工制作的相比)。
我正在寻求最佳做法,以将这些漫游器排除在我的视野之外。显然,包含“机器人”的简单“用户代理”是不会做的。
我认为没有解决方案,也不需要。
注意:我使用的是PHP + MySQL。
Answers:
我很高兴您知道不会有实现这种目标的防弹方法。这意味着您的观点至少是现实的。
由于不是JavaScript选项,所以我会说:
在用户代理中检查单词“ bot”。那将抓住他们中的大多数。
编译已知机器人的列表,并根据某种唯一标识符(可能是用户代理)对其进行过滤。
在网站的页脚中放置一个隐藏链接,该链接链接到一个收集用户代理和/或IP地址的页面。用户看不到,但机器人会看到。因此,访问该页面的任何人都将成为机器人。记录它们,然后从您的统计信息中屏蔽它们。
有三种相当简单的方法:
更新:最近,Googlebot和一些主要的bot 都运行JavaScript。因此,仅使用选项#2不再可行。但是,这确实意味着将其与#3结合使用应该非常可靠,因为您可以使用JS轻松排除大多数机器人,然后在服务器端排除运行JS的主要机器人(例如Googlebot)。
另外,如评论中所述,您可以尝试使用Google Analytics(分析)API来显示每个页面的视图。
如果您使用Javascript来计算观看次数,则大多数漫游器都不会运行它,因此不会包含在观看次数中。这个答案可能接近您想要的答案/programming/1973448/how-can-i-count-a-page-views
我的方法涉及两个步骤:
Mozilla|Opera|PSP|Bunjalloo|wii
。由于用户代理欺骗,此检查将检测到几乎所有浏览器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'] );
}
我只使用简单的用户代理解析排除。它消除了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%')
您可以将图片用作计数器,在这种情况下,它不会计算漫游器,并且页面名称将作为带有图片名称的查询传递
我在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);