如何从网络浏览器中过滤掉匹配等.不是人类的命中...
我使用maxmind.com从IP请求城市..如果我必须支付所有点击数,包括网络浏览器,机器人等,这不是很便宜.
检测机器人的方法有两种,我称之为"礼貌/被动"和"激进".基本上,你必须给你的网站一个心理障碍.
这些是礼貌告诉抓取工具他们不应抓取您的网站并限制抓取频率的方法.通过robots.txt文件确保礼貌,您可以在其中指定应该允许哪些机器人抓取您的网站以及抓取您的网站的频率.这假设您正在处理的机器人很有礼貌.
另一种让机器人远离您网站的方法就是积极进取.
用户代理
某些攻击性行为包括(如前面提到的其他用户所述)用户代理字符串的过滤.这可能是检测用户是否是最简单但也是最不可靠的方法.许多机器人倾向于欺骗用户代理,有些机器人出于合法原因(即他们只想抓取移动内容),而其他人根本不想被识别为机器人.更糟糕的是,一些机器人欺骗合法/礼貌的机器人代理,例如google,microsoft,lycos和其他通常被认为是礼貌的爬虫的用户代理.依赖于用户代理可能会有所帮助,但不能单独使用.
有更积极的方法来处理欺骗用户代理并且不遵守robots.txt文件的机器人:
机器人陷阱
我喜欢将其视为"维纳斯飞行陷阱",它基本上会惩罚任何想要与你玩耍的机器人.
机器人陷阱可能是找到不遵守robots.txt文件的机器人的最有效方法,而不会实际损害您网站的可用性.创建机器人陷阱可确保仅捕获机器人,而不是真实用户.这样做的基本方法是在robots.txt文件中设置一个特别标记为禁区的目录,这样任何礼貌的机器人都不会陷入陷阱.您要做的第二件事是将一个"隐藏"链接从您的网站放置到僵尸陷阱目录(这可以确保真正的用户永远不会去那里,因为真正的用户永远不会点击不可见的链接).最后,禁止任何进入bot陷阱目录的IP地址.
以下是有关如何实现此目的的一些说明: 创建机器人陷阱(或者在您的情况下:PHP机器人陷阱).
注意:当然,有些机器人足够聪明,可以阅读你的robots.txt文件,查看你标记为"禁区"的所有目录,并且STILL会忽略你的礼貌设置(例如抓取率和允许的机器人).尽管这些机器人不礼貌,但它们可能不会落入你的机器人陷阱.
暴力
我认为这对于普通观众来说实际上过于激进(和一般用途),所以如果有任何18岁以下的孩子,请带他们到另一个房间!
您可以通过简单地不指定robots.txt文件来使机器人陷阱" 暴力 ".在这种情况下,爬行隐藏链接的任何BOT可能最终都会陷入机器人陷阱,你可以禁止所有机器人,期间!
不建议这样做的原因是您实际上可能需要一些机器人来抓取您的网站(例如Google,Microsoft或其他机器人以进行网站索引).允许您的网站被谷歌,微软,Lycos等机器人礼貌地抓取,这将确保您的网站被编入索引,当人们在他们最喜欢的搜索引擎上搜索时,它就会显示出来.
自我毁灭
另一种限制机器人可以在您的网站上抓取的方法是服务CAPTCHA或机器人无法解决的其他挑战.这是以牺牲用户为代价的,我认为任何使您的网站不太可用的东西(例如CAPTCHA)都是"自我破坏性的".当然,这实际上不会阻止机器人反复尝试抓取您的网站,它只会让您的网站对他们非常无趣.有办法"绕过"CAPTCHA,但它们很难实现,所以我不打算深入研究这个问题.
为了您的目的,处理机器人的最佳方法可能是采用上述策略的组合:
过滤用户代理.
设置机器人陷阱(暴力陷阱).
抓住所有进入暴力机器人陷阱的机器人并简单地将其IP列入黑名单(但不要阻止它们).通过这种方式,您仍然可以获得被机器人抓取的"好处",但是您无需支付费用来检查由于进入机器人陷阱而被列入黑名单的IP地址.
您可以查看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']);
用户代理($_SERVER['HTTP_USER_AGENT']
)通常标识连接代理是浏览器还是机器人.查看访问您网站的抓取工具的用户代理的日志/分析.相应地过滤.
请注意,用户代理是客户端应用程序提供的标头.因此它可以是几乎任何东西,不应该100%被信任.相应地计划.