【问题标题】:how to detect search engine bots with php?如何使用 php 检测搜索引擎机器人?
【发布时间】:2010-10-15 05:07:25
【问题描述】:

如何使用 php 检测搜索引擎机器人?

【问题讨论】:

    标签: php web-crawler bots


    【解决方案1】:

    验证Googlebot

    因为用户代理可以更改...

    唯一官方支持的识别 google bot 的方法是运行 对访问 IP 地址进行反向 DNS 查找并运行正向 DNS 查找结果以验证它是否指向访问 IP 地址 并且生成的域名在 googlebot.com 或 google.com 中 域。

    取自here

    所以您必须运行 DNS 查找

    reverseforward

    Google Search Central 上查看this guide

    【讨论】:

      【解决方案2】:

      可能会迟到,但是隐藏链接怎么样。所有机器人都会使用 rel 属性跟随,只有坏机器人会使用 nofollow rel 属性。

      <a style="display:none;" rel="follow" href="javascript:void(0);" onclick="isabot();">.</a>
      
      function isabot(){
      //define a variable to pass with ajax to php
      // || send bots info direct to where ever.
      isabot = true;
      }
      

      对于一个坏机器人,你可以使用这个:

      <a style="display:none;" href="javascript:void(0);" rel="nofollow" onclick="isBadbot();">.</a>
      

      对于特定于 PHP,您可以删除 onclick 属性并将 href 属性替换为指向您的 ip 检测器/bot 检测器的链接,如下所示:

      <a style="display:none;" rel="follow" href="https://somedomain.com/botdetector.php">.</a>
      

      <a style="display:none;" rel="nofollow" href="https://somedomain.com/badbotdetector.php">.</a>
      

      您可以使用它,也可以同时使用两者,一个检测机器人,而另一个证明它是一个坏机器人。

      希望你觉得这很有用

      【讨论】:

        【解决方案3】:

        如果你真的需要检测 GOOGLE 引擎机器人,你应该永远不要依赖“user_agent”或“IP”地址,因为“user_agent”可以根据谷歌所说的进行更改:Verifying Googlebot

        验证 Googlebot 为调用者:

        1.使用 host 命令对日志中的访问 IP 地址运行 反向 DNS 查找。

        2.验证域名在 googlebot.comgoogle.com

        3. 对在步骤 1 中检索到的域名使用检索到的域名的 host 命令运行 正向 DNS 查找。验证它是否与您日志中的原始访问 IP 地址相同。

        这是我测试过的代码:

        <?php
        $remote_add=$_SERVER['REMOTE_ADDR'];
        $hostname = gethostbyaddr($remote_add);
        $googlebot = 'googlebot.com';
        $google = 'google.com';
        if (stripos(strrev($hostname), strrev($googlebot)) === 0 or stripos(strrev($hostname),strrev($google)) === 0 ) 
        {
        //add your code
        }
        
        ?>
        

        在这段代码中,我们检查“主机名”,它应该在“主机名”的末尾包含“googlebot.com”或“google.com”,这对于检查确切的域而不是子域非常重要。 我希望你喜欢;)

        【讨论】:

        • 这是唯一正确的答案,当您绝对需要确保请求来自 Google 或 Googlebot 时。请参阅 Google 文档Verifying Googlebot
        • 对于那些试图通过 UA 验证 Google bot 的人,你们是在自欺欺人(和您的合作伙伴)。正如 Sjoerd 所说,验证主机是唯一正确的解决方案。
        【解决方案4】:

        对于 Google,我正在使用这种方法。

        function is_google() {
            $ip   = $_SERVER['REMOTE_ADDR'];
            $host = gethostbyaddr( $ip );
            if ( strpos( $host, '.google.com' ) !== false || strpos( $host, '.googlebot.com' ) !== false ) {
        
                $forward_lookup = gethostbyname( $host );
        
                if ( $forward_lookup == $ip ) {
                    return true;
                }
        
                return false;
            } else {
                return false;
            }
        
        }
        
        var_dump( is_google() );
        

        致谢:https://support.google.com/webmasters/answer/80553

        【讨论】:

          【解决方案5】:

          100% Working Bot 检测器。它在我的网站上成功运行。

          function isBotDetected() {
          
              if ( preg_match('/abacho|accona|AddThis|AdsBot|ahoy|AhrefsBot|AISearchBot|alexa|altavista|anthill|appie|applebot|arale|araneo|AraybOt|ariadne|arks|aspseek|ATN_Worldwide|Atomz|baiduspider|baidu|bbot|bingbot|bing|Bjaaland|BlackWidow|BotLink|bot|boxseabot|bspider|calif|CCBot|ChinaClaw|christcrawler|CMC\/0\.01|combine|confuzzledbot|contaxe|CoolBot|cosmos|crawler|crawlpaper|crawl|curl|cusco|cyberspyder|cydralspider|dataprovider|digger|DIIbot|DotBot|downloadexpress|DragonBot|DuckDuckBot|dwcp|EasouSpider|ebiness|ecollector|elfinbot|esculapio|ESI|esther|eStyle|Ezooms|facebookexternalhit|facebook|facebot|fastcrawler|FatBot|FDSE|FELIX IDE|fetch|fido|find|Firefly|fouineur|Freecrawl|froogle|gammaSpider|gazz|gcreep|geona|Getterrobo-Plus|get|girafabot|golem|googlebot|\-google|grabber|GrabNet|griffon|Gromit|gulliver|gulper|hambot|havIndex|hotwired|htdig|HTTrack|ia_archiver|iajabot|IDBot|Informant|InfoSeek|InfoSpiders|INGRID\/0\.1|inktomi|inspectorwww|Internet Cruiser Robot|irobot|Iron33|JBot|jcrawler|Jeeves|jobo|KDD\-Explorer|KIT\-Fireball|ko_yappo_robot|label\-grabber|larbin|legs|libwww-perl|linkedin|Linkidator|linkwalker|Lockon|logo_gif_crawler|Lycos|m2e|majesticsEO|marvin|mattie|mediafox|mediapartners|MerzScope|MindCrawler|MJ12bot|mod_pagespeed|moget|Motor|msnbot|muncher|muninn|MuscatFerret|MwdSearch|NationalDirectory|naverbot|NEC\-MeshExplorer|NetcraftSurveyAgent|NetScoop|NetSeer|newscan\-online|nil|none|Nutch|ObjectsSearch|Occam|openstat.ru\/Bot|packrat|pageboy|ParaSite|patric|pegasus|perlcrawler|phpdig|piltdownman|Pimptrain|pingdom|pinterest|pjspider|PlumtreeWebAccessor|PortalBSpider|psbot|rambler|Raven|RHCS|RixBot|roadrunner|Robbie|robi|RoboCrawl|robofox|Scooter|Scrubby|Search\-AU|searchprocess|search|SemrushBot|Senrigan|seznambot|Shagseeker|sharp\-info\-agent|sift|SimBot|Site Valet|SiteSucker|skymob|SLCrawler\/2\.0|slurp|snooper|solbot|speedy|spider_monkey|SpiderBot\/1\.0|spiderline|spider|suke|tach_bw|TechBOT|TechnoratiSnoop|templeton|teoma|titin|topiclink|twitterbot|twitter|UdmSearch|Ukonline|UnwindFetchor|URL_Spider_SQL|urlck|urlresolver|Valkyrie libwww\-perl|verticrawl|Victoria|void\-bot|Voyager|VWbot_K|wapspider|WebBandit\/1\.0|webcatcher|WebCopier|WebFindBot|WebLeacher|WebMechanic|WebMoose|webquest|webreaper|webspider|webs|WebWalker|WebZip|wget|whowhere|winona|wlm|WOLP|woriobot|WWWC|XGET|xing|yahoo|YandexBot|YandexMobileBot|yandex|yeti|Zeus/i', $_SERVER['HTTP_USER_AGENT'])
              ) {
                  return true; // 'Above given bots detected'
              }
          
              return false;
          
          } // End :: isBotDetected()
          

          【讨论】:

            【解决方案6】:

            我为此做了一个又好又快的函数

            function is_bot(){
            
                    if(isset($_SERVER['HTTP_USER_AGENT']))
                    {
                        return preg_match('/rambler|abacho|acoi|accona|aspseek|altavista|estyle|scrubby|lycos|geona|ia_archiver|alexa|sogou|skype|facebook|twitter|pinterest|linkedin|naver|bing|google|yahoo|duckduckgo|yandex|baidu|teoma|xing|java\/1.7.0_45|bot|crawl|slurp|spider|mediapartners|\sask\s|\saol\s/i', $_SERVER['HTTP_USER_AGENT']);
                    }
            
                    return false;
                }
            

            这涵盖了所有可能的机器人、搜索引擎等的 99%。

            【讨论】:

              【解决方案7】:

              查看$_SERVER['HTTP_USER_AGENT'] 获取此处列出的一些字符串:

              http://www.useragentstring.com/pages/useragentstring.php

              或者更具体地用于爬虫:

              http://www.useragentstring.com/pages/useragentstring.php?typ=Crawler

              如果你想记录最常见的搜索引擎爬虫的访问次数,你可以使用

              $interestingCrawlers = array( 'google', 'yahoo' );
              $pattern = '/(' . implode('|', $interestingCrawlers) .')/';
              $matches = array();
              $numMatches = preg_match($pattern, strtolower($_SERVER['HTTP_USER_AGENT']), $matches, 'i');
              if($numMatches > 0) // Found a match
              {
                // $matches[1] contains an array of all text matches to either 'google' or 'yahoo'
              }
              

              【讨论】:

                【解决方案8】:

                我使用这个函数......正则表达式的一部分来自 prestashop,但我添加了一些更多的机器人。

                    public function isBot()
                {
                    $bot_regex = '/BotLink|bingbot|AhrefsBot|ahoy|AlkalineBOT|anthill|appie|arale|araneo|AraybOt|ariadne|arks|ATN_Worldwide|Atomz|bbot|Bjaaland|Ukonline|borg\-bot\/0\.9|boxseabot|bspider|calif|christcrawler|CMC\/0\.01|combine|confuzzledbot|CoolBot|cosmos|Internet Cruiser Robot|cusco|cyberspyder|cydralspider|desertrealm, desert realm|digger|DIIbot|grabber|downloadexpress|DragonBot|dwcp|ecollector|ebiness|elfinbot|esculapio|esther|fastcrawler|FDSE|FELIX IDE|ESI|fido|H�m�h�kki|KIT\-Fireball|fouineur|Freecrawl|gammaSpider|gazz|gcreep|golem|googlebot|griffon|Gromit|gulliver|gulper|hambot|havIndex|hotwired|htdig|iajabot|INGRID\/0\.1|Informant|InfoSpiders|inspectorwww|irobot|Iron33|JBot|jcrawler|Teoma|Jeeves|jobo|image\.kapsi\.net|KDD\-Explorer|ko_yappo_robot|label\-grabber|larbin|legs|Linkidator|linkwalker|Lockon|logo_gif_crawler|marvin|mattie|mediafox|MerzScope|NEC\-MeshExplorer|MindCrawler|udmsearch|moget|Motor|msnbot|muncher|muninn|MuscatFerret|MwdSearch|sharp\-info\-agent|WebMechanic|NetScoop|newscan\-online|ObjectsSearch|Occam|Orbsearch\/1\.0|packrat|pageboy|ParaSite|patric|pegasus|perlcrawler|phpdig|piltdownman|Pimptrain|pjspider|PlumtreeWebAccessor|PortalBSpider|psbot|Getterrobo\-Plus|Raven|RHCS|RixBot|roadrunner|Robbie|robi|RoboCrawl|robofox|Scooter|Search\-AU|searchprocess|Senrigan|Shagseeker|sift|SimBot|Site Valet|skymob|SLCrawler\/2\.0|slurp|ESI|snooper|solbot|speedy|spider_monkey|SpiderBot\/1\.0|spiderline|nil|suke|http:\/\/www\.sygol\.com|tach_bw|TechBOT|templeton|titin|topiclink|UdmSearch|urlck|Valkyrie libwww\-perl|verticrawl|Victoria|void\-bot|Voyager|VWbot_K|crawlpaper|wapspider|WebBandit\/1\.0|webcatcher|T\-H\-U\-N\-D\-E\-R\-S\-T\-O\-N\-E|WebMoose|webquest|webreaper|webs|webspider|WebWalker|wget|winona|whowhere|wlm|WOLP|WWWC|none|XGET|Nederland\.zoek|AISearchBot|woriobot|NetSeer|Nutch|YandexBot|YandexMobileBot|SemrushBot|FatBot|MJ12bot|DotBot|AddThis|baiduspider|SeznamBot|mod_pagespeed|CCBot|openstat.ru\/Bot|m2e/i';
                    $userAgent = empty($_SERVER['HTTP_USER_AGENT']) ? FALSE : $_SERVER['HTTP_USER_AGENT'];
                    $isBot = !$userAgent || preg_match($bot_regex, $userAgent);
                
                    return $isBot;
                }
                

                无论如何,请注意一些机器人使用浏览器(如用户代理)来伪造他们的身份
                (我的网站上有很多俄罗斯 ip 有这种行为)

                大多数机器人的一个显着特点是它们不携带任何 cookie,因此不附加任何会话。
                (我不确定如何,但这肯定是跟踪它们的最佳方法)

                【讨论】:

                  【解决方案9】:
                  function bot_detected() {
                  
                    if(preg_match('/bot|crawl|slurp|spider|mediapartners/i', $_SERVER['HTTP_USER_AGENT']){
                      return true;
                    }
                    else{
                      return false;
                    }
                  }
                  

                  【讨论】:

                    【解决方案10】:

                    我使用以下似乎工作正常的代码:

                    function _bot_detected() {
                    
                      return (
                        isset($_SERVER['HTTP_USER_AGENT'])
                        && preg_match('/bot|crawl|slurp|spider|mediapartners/i', $_SERVER['HTTP_USER_AGENT'])
                      );
                    }
                    

                    更新 16-06-2017 https://support.google.com/webmasters/answer/1061943?hl=en

                    添加了媒体合作伙伴

                    【讨论】:

                    • 这是否假设机器人会这样展示自己?
                    • 投反对票,用户代理可以在chrome设置中更改,firefox,
                    • 是的,用户代理可以更改,但如果有人将其更改为包含“bot”、“crawl”、“slurp”或“spider”,他们知道会发生什么。它还取决于实用性。我不会使用它来删除所有 CSS,但我会使用它来不存储​​ cookie、忽略位置记录或跳过登录页面。
                    • 没有人同意我说这是一种广泛匹配的方法吗?
                    • 这个答案中的正则表达式非常简单和广泛。出于我的目的,我想快点,但我不在乎是否有一些误报或漏报。
                    【解决方案11】:

                    我正在使用它来检测机器人:

                    if (preg_match('/bot|crawl|curl|dataprovider|search|get|spider|find|java|majesticsEO|google|yahoo|teoma|contaxe|yandex|libwww-perl|facebookexternalhit/i', $_SERVER['HTTP_USER_AGENT'])) {
                        // is bot
                    }
                    

                    此外,我使用白名单来阻止不需要的机器人:

                    if (preg_match('/apple|baidu|bingbot|facebookexternalhit|googlebot|-google|ia_archiver|msnbot|naverbot|pingdom|seznambot|slurp|teoma|twitter|yandex|yeti/i', $_SERVER['HTTP_USER_AGENT'])) {
                        // allowed bot
                    }
                    

                    然后,不受欢迎的机器人(= 误报用户)能够破解验证码,在 24 小时内解除对自己的阻止。由于没有人解决这个验证码,我知道它不会产生误报。所以机器人检测似乎工作得很好。

                    注意:我的白名单基于Facebooks robots.txt

                    【讨论】:

                    • 您在第一段代码中忘记了结束 )
                    【解决方案12】:

                    我正在使用这个代码,很不错。您将很容易知道访问过您网站的用户代理。此代码正在打开一个文件并将 user_agent 写入文件。您可以通过转到yourdomain.com/useragent.txt 每天检查此文件并了解新的 user_agents 并将它们放在您的 if 子句条件中。

                    $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']);
                    if(!preg_match("/Googlebot|MJ12bot|yandexbot/i", $user_agent)){
                        // if not meet the conditions then
                        // do what you need
                    
                        // here open a file and write the user_agent down the file. You can check each day this file useragent.txt and know about new user_agents and put them in your condition of if clause
                        if($user_agent!=""){
                            $myfile = fopen("useragent.txt", "a") or die("Unable to open file useragent.txt!");
                            fwrite($myfile, $user_agent);
                            $user_agent = "\n";
                            fwrite($myfile, $user_agent);
                            fclose($myfile);
                        }
                    }
                    

                    这是useragent.txt的内容

                    Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
                    Mozilla/5.0 (compatible; MJ12bot/v1.4.6; http://mj12bot.com/)Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
                    Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)mozilla/5.0 (compatible; yandexbot/3.0; +http://yandex.com/bots)
                    mozilla/5.0 (compatible; yandexbot/3.0; +http://yandex.com/bots)
                    mozilla/5.0 (compatible; yandexbot/3.0; +http://yandex.com/bots)
                    mozilla/5.0 (compatible; yandexbot/3.0; +http://yandex.com/bots)
                    mozilla/5.0 (compatible; yandexbot/3.0; +http://yandex.com/bots)
                    mozilla/5.0 (iphone; cpu iphone os 9_3 like mac os x) applewebkit/601.1.46 (khtml, like gecko) version/9.0 mobile/13e198 safari/601.1
                    mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/53.0.2785.143 safari/537.36
                    mozilla/5.0 (compatible; linkdexbot/2.2; +http://www.linkdex.com/bots/)
                    mozilla/5.0 (windows nt 6.1; wow64; rv:49.0) gecko/20100101 firefox/49.0
                    mozilla/5.0 (windows nt 6.1; wow64; rv:33.0) gecko/20100101 firefox/33.0
                    mozilla/5.0 (windows nt 6.1; wow64; rv:49.0) gecko/20100101 firefox/49.0
                    mozilla/5.0 (windows nt 6.1; wow64; rv:33.0) gecko/20100101 firefox/33.0
                    mozilla/5.0 (windows nt 6.1; wow64; rv:49.0) gecko/20100101 firefox/49.0
                    mozilla/5.0 (windows nt 6.1; wow64; rv:33.0) gecko/20100101 firefox/33.0
                    mozilla/5.0 (windows nt 6.1; wow64; rv:49.0) gecko/20100101 firefox/49.0
                    mozilla/5.0 (windows nt 6.1; wow64; rv:33.0) gecko/20100101 firefox/33.0
                    mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/53.0.2785.143 safari/537.36
                    mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/53.0.2785.143 safari/537.36
                    mozilla/5.0 (compatible; baiduspider/2.0; +http://www.baidu.com/search/spider.html)
                    zoombot (linkbot 1.0 http://suite.seozoom.it/bot.html)
                    mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, like gecko) chrome/44.0.2403.155 safari/537.36 opr/31.0.1889.174
                    mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, like gecko) chrome/44.0.2403.155 safari/537.36 opr/31.0.1889.174
                    sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)
                    mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, like gecko) chrome/44.0.2403.155 safari/537.36 opr/31.0.1889.174
                    

                    【讨论】:

                    • 你的 (if_clause ) 字符串片段是什么? mozilla/5.0 (iphone; cpu iphone os 9_3 like mac os x) applewebkit/601.1.46 (khtml, like gecko) version/9.0 mobile/13e198 safari/601.1
                    【解决方案13】:

                    您可以查看它是否是具有此功能的搜索引擎:

                    <?php
                    function crawlerDetect($USER_AGENT)
                    {
                    $crawlers = array(
                    'Google' => 'Google',
                    'MSN' => 'msnbot',
                          'Rambler' => 'Rambler',
                          'Yahoo' => 'Yahoo',
                          'AbachoBOT' => 'AbachoBOT',
                          'accoona' => 'Accoona',
                          'AcoiRobot' => 'AcoiRobot',
                          'ASPSeek' => 'ASPSeek',
                          'CrocCrawler' => 'CrocCrawler',
                          'Dumbot' => 'Dumbot',
                          'FAST-WebCrawler' => 'FAST-WebCrawler',
                          'GeonaBot' => 'GeonaBot',
                          'Gigabot' => 'Gigabot',
                          'Lycos spider' => 'Lycos',
                          'MSRBOT' => 'MSRBOT',
                          'Altavista robot' => 'Scooter',
                          'AltaVista robot' => 'Altavista',
                          'ID-Search Bot' => 'IDBot',
                          'eStyle Bot' => 'eStyle',
                          'Scrubby robot' => 'Scrubby',
                          'Facebook' => 'facebookexternalhit',
                      );
                      // to get crawlers string used in function uncomment it
                      // it is better to save it in string than use implode every time
                      // global $crawlers
                       $crawlers_agents = implode('|',$crawlers);
                      if (strpos($crawlers_agents, $USER_AGENT) === false)
                          return false;
                        else {
                        return TRUE;
                        }
                    }
                    ?>
                    

                    然后你可以像这样使用它:

                    <?php $USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
                      if(crawlerDetect($USER_AGENT)) return "no need to lang redirection";?>
                    

                    【讨论】:

                    【解决方案14】:

                    因为任何客户端都可以将用户代理设置为他们想要的,所以寻找“Googlebot”、“bingbot”等只是工作的一半。

                    第二部分是验证客户端的 IP。在过去,这需要维护 IP 列表。您在网上找到的所有列表都已过时。正如 Google https://support.google.com/webmasters/answer/80553 和 Bing http://www.bing.com/webmaster/help/how-to-verify-bingbot-3905dc26 所解释的那样,顶级搜索引擎正式支持通过 DNS 进行验证

                    首先对客户端 IP 执行反向 DNS 查找。对于 Google,这会在 googlebot.com 下带来一个主机名,对于 Bing,它在 search.msn.com 下。然后,因为有人可以在他的 IP 上设置这样的反向 DNS,所以您需要通过对该主机名的正向 DNS 查找进行验证。如果生成的 IP 与网站访问者的 IP 相同,则可以确定它是来自该搜索引擎的爬虫。

                    我用 Java 编写了一个库来为您执行这些检查。随意将其移植到 PHP。在 GitHub 上:https://github.com/optimaize/webcrawler-verifier

                    【讨论】:

                    • 使用用户代理字符串的所有其他答案都只是一半。哇。
                    • 有很多关于用户代理检查只是检查的一半。这是真的,但请记住,执行完整的 DNS 和反向 DNS 查找会对性能产生巨大影响。这完全取决于您为支持您的用例而需要获得的确定性水平。这是为了 100% 的确定性,但会牺牲性能。您必须根据自己的情况确定正确的平衡(以及最佳解决方案)。
                    • 没有“巨大的性能影响”。首先,反向 dns 查找仅对标识为搜索引擎的访问者执行。所有人类根本不受影响。然后,每个 IP 只执行一次此查找。结果被缓存。搜索引擎在很长一段时间内一直使用相同的 IP 范围,并且通常只使用一个或几个 IP 访问一个站点。另外:您可以延迟执行验证。让第一个请求通过,然后进行后台验证。如果是否定的,则阻止连续请求。 (我建议不要这样做,因为收割机现在有大量的 IP 池......)
                    • 有没有用 PHP 编写的类似库?
                    【解决方案15】:

                    使用Device Detector开源库,它提供了一个isBot()函数:https://github.com/piwik/device-detector

                    【讨论】:

                    • 注意:这个库只分析用户代理来决定访问者是否是机器人。
                    • 太重了,只能检查验证机器人。
                    【解决方案16】:
                     <?php // IPCLOACK HOOK
                    if (CLOAKING_LEVEL != 4) {
                        $lastupdated = date("Ymd", filemtime(FILE_BOTS));
                        if ($lastupdated != date("Ymd")) {
                            $lists = array(
                            'http://labs.getyacg.com/spiders/google.txt',
                            'http://labs.getyacg.com/spiders/inktomi.txt',
                            'http://labs.getyacg.com/spiders/lycos.txt',
                            'http://labs.getyacg.com/spiders/msn.txt',
                            'http://labs.getyacg.com/spiders/altavista.txt',
                            'http://labs.getyacg.com/spiders/askjeeves.txt',
                            'http://labs.getyacg.com/spiders/wisenut.txt',
                            );
                            foreach($lists as $list) {
                                $opt .= fetch($list);
                            }
                            $opt = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $opt);
                            $fp =  fopen(FILE_BOTS,"w");
                            fwrite($fp,$opt);
                            fclose($fp);
                        }
                        $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
                        $ref = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
                        $agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
                        $host = strtolower(gethostbyaddr($ip));
                        $file = implode(" ", file(FILE_BOTS));
                        $exp = explode(".", $ip);
                        $class = $exp[0].'.'.$exp[1].'.'.$exp[2].'.';
                        $threshold = CLOAKING_LEVEL;
                        $cloak = 0;
                        if (stristr($host, "googlebot") && stristr($host, "inktomi") && stristr($host, "msn")) {
                            $cloak++;
                        }
                        if (stristr($file, $class)) {
                            $cloak++;
                        }
                        if (stristr($file, $agent)) {
                            $cloak++;
                        }
                        if (strlen($ref) > 0) {
                            $cloak = 0;
                        }
                    
                        if ($cloak >= $threshold) {
                            $cloakdirective = 1;
                        } else {
                            $cloakdirective = 0;
                        }
                    }
                    ?>
                    

                    这将是隐藏蜘蛛的理想方式。它来自一个名为 [YACG] 的开源脚本 - http://getyacg.com

                    需要一些工作,但绝对是要走的路。

                    【讨论】:

                      【解决方案17】:

                      您可以分析用户代理 ($_SERVER['HTTP_USER_AGENT']) 或将客户端的 IP 地址 ($_SERVER['REMOTE_ADDR']) 与 list of IP addresses of search engine bots 进行比较。

                      【讨论】:

                      • 如果您想确保用户代理名称确实是搜索引擎机器人,IP 列表会更安全,因为可以通过名称创建假用户代理。
                      【解决方案18】:

                      这是Search Engine Directory of Spider names

                      然后你使用$_SERVER['HTTP_USER_AGENT']; 来检查代理是否是蜘蛛。

                      if(strstr(strtolower($_SERVER['HTTP_USER_AGENT']), "googlebot"))
                      {
                          // what to do
                      }
                      

                      【讨论】:

                      • if ((eregi("yahoo",$this->USER_AGENT)) && (eregi("slurp",$this->USER_AGENT))) { $this->Browser = "Yahoo!啜饮”; $this->Type = "机器人";这可以正常工作吗??
                      • 因为 strpos 可以返回 0(位置),strstr 失败时返回 FALSE,如果在末尾添加 !== false 检查,则可以使用 strpos。
                      • 呃,strpos 在失败时也会返回 FALSE。不过,它更快、更高效(无需预处理,也无需 O(m) 存储)。
                      • 假用户代理怎么样?!
                      • 如果有人可以用假名更改他的用户代理并将其命名为“Googlebot”怎么办?我认为检查ip范围更值得信赖!
                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-05-12
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-03-04
                      相关资源
                      最近更新 更多