检测访问者是否是浏览器而不是爬虫

时间:2009-10-08 12:45:59

标签: c# http browser

如果网页用户是浏览器,服务器端如何检测?

检测到这一点的原因是,我正在存储有关已访问页面的统计信息,并且当用户是爬虫时我不想存储任何统计信息。所以我不是要试图检测哪个浏览器供应商。我只想要一个布尔答案,用户是浏览器。

我认为答案与用户代理标题相关联,但是许多可能的值对我来说太难以理解了。 我该如何检测它?一个90%的解决方案,我只能检测到最受欢迎的Top5浏览器,这已经足够了。

我正在使用C#ASP.Net,但我猜其他语言和框架中的大多数解决方案都可以翻译。

6 个答案:

答案 0 :(得分:5)

这段代码并非详尽无遗,而是为您提供PHP的基本创建。我不能保证一些人不会通过网络,但这应该抓住大多数浏览器并忽略大多数机器人。

<?php
// Regular expression to match common browsers
$browserlist = '/(opera|aol|msie|firefox|chrome|konqueror|safari|netscape|navigator|mosaic|lynx|amaya|omniweb|avant|camino|flock|seamonkey|mozilla|gecko)+/i';

// Test for browsers
if (preg_match($browserlist, $_SERVER['HTTP_USER_AGENT'])) {
    // ...is a browser
} else {
    // ...is not a browser
}
?>

答案 1 :(得分:1)

如果您使用的是PHP,请尝试$_SERVER['HTTP_USER_AGENT']get_browser()功能。

可以下载的

Here's a class使这个过程非常容易。用法示例:

$browser = new Browser();
if( $browser->getBrowser() == Browser::BROWSER_FIREFOX && $browser->getVersion() >= 2 ) {
 echo 'You have FireFox version 2 or greater';
}

答案 2 :(得分:1)

我不确定你为什么要这样做。

但是,您甚至不想假装您可以根据User-agent标题在人与机器人之间进行判断。您可以在分析请求的模式和时间方面取得一些成功。

答案 3 :(得分:1)

这将为您提供99%的准确度。

Regex.IsMatch(Request.UserAgent, @"bot|crawler|baiduspider|80legs|ia_archiver|voyager|curl|wget|yahoo! slurp|mediapartners-google", RegexOptions.IgnoreCase);

我在答案中列出了更多解决方案:

Detecting honest web crawlers

答案 4 :(得分:0)

如果您需要决定是否返回(比方说)脚本的原始文本而不是浏览器的HTML,那么您是否应该检查Accept-Encoding请求标题?

答案 5 :(得分:0)

Perl有一个模块HTTP::BrowserDetect。根据文档,这有一种检查用户代理是否是机器人的方法。我想,任何不是机器人的东西都可能是浏览器。