[php] PHP로 검색 엔진 봇을 감지하는 방법?

PHP를 사용하여 검색 엔진 봇을 어떻게 감지 할 수 있습니까?



답변

다음 은 스파이더 이름검색 엔진 디렉토리입니다.

그런 다음 $_SERVER['HTTP_USER_AGENT'];에이전트가 거미인지 확인 하는 데 사용 합니다.

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


답변

잘 작동하는 다음 코드를 사용합니다.

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=ko

mediapartners 추가


답변

$_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'
}


답변

이 기능을 사용하여 검색 엔진인지 확인할 수 있습니다.

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


답변

나는 이것을 사용하여 봇을 감지하고 있습니다.

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를 기반으로 합니다 .


답변

모든 클라이언트가 사용자 에이전트를 원하는대로 설정할 수 있기 때문에 ‘Googlebot’, ‘bingbot’등을 찾는 것은 작업의 절반에 불과합니다.

두 번째 부분은 클라이언트의 IP를 확인하는 것입니다. 예전에는이를 위해 IP 목록을 유지해야했습니다. 온라인에서 찾은 모든 목록이 오래되었습니다. Google https://support.google.com/webmasters/answer/80553 및 Bing http://www.bing.com/webmaster/help/how-to-verify에 설명 된대로 상위 검색 엔진은 공식적으로 DNS를 통한 확인을 지원합니다 . -bingbot-3905dc26

먼저 클라이언트 IP의 역방향 DNS 조회를 수행합니다. Google의 경우 googlebot.com 아래에 호스트 이름이 표시되고 Bing의 경우 search.msn.com에 있습니다. 그런 다음 누군가가 자신의 IP에 이러한 역방향 DNS를 설정할 수 있으므로 해당 호스트 이름에 대한 정방향 DNS 조회로 확인해야합니다. 결과 IP가 사이트 방문자 중 하나와 같으면 해당 IP가 해당 검색 엔진의 크롤러임을 확신합니다.

이러한 검사를 수행하는 Java 라이브러리를 작성했습니다. PHP로 자유롭게 이식하십시오. GitHub에 있습니다 : https://github.com/optimaize/webcrawler-verifier


답변

이 기능을 사용합니다 … 정규식의 일부는 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를 얻었습니다).

대부분의 봇의 특징 중 하나는 쿠키가 없기 때문에 세션이 연결되지 않는다는 것입니다.
(어떻게해야할지 모르겠지만 이것이 그들을 추적하는 가장 좋은 방법입니다)