检测页面是不是被机器人访问

Posted

技术标签:

【中文标题】检测页面是不是被机器人访问【英文标题】:Detect if a page is visited by a bot检测页面是否被机器人访问 【发布时间】:2012-11-18 13:31:02 【问题描述】:

有没有办法检测页面是否被机器人访问?

我尝试检查 $_SERVER['HTTP_USER_AGENT'] 是否在数组中。它工作正常。

$bot = array("Slurp", "Scooter", "URL_Spider_SQL", "Googlebot", "Firefly", "WebBug", "WebFindBot", "crawler",  "appie", "msnbot", "InfoSeek", "FAST", "Spade", "NationalDirectory",);

if (in_array($_SERVER['HTTP_USER_AGENT'], $bot)) 
    return true;

else 
return false;

有没有更好更安全的方法来做到这一点? (除了必须输入所有机器人名称之外?)我的方法和this 有什么区别?

【问题讨论】:

解决方案之间没有太大区别,除了另一个 1) 不是数组 2) 确保 HTTP_USER_AGENT 的值是小写的,并且与小写值进行比较。就我个人而言,我会选择你的,但添加 strtolower 方法,并将所有蜘蛛/机器人添加为小写。 此时请注意一点:依赖 HTTP_USER_AGENT 并不安全,因为此字符串可以设置为您想要的任何内容。还有许多可用的机器人用户代理列表。也许使用其中之一而不是建立自己的列表。 【参考方案1】:

好吧,在 Google 内部进行了一些挖掘之后,我发现了这个。

$agent = strpos(strtolower($_SERVER['HTTP_USER_AGENT']));
foreach($bots as $name => $bot)

    if(stripos($agent,$bot)!==false)
    
        return true;
    
    else 
        return false;
    

感谢戴尔的支持!!

【讨论】:

【参考方案2】:

查看 Sid 的答案,并在 Google 上搜索我在 this site 上发现的其他检测方式。看:

function detect_is_bot () 
    $bots = array("Slurp", "Scooter", "URL_Spider_SQL", "Googlebot", "Firefly", "WebBug", "WebFindBot", "crawler",  "appie", "msnbot", "InfoSeek", "FAST", "Spade", "NationalDirectory",);
    $agent = strtolower($_SERVER['HTTP_USER_AGENT']);
    foreach($bots as $bot) 
        if(stripos($agent,$bot)!==false) return true;
    
    return false;

【讨论】:

以上是关于检测页面是不是被机器人访问的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式检测机器人

如何检测消息是不是被编辑?

万方+网络+机器学习

有没有办法用 JS 检测机器人(如谷歌)?

机器视觉检测都检测啥?原理是啥?

基于机器学习的web异常检测