【问题标题】:How can one detect a crawler / spider using PHP?如何使用 PHP 检测爬虫/蜘蛛?
【发布时间】:2013-11-14 14:33:32
【问题描述】:

如何使用 PHP 检测爬虫/蜘蛛?

我目前正在做一个项目,我需要跟踪每个爬虫的访问。
我知道你应该使用 HTTP_USER_AGENT 但我不太确定如何为此目的格式化代码,而且我知道 USER AGENT 可以很容易地更改,所以 我也想知道是否可以添加还有一些参数来避免欺骗?

我正在尝试做的示例代码..

<?php
$user_agent = $_SERVER['HTTP_USER_AGENT'];
if (strpos( $user_agent, 'Google') !== false)
{
echo "Googlebot is here";
}
?>

谢谢

【问题讨论】:

  • 当您检查网络服务器日志文件并在短时间内从单个 IP 或子网中查找许多请求时,您可以轻松找到爬虫。大多数搜索引擎不会修改他们的爬虫来像浏览器一样工作
  • 这是不正确的,因为您可以将 HTTP_USER_AGENT 与 REMOTE_ADDR 结合使用,例如,googlebot 始终使用主机名 googlebot.com 进行抓取。但是我不知道如何为此设置脚本。问候丹尼斯
  • 如果你不想让你的页面被抓取,请使用 robots.txt de.wikipedia.org/wiki/Robots_Exclusion_Standard 至少一些爬虫尊重 robots.txt
  • 我希望页面被爬取,我只是想跟踪它:)

标签: php user-agent


【解决方案1】:

根据Verifying Googlebot

您可以使用反向 DNS 查找验证访问您服务器的机器人确实是 Googlebot(或其他 Google 用户代理),验证名称是否在 googlebot.com 域中,然后使用正向 DNS 查找那个 googlebot 的名字。如果您担心垃圾邮件发送者或其他麻烦制造者在访问您的网站时声称自己是 Googlebot。

例如:

host 66.249.66.1
1.66.249.66.in-addr.arpa domain name pointer
crawl-66-249-66-1.googlebot.com.

host crawl-66-249-66-1.googlebot.com
crawl-66-249-66-1.googlebot.com has address 66.249.66.1
Google 不会发布公开的 IP 地址列表供网站管理员列入白名单。这是因为这些 IP 地址范围可能会发生变化,这会给任何硬编码它们的网站管理员带来问题。识别 Googlebot 访问的最佳方法是使用用户代理 (Googlebot)。

您可以进行反向 DNS 查找:

function validateGoogleBotIP($ip) {
    $hostname = gethostbyaddr($ip); //"crawl-66-249-66-1.googlebot.com"

    return preg_match('/\.google(bot)?\.com$/i', $hostname);
}

if (strpos($_SERVER['HTTP_USER_AGENT'], 'Google') !== false) {
    if (validateGoogleBotIP($_SERVER['REMOTE_ADDR'])) {
        echo 'It is ACTUALLY google';
    } else {
        echo 'Someone\'s faking it!';
    }
} else {
    echo 'Nothing to do with Google';
}

【讨论】:

  • 正是我想要的。非常感谢您抽出宝贵时间帮助我!
  • @Squeeze 不客气。它应该可以工作(如果没有,您的主机可能不允许 DNS 查找)。例如。 codepad.org 不允许我创建这个演示,因为它无法查找主机名。然而,这可能只是他们的沙盒。
  • 我目前在 VPS 上托管我的网站,所以如果 DNS 查找出现任何错误,我没有任何责任,但我自己 :p 再次感谢你 :)
  • 在研究这个主题时,我遇到了这个解决方案。简单明了,谢谢 - 我应该提到谷歌说返回的主机名可以匹配 googlebot.com 或 google.com “验证域名是 googlebot.com 还是 google.com。” developers.google.com/search/docs/advanced/crawling/…
  • @LarsKoudal 感谢您指出这一点。我稍微更改了正则表达式以支持两者。
【解决方案2】:

100% 在我的网站上工作以检测机器人、爬虫、蜘蛛和复印机。

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()

【讨论】:

  • $_SERVER['HTTP_USER_AGENT'] 可以由您的访问者在发送请求时进行操作。
【解决方案3】:

要正确验证访问者是否来自搜索引擎,您需要的不仅仅是检查容易被欺骗的 User-Agent。

正确的方法是查找 IP 的主机名并快速检查它是否与我们知道的搜索引擎爬虫使用的任何主机名匹配。

如果主机名与已知爬虫之一匹配,那么您查找主机名的 IP 并查看两者是否匹配。如果其中一个步骤失败,则您有一个虚假的搜索引擎爬虫在访问。

以下函数接受 IP 并遵循前面提到的步骤。它可以识别百度、必应、谷歌、雅虎和 Yandex。

 /**
 * Validate a crawlers IP against the hostname 
 * Warning - str_ends_with() requires PHP 8
 *
 * @param   mixed   $ip 
 * @return  boolean
 */
function validate_crawler_ip( $testip ) {
   $hostname = strtolower( gethostbyaddr( $testip ) );
   $valid_host_names = array(
      '.crawl.baidu.com',
      '.crawl.baidu.jp',
      '.google.com',
      '.googlebot.com',
      '.crawl.yahoo.net',
      '.yandex.ru',
      '.yandex.net',
      '.yandex.com',
      '.search.msn.com',
   );
   $valid_ip = false;
   foreach ( $valid_host_names as $valid_host ) {
     // Using string_ends_with() to make sure the match is in the -end- of the hostname (to prevent fake matches)
     if ( str_ends_with( $hostname, $valid_host ) ) { // PHP 8 function
      $returned_ip = gethostbyname( $hostname );        
      if ( $returned_ip === $testip ) {
        // The looked up IP from the host matches the incoming IP - we have validated!
        return true;
      }
    }
  }
  // No match - not valid crawler
  return false;
}

【讨论】:

    猜你喜欢
    • 2010-12-03
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2013-11-30
    • 1970-01-01
    • 2014-03-04
    • 2019-10-26
    相关资源
    最近更新 更多