如何识别网络爬虫?
Posted
技术标签:
【中文标题】如何识别网络爬虫?【英文标题】:How to identify web-crawler? 【发布时间】:2012-01-14 08:12:40 【问题描述】:如何过滤来自网络爬虫等的点击。不是人类的点击..
我使用 maxmind.com 从 IP 请求城市。如果我必须为所有点击付费,包括网络爬虫、机器人等,这并不便宜。
【问题讨论】:
为什么不对数据库进行许可,这样您就可以在本地使用它而无需按请求支付任何费用?! 如何缓存来自 maxmind.com 的结果。这样一来,我认为机器人/人引起的查询比例是可以的。 我意识到这是一篇很老的帖子。我也在使用这项服务,并发现使用 AJAX 是一种非常可靠的过滤所有机器人的方法。我们最初仅使用 php 启动了此功能,几天后我们几乎达到了当月的分配。切换到 AJAX 后,它变得负责。我个人会使用新的 html 5 GEO 位置,因为它更准确,但所有者不喜欢浏览器的确认提示。 我认为您实际上无法在不影响真实用户的情况下限制抓取。祝你好运 【参考方案1】:检测机器人有两种通用方法,我将它们称为“礼貌/被动”和“攻击性”。基本上,你必须让你的网站出现心理障碍。
礼貌
这些方法可以礼貌地告诉抓取工具他们不应抓取您的网站并限制抓取您的频率。通过robots.txt 文件确保礼貌,您可以在该文件中指定应该允许哪些机器人(如果有)抓取您的网站以及可以抓取您的网站的频率。这假设您正在处理的机器人是有礼貌的。
激进
让机器人远离您的网站的另一种方法是变得咄咄逼人。
用户代理
一些攻击性行为包括(如其他用户之前提到的)过滤用户代理字符串。这可能是检测它是否是用户的最简单但也是最不可靠的方法。许多机器人倾向于欺骗用户代理,有些是出于正当理由(即他们只想抓取移动内容),而另一些则根本不想被识别为机器人。更糟糕的是,一些机器人会欺骗合法/礼貌的机器人代理,例如谷歌、微软、lycos 和其他通常被认为是礼貌的爬虫的用户代理。依赖用户代理可能会有所帮助,但仅靠它自己就不行。
有更激进的方法来处理欺骗用户代理并且不遵守您的 robots.txt 文件的机器人:
机器人陷阱
我喜欢把它想象成一个“维纳斯飞蝇陷阱”,它基本上会惩罚任何想和你开玩笑的机器人。
机器人陷阱可能是找出不符合您的 robots.txt 文件而又不会实际影响您网站的可用性的机器人的最有效方法。创建机器人陷阱可确保仅捕获机器人而不捕获真实用户。这样做的基本方法是在 robots.txt 文件中设置一个您专门标记为禁止访问的目录,因此任何有礼貌的机器人都不会落入陷阱。您要做的第二件事是放置一个从您的网站到机器人陷阱目录的“隐藏”链接(这可以确保真正的用户永远不会去那里,因为真正的用户永远不会点击不可见的链接)。最后,您禁止任何进入机器人陷阱目录的 IP 地址。
以下是有关如何实现此目的的一些说明: Create a bot trap(或者在你的情况下:PHP bot trap)。
注意:当然,有些机器人足够聪明,可以读取您的 robots.txt 文件,查看您标记为“禁区”的所有目录,但仍会忽略您的礼貌设置(例如抓取速度和允许的机器人) .尽管这些机器人没有礼貌,但它们可能不会落入你的机器人陷阱。
暴力
我认为这对于普通观众(和一般用途)来说实际上过于激进,所以如果有 18 岁以下的孩子,请带他们到另一个房间!
您可以通过不指定 robots.txt 文件将机器人陷阱设置为“暴力”。在这种情况下,任何爬取隐藏链接的 BOT 都可能最终落入机器人陷阱,您可以禁止所有机器人,期间!
不建议这样做的原因是您可能确实希望某些机器人抓取您的网站(例如 Google、Microsoft 或其他用于网站索引的机器人)。允许来自 Google、Microsoft、Lycos 等的机器人礼貌地抓取您的网站将确保您的网站被编入索引,并在人们在他们最喜欢的搜索引擎上搜索时显示出来。
自毁
另一种限制机器人可以在您的网站上抓取的内容的方法是提供验证码或机器人无法解决的其他挑战。这是以您的用户为代价的,我认为任何使您的网站不那么可用的东西(例如验证码)都是“自我毁灭的”。当然,这实际上不会阻止机器人反复尝试爬取您的网站,它只会让您的网站对他们非常不感兴趣。有一些方法可以“绕过”验证码,但它们很难实现,所以我不会过多地深入研究。
结论
出于您的目的,处理机器人的最佳方法可能是结合使用上述策略:
-
过滤用户代理。
设置机器人陷阱(暴力陷阱)。
捕获所有进入暴力机器人陷阱的机器人,并将其 IP 列入黑名单(但不要阻止它们)。这样,您仍然可以获得被机器人抓取的“好处”,但您无需付费检查因进入机器人陷阱而被列入黑名单的 IP 地址。
【讨论】:
注意:AFAIK,recaptcha 归谷歌所有,所以...他们理论上能够轻松绕过它。 创意!还是很有效的! 我认为金星陷阱被称为“蜜罐”。【参考方案2】:您可以检查 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']);
【讨论】:
【参考方案3】:用户代理 ($_SERVER['HTTP_USER_AGENT']
) 通常会识别连接代理是浏览器还是机器人。查看访问您网站的爬虫的用户代理的日志/分析。相应地过滤。
请注意,用户代理是客户端应用程序提供的标头。因此,它几乎可以是任何东西,不应该 100% 被信任。相应地计划。
【讨论】:
这是一个很好的答案,但您应该添加免责声明,即用户代理检查仅对识别自己的网络爬虫有用。欺骗用户代理字符串是微不足道的。 @jadewards,我认为...很多爬虫欺骗用户代理。有时甚至是必要的,因为网站会根据用户代理(例如移动浏览器与标准浏览器)提供不同的内容。 您应该添加一个指向最新网站的链接,因为这是您获得良好答案的主要原因【参考方案4】:检查 User-Agent 将保护您免受 Google 和 Yahoo 等合法机器人的侵害。
但是,如果您也受到垃圾邮件机器人的攻击,那么 User-Agent 比较可能无法保护您,因为这些机器人通常会伪造一个通用的 User-Agent 字符串。在这种情况下,您将需要采用更复杂的措施。如果需要用户输入,可以使用像 ReCaptcha 或 phpMeow 这样的简单图像验证方案。
如果您希望过滤掉来自机器人的所有页面点击,不幸的是,如果机器人正在伪造其凭据,则没有 100% 可靠的方法可以做到这一点。这只是网络管理员必须忍受的互联网生活中令人讨厌的事实。
【讨论】:
【参考方案5】:我找到了这个包,它正在积极开发中,到目前为止我非常喜欢它:
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();
【讨论】:
【参考方案6】:useragentstring.com 提供了一个可以用来分析用户字符串的 lilst:
$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();
【讨论】:
useragentstring.com 不再在线,这是一个很好的例子,说明了为什么您不应该依赖第三方。以上是关于如何识别网络爬虫?的主要内容,如果未能解决你的问题,请参考以下文章