我怎样才能过滤掉网络爬虫等非人类的点击。
我使用maxmind.com向IP请求城市。这并不是很便宜,如果我必须支付所有的点击,包括网络爬虫,机器人等。
发布于 2011-12-07 03:45:21
有两种检测机器人的一般方法,我称之为“礼貌/被动”和“攻击性”。基本上,你必须给你的网站一个心理障碍。
有礼貌
这些方法可以礼貌地告诉爬虫,他们不应该爬行你的网站,并限制你被爬行的频率。礼貌是通过robots.txt文件确保的,您可以在该文件中指定应允许哪些机器人(如果有的话)爬行您的网站以及您的网站可以爬行的频率。这假设你正在处理的机器人是有礼貌的。
攻击性
让机器人远离你网站的另一种方法是变得更具攻击性。
用户代理
一些攻击性行为包括(正如其他用户前面提到的)过滤用户代理字符串。这可能是最简单的,但也是检测它是否是用户的最不可靠的方法。许多机器人倾向于欺骗用户代理,其中一些是出于合法的原因(即他们只想抓取移动内容),而另一些则只是不想被识别为机器人。更糟糕的是,一些机器人欺骗合法/礼貌的机器人代理,例如谷歌、微软、lycos和其他通常被认为是礼貌的爬虫的用户代理。依赖用户代理可能会有所帮助,但不能单独使用。
有更积极的方法来处理欺骗用户代理和不遵守您的robots.txt文件的机器人:
僵尸程序陷阱
我喜欢把它想象成一个“维纳斯捕蝇陷阱”,它基本上惩罚了任何想要和你玩恶作剧的机器人。
机器人陷阱可能是最有效的方法来找到不符合你的robots.txt文件的机器人,而不会真正损害你网站的可用性。创建机器人陷阱可以确保只捕获机器人,而不捕获真正的用户。这样做的基本方法是设置一个目录,您在robots.txt文件中专门将其标记为禁用,这样任何有礼貌的机器人都不会落入陷阱。你要做的第二件事是放置一个从你的网站到bot陷阱目录的“隐藏”链接(这确保了真正的用户永远不会去那里,因为真正的用户永远不会点击看不见的链接)。最后,禁止任何进入bot陷阱目录的IP地址。
以下是关于如何实现这一点的一些说明:Create a bot trap (或者在您的例子中:一个PHP bot trap)。
注意:当然,一些机器人足够聪明,可以读取你的robots.txt文件,看到你标记为“禁止”的所有目录,并且仍然忽略你的礼貌设置(例如爬虫速率和允许的机器人)。这些机器人可能不会落入你的机器人陷阱,尽管它们是不礼貌的。
暴力
我认为这对普通观众(和普通用户)来说太有攻击性了,所以如果有18岁以下的孩子,请把他们带到另一个房间!
只需不指定robots.txt文件,就可以使机器人陷阱"violent“。在这种情况下,任何爬行隐藏链接的机器人都可能最终落入机器人陷阱,你可以禁止所有的机器人,句号!
不推荐这样做的原因是,你可能真的需要一些机器人来抓取你的网站(比如谷歌、微软或其他用于站点索引的机器人)。允许来自Google,Microsoft,Lycos等的机器人礼貌地抓取你的网站,这将确保你的网站被索引,当人们在他们最喜欢的搜索引擎上搜索它时,它就会显示出来。
自毁
还有另一种方法来限制机器人可以在你的网站上爬行,是服务于验证码或其他机器人无法解决的挑战。这是以牺牲你的用户为代价的,我认为任何让你的网站变得不那么有用的东西(比如验证码)都是“自毁”。当然,这实际上不会阻止机器人反复尝试爬取你的网站,它只会让他们对你的网站毫无兴趣。有一些方法可以“绕过”验证码,但它们很难实现,所以我不打算过多地探究这一点。
结论
出于您的目的,处理机器人的最好方法可能是使用上述策略的组合:
the
捕获所有进入暴力机器人陷阱的机器人,并简单地将其IP列入黑名单(但不要阻止它们)。通过这种方式,您仍然可以获得被机器人爬行的“好处”,但您不必为检查由于进入机器人陷阱而被列入黑名单的IP地址而付费。
发布于 2011-12-07 02:30:24
您可以查看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']);
发布于 2011-12-07 02:26:51
用户代理($_SERVER['HTTP_USER_AGENT']
)通常识别连接代理是浏览器还是机器人。查看访问您的站点的爬虫程序的用户代理的日志/分析。相应地进行过滤。
请注意,用户代理是由客户端应用程序提供的标头。因此,它几乎可以是任何东西,不应该百分之百地被信任。做好相应的规划。
https://stackoverflow.com/questions/8404775
复制相似问题