如何识别网络爬虫?

时间:2011-12-06 18:20:35

标签: php web-crawler

如何从网络浏览器中过滤掉匹配等。不是人类的命中..

我使用maxmind.com从IP请求城市..如果我必须支付包括网络浏览器,机器人等在内的所有点击费用,这并不便宜。

6 个答案:

答案 0 :(得分:50)

检测机器人的方法有两种,我称之为“礼貌/被动”和“激进”。基本上,你必须给你的网站一个心理障碍。

礼貌

这些是礼貌告诉抓取工具他们不应抓取您的网站并限制抓取频率的方法。通过robots.txt文件确保礼貌,您可以在其中指定应允许哪些机器人(如果有)抓取您的网站以及抓取您的网站的频率。这假设您正在处理的机器人很有礼貌。

攻击

让机器人远离您的网站的另一种方法是积极进取。

用户代理

某些攻击性行为包括(如前面提到的其他用户所述)用户代理字符串的过滤。这可能是检测用户是否是最简单但也是最不可靠的方法。许多机器人倾向于欺骗用户代理,有些机器人出于合法原因(即他们只想抓取移动内容),而其他人根本不想被识别为机器人。更糟糕的是,一些机器人欺骗合法/礼貌的机器人代理,例如google,microsoft,lycos和其他通常被认为是礼貌的爬虫的用户代理。依赖用户代理可能会有所帮助,但不能单独使用。

有更多积极的方法来处理欺骗用户代理并且不遵守robots.txt文件的机器人:

Bot Trap

我喜欢将此视为“维纳斯飞行陷阱”,它基本上会惩罚任何想要与你玩耍的机器人。

机器人陷阱可能是找到不符合您的robots.txt文件的机器人的最有效方法,而不会实际损害您网站的可用性。创建机器人陷阱可确保仅捕获机器人,而不是真实用户。这样做的基本方法是在robots.txt文件中设置一个特别标记为禁区的目录,这样任何有礼貌的机器人都不会陷入陷阱。您要做的第二件事是将一个“隐藏”链接从您的网站放置到僵尸陷阱目录(这可以确保真正的用户永远不会去那里,因为真正的用户永远不会点击不可见的链接)。最后,禁止任何进入bot陷阱目录的IP地址。

以下是有关如何实现此目的的一些说明: Create a bot trap(或在您的情况下:PHP bot trap)。

注意:当然,有些机器人足够聪明,可以阅读您的robots.txt文件,查看您标记为“禁区”的所有目录,并且仍然会忽略您的礼貌设置(例如抓取率和允许的机器人) 。尽管这些机器人不礼貌,但这些机器人可能不会陷入机器人陷阱。

<强>暴力

我认为这对于普通观众(以及一般用户)来说实际上过于激进,所以如果有未满18岁的孩子,请带他们到另一个房间!

您只需不指定robots.txt文件就可以使机器人陷阱“暴力”。在这种情况下,抓住隐藏链接的 ANY BOT 可能最终会陷入机器人陷阱,你可以禁止所有机器人,期间!

不建议这样做的原因是您实际上可能需要一些机器人来抓取您的网站(例如Google,Microsoft或其他机器人以进行网站索引)。允许您的网站被谷歌,微软,Lycos等机器人礼貌地抓取,这将确保您的网站被编入索引,当人们在他们最喜欢的搜索引擎上搜索时,它就会显示出来。

自我毁灭

另一种限制机器人可以在您的网站上抓取的方法是服务CAPTCHA或机器人无法解决的其他挑战。这是以牺牲用户为代价的,我认为任何使您的网站不太可用的东西(例如CAPTCHA)都是“自我破坏性的”。当然,这实际上不会阻止机器人反复尝试抓取您的网站,它只会让您的网站对他们非常无趣。有很多方法可以“绕过”CAPTCHA,但是它们很难实现,所以我不会太过深入研究。

结论

出于您的目的,处理机器人的最佳方法可能是采用上述策略的组合:

  1. 过滤用户代理。
  2. 设置机器人陷阱(暴力陷阱)。
  3. 抓住所有进入暴力机器人陷阱的机器人,简单地将其IP列入黑名单(但不要阻止它们)。通过这种方式,您仍然可以获得被机器人抓取的“好处”,但是您无需支付费用来检查由于进入机器人陷阱而被列入黑名单的IP地址。

答案 1 :(得分:9)

您可以查看USER_AGENT,例如:

function crawlerDetect($USER_AGENT)
{
    $crawlers = array(
    array('Google', 'Google'),
    array('msnbot', 'MSN'),
    array('Rambler', 'Rambler'),
    array('Yahoo', 'Yahoo'),
    array('AbachoBOT', 'AbachoBOT'),
    array('accoona', 'Accoona'),
    array('AcoiRobot', 'AcoiRobot'),
    array('ASPSeek', 'ASPSeek'),
    array('CrocCrawler', 'CrocCrawler'),
    array('Dumbot', 'Dumbot'),
    array('FAST-WebCrawler', 'FAST-WebCrawler'),
    array('GeonaBot', 'GeonaBot'),
    array('Gigabot', 'Gigabot'),
    array('Lycos', 'Lycos spider'),
    array('MSRBOT', 'MSRBOT'),
    array('Scooter', 'Altavista robot'),
    array('AltaVista', 'Altavista robot'),
    array('IDBot', 'ID-Search Bot'),
    array('eStyle', 'eStyle Bot'),
    array('Scrubby', 'Scrubby robot')
    );

    foreach ($crawlers as $c)
    {
        if (stristr($USER_AGENT, $c[0]))
        {
            return($c[1]);
        }
    }

    return false;
}

// example

$crawler = crawlerDetect($_SERVER['HTTP_USER_AGENT']);

答案 2 :(得分:6)

用户代理($_SERVER['HTTP_USER_AGENT'])经常识别连接代理是浏览器还是机器人。查看访问您网站的抓取工具的用户代理的日志/分析。过滤相应的。

请注意,用户代理是客户端应用程序提供的标头。因此,它几乎可以是任何东西,不应该100%被信任。相应地计划。

答案 3 :(得分:4)

检查用户代理将保护您免受Google和Yahoo等合法机器人的攻击。<​​/ p>

但是,如果您也被垃圾邮件机器人击中,那么用户代理比较可能无法保护您,因为这些机器人通常会伪造一个常见的用户代理字符串。在这种情况下,您需要采用更复杂的措施。如果需要用户输入,可以使用像ReCaptcha或phpMeow这样的简单图像验证方案。

如果您希望过滤掉机器人的所有页面命中率,不幸的是,如果机器人伪造其凭据,则没有100%可靠的方法来执行此操作。这只是网络管理员必须忍受的互联网生活中令人讨厌的事实。

答案 4 :(得分:2)

我找到了这个包,它正在积极开发中,到目前为止我非常喜欢它:

https://github.com/JayBizzle/Crawler-Detect

这很简单:

use Jaybizzle\CrawlerDetect\CrawlerDetect;

$CrawlerDetect = new CrawlerDetect;

// Check the user agent of the current 'visitor'
if($CrawlerDetect->isCrawler()) {
    // true if crawler user agent detected
}

// Pass a user agent as a string
if($CrawlerDetect->isCrawler('Mozilla/5.0 (compatible; Sosospider/2.0; +http://help.soso.com/webspider.htm)')) {
    // true if crawler user agent detected
}

// Output the name of the bot that matched (if any)
echo $CrawlerDetect->getMatches();

答案 5 :(得分:1)

useragentstring.com用于分析用户字符串:

$api_request="http://www.useragentstring.com/?uas=".urlencode($_SERVER['HTTP_USER_AGENT'])."&getJSON=all";
$ua=json_decode(file_get_contents($api_request));
if($ua["agent_type"]=="Crawler") die();