使用 robots.txt 阻止
不幸的是,实际上并没有一个万无一失的系统来检测机器人。使用robots.txt 文件,将允许您阻止大多数合法的机器人。然而,还有很多“攻击性”的机器人会简单地忽略这个文件。另外,您的问题是检测它们而不是阻止它们。
使用用户代理检测
因此,检测机器人的第二个最佳方法是使用$_SERVER['HTTP_USER_AGENT'] 检查用户代理。例如:
function isCrawler($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($agent, $c[0]))
{
return($c[1]);
}
}
return false;
}
$crawler = isCrawler($_SERVER['HTTP_USER_AGENT']);
使用外部资源提高可靠性
但是,那里有太多的机器人,以至于您的阵列将变得非常大,无法全部捕获。更不用说它会很快过时。因此使用更新很多的外部资源更可靠。网站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"){
echo '<a href="example.com">example.com</a>';
} else {
echo '<a href="other.com/register">Register to see link</a>';
}
感谢这个问题:How to identify web-crawler?