如何过滤掉网络爬虫等非人类访问记录?
我使用maxmind.com从IP地址请求城市信息。如果我必须为包括网络爬虫、机器人等在内的所有访问记录付费,这样并不便宜。
如何过滤掉网络爬虫等非人类访问记录?
我使用maxmind.com从IP地址请求城市信息。如果我必须为包括网络爬虫、机器人等在内的所有访问记录付费,这样并不便宜。
有两种通用方法来检测机器人,我称之为“礼貌/被动”和“侵略性”。基本上,你必须给你的网站一个心理障碍。
这些是告诉网络爬虫他们不应该爬取你的网站并限制你被爬取频率的礼貌方式。通过robots.txt文件确保礼貌,其中你指定哪些机器人,如果有的话,可以爬取你的网站以及你的网站可以被爬取的频率。这假设你所处理的机器人是礼貌的。
让机器人远离你的网站的另一种方式是变得侵略。
User Agent (用户代理)
一些侵略行为包括(如其他用户之前提到的)过滤用户代理字符串。这可能是最简单但也是最不可靠的检测是否是用户的方法。许多机器人倾向于欺骗用户代理,有些出于合法原因(即他们只想爬取移动内容),而其他人则不想被识别为机器人。更糟糕的是,一些机器人伪造合法/礼貌的机器人代理,如google、microsoft、lycos等爬虫的用户代理,这些通常被认为是礼貌的。依靠用户代理可能有所帮助,但不能单独依靠它。
还有更侵略的方法来处理伪造用户代理且不遵守你的robots.txt文件的机器人:
Bot Trap (机器人陷阱)
我喜欢把它想象成“捕蝇草”,它基本上惩罚任何想和你玩花招的机器人。
一个机器人陷阱可能是找到不遵守你的robots.txt文件的机器人最有效的方法,而不会影响你的网站可用性。创建机器人陷阱可以确保只捕获机器人而不是真实用户。基本的方法是设置一个目录,在你的robots.txt文件中标记为禁止访问,这样任何有礼貌的机器人都不会掉进陷阱。第二件事情是在你的网站上放置一个“隐藏”的链接指向机器人陷阱目录(这样确保真实用户永远不会去那里,因为真实用户永远不会点击看不见的链接)。最后,禁止任何访问机器人陷阱目录的IP地址。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']);
$_SERVER['HTTP_USER_AGENT']
)通常可以识别连接代理是浏览器还是机器人。查看访问您的站点的爬虫的用户代理的日志/分析。相应地进行过滤。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();
useragentstring.com提供了一个列表,您可以使用它来分析用户字符串:
$api_request="http://www.useragentstring.com/?uas=".urlencode($_SERVER['HTTP_USER_AGENT'])."&getJSON=all";
$ua=json_decode(file_get_contents($api_request), true);
if($ua["agent_type"]=="Crawler") die();