如果网页用户是浏览器,服务器端如何检测?
检测到这一点的原因是,我正在存储有关已访问页面的统计信息,并且当用户是爬虫时我不想存储任何统计信息。所以我不是要试图检测哪个浏览器供应商。我只想要一个布尔答案,用户是浏览器。
我认为答案与用户代理标题相关联,但是许多可能的值对我来说太难以理解了。 我该如何检测它?一个90%的解决方案,我只能检测到最受欢迎的Top5浏览器,这已经足够了。
我正在使用C#ASP.Net,但我猜其他语言和框架中的大多数解决方案都可以翻译。
答案 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);
我在答案中列出了更多解决方案:
答案 4 :(得分:0)
如果您需要决定是否返回(比方说)脚本的原始文本而不是浏览器的HTML,那么您是否应该检查Accept-Encoding请求标题?
答案 5 :(得分:0)
Perl有一个模块HTTP::BrowserDetect。根据文档,这有一种检查用户代理是否是机器人的方法。我想,任何不是机器人的东西都可能是浏览器。