2009-03-24 12 views

ответ

57

Вот Search Engine Directory of Spider names

Затем вы используете $_SERVER['HTTP_USER_AGENT'];, чтобы проверить, если агент сказал паук.

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

если ((eregi ("Yahoo", $ this-> USER_AGENT)) && (eregi ("хлебать", $ this-> USER_AGENT))) \t \t \t { \t \t \t \t $ this-> Браузер = "Yahoo! Slurp"; \t \t \t \t $ this-> Type = "robot"; \t \t \t} будет ли это работать нормально ?? – terrific

+0

почему strstr и не strpos? – rinchik

+3

Поскольку strpos может возвращать 0 (позиция), strstr возвращает FALSE при ошибке, вы можете использовать strpos, если вы добавите в конец ложную проверку! ==. –

4

Вы можете проанализировать пользовательский агент ($_SERVER['HTTP_USER_AGENT']) или сравнить IP-адрес клиента ($_SERVER['REMOTE_ADDR']) с помощью list of IP addresses of search engine bots.

+0

Списки IP-адресов не обновлялись более года. –

+2

IP-адрес более безопасен, если вы хотите удостовериться, что имя пользователя-пользователя действительно является ботом поисковой системы, потому что можно создавать поддельные пользовательские агенты по имени. –

18

Проверьте $_SERVER['HTTP_USER_AGENT'] для некоторых из строк здесь:

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

Или более конкретно для искателей:

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

Если вы хотите -say- журнал количество посещений наиболее распространенных поисковых роботов, вы можете использовать

$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' 
} 
3
<?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

Нуждается в некоторой работе, но определенно в пути.

+5

Ссылки мертвы. –

185

Я использую следующий код, который, кажется, работает нормально:

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

добавил Mediapartners

+1

Означает ли это, что боты проявляют себя как таковые? –

+1

Голосовать, пользовательский агент может быть изменен в хромовых настройках, firefox, – barwnikk

+17

Да, пользовательскийагент может быть изменен, но если кто-то меняет его, чтобы содержать «бот», «сканирование», «slurp» или «spider» знает, что произойдет им. Это также зависит от полезности. Я бы не использовал это, чтобы исключить все CSS, но я бы использовал это, чтобы не хранить файлы cookie, игнорировать регистрацию местоположения или пропускать целевую страницу. – JonShipman

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";?> 
+2

strpos не работает здесь. Вы должны использовать preg_match. – user706420

+2

Я думаю, что этот список устарел, я не вижу «slurp», например, это Yahoo, это spider https://help.yahoo.com/kb/SLN22600.html – Daan

5

Поскольку любой клиент может установить агента пользователя на то, что они хотят, ищут «Googlebot», «bingbot» и т.д., это только половина работы.

Вторая часть проверяет IP-адрес клиента. В старые времена для этого требовалось поддерживать списки IP. Все списки, которые вы найдете в Интернете, устарели. Лучшие поисковые системы официально поддерживают проверку через DNS, как объясняется Google https://support.google.com/webmasters/answer/80553 и Bing http://www.bing.com/webmaster/help/how-to-verify-bingbot-3905dc26

Сначала выполните обратный DNS-поиск IP-адреса клиента. Для Google это приводит имя хоста под googlebot.com, а для Bing - под search.msn.com. Затем, поскольку кто-то может установить такой обратный DNS на свой IP-адрес, вам нужно проверить с помощью прямого поиска DNS на этом имени хоста. Если результирующий IP-адрес совпадает с адресом посетителя сайта, вы уверены, что он искатель этой поисковой системы.

Я написал библиотеку на Java, которая выполняет эти проверки для вас. Не стесняйтесь переносить его на PHP.Это на GitHub: библиотека https://github.com/optimaize/webcrawler-verifier

+0

Все остальные ответы, используя строки пользовательского агента, являются только почти на месте. Вау. – mlissner

2

Использование обнаружения устройств с открытым исходным кодом, он предлагает функцию isBot(): https://github.com/piwik/device-detector

+0

Примечание. Эта библиотека анализирует только пользовательский агент, чтобы решить, является ли посетитель ботом. – Philipp

+0

Слишком тяжелый, просто чтобы проверить бот. –

0

Я использую этот код, довольно хорошо. Вы очень легко узнаете, как пользовательские агенты просматривали ваш сайт. Этот код открывает файл и записывает 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 
5

Я использую это для обнаружения ботов:

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 
} 

Нежелательный бот (= f alse-positive user), тогда может решить капчу разблокировать себя в течение 24 часов. И поскольку никто не решает эту капчу, я знаю, что она не производит ложных срабатываний. Таким образом, обнаружение бота работает отлично.

Примечание: Мой белый список основан на Facebooks robots.txt.

+0

вы забыли закрытие ')' в своем первом фрагменте кода. –

0
function bot_detected() { 

    if(preg_match('/bot|crawl|slurp|spider|mediapartners/i', $_SERVER['HTTP_USER_AGENT']){ 
    return true; 
    } 
    else{ 
    return false; 
    } 
} 
+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/18619650) – Akshay

0

Я использую эту функцию ... часть регулярного выражения исходит из 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; 
} 

Во всяком случае заботиться, что некоторые боты используют браузер, как пользовательский агент подделать их личность
(я получил много русского внутрибрюшинно, который имеет такое поведение на моем сайте)

Одна отличительной особенность большинства бота заключается в том, что они не содержат никакого файла cookie, и поэтому к ним не прилагается сессия.
(я не уверен, но это точно, как их можно отслеживать)