Как обнаружить роботов поисковых систем с PHP? - PullRequest
111 голосов
/ 24 марта 2009

Как можно определить ботов поисковой системы, используя php?

Ответы [ 12 ]

220 голосов
/ 24 февраля 2013

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

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

добавлено медиапартнеры

70 голосов
/ 24 марта 2009

Вот Каталог поисковых систем имен пауков

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

if(strstr(strtolower($_SERVER['HTTP_USER_AGENT']), "googlebot"))
{
    // what to do
}
19 голосов
/ 24 марта 2009

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

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

Или, более конкретно, для гусеничных машин:

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

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

$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'
}
16 голосов
/ 18 июля 2013

Вы можете оформить заказ, если это поисковая система с этой функцией:

<?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";?>
9 голосов
/ 15 апреля 2017

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

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 часов. И поскольку никто не решает эту капчу, я знаю, что она не дает ложных срабатываний. Таким образом, обнаружение бота, кажется, работает отлично.

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

8 голосов
/ 02 февраля 2018

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

8 голосов
/ 05 апреля 2015

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

2-я часть проверяет 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-адрес совпадает с IP-адресом посетителя сайта, вы уверены, что это сканер из этой поисковой системы.

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

5 голосов
/ 24 марта 2009

Вы можете проанализировать пользовательский агент ($_SERVER['HTTP_USER_AGENT']) или сравнить IP-адрес клиента ($_SERVER['REMOTE_ADDR']) со списком IP-адресов поисковых роботов .

4 голосов
/ 28 апреля 2015

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

4 голосов
/ 24 марта 2009
 <?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

Нужно немного поработать, но определенно нужно идти.

...