据我所知,
$_SERVER['REMOTE_HOST'] 应以“google.com”或“yahoo.com”结尾。
但这是最有保证的方法吗?
还有其他出路吗?
您可以通过 用户代理和 IP 地址来识别搜索引擎。更多信息可以在如何识别搜索引擎蜘蛛和网络机器人中找到。还值得注意此列表。然而,您不应该将用户代理(甚至远程主机)视为必然确定的。用户代理实际上只不过是另一端告诉您的内容,当然它可以自由地告诉您任何信息。编写代码来冒充 Googlebot 很简单。
在 PHP 中,这意味着查看
$_SERVER['HTTP_USER_AGENT']
和 $_SERVER['REMOTE_HOST']
。
有很多搜索引擎,但老实说,一般来说,只有少数几个是您真正关心的。谷歌和雅虎共同占据了几乎所有的市场。但这当然取决于您想要实现的目标。
注意:对待搜索引擎与普通用户不同(如乔尔所说的“邪恶的连字符网站”)当涉及到内容时。在特别恶劣的情况下,这可能会使您的网站从该搜索引擎中删除。即使这种情况没有发生,您也可能会让一些出于期待而访问网站的用户望而却步。如果他们随后看到“请注册才能查看本文”框,那么,请感谢您的高跳出率。
首先,我希望您这样做并不是为了向搜索引擎机器人提供与您的网站为普通用户提供的内容不同的内容。如果他们发现您这样做,您的网站将从他们的列表中完全删除。只要您了解其风险,您通常可以找到有关他们将使用哪种独特用户代理的信息:
但是,一些编写(通常表现不佳)网络抓取工具的人会将其用户代理字符串设置为与“合法”爬虫程序(例如 Google 的)相同。您可以通过查找机器人的 IP 地址/主机名来捕获这些内容,以确保它们实际上来自 Google/Yahoo/等。有关在主机名查找中查找内容的更多信息(来自本文):
- Google 抓取工具将以 googlebot.com 结尾,如crawl-66-249-70-244.googlebot.com。
- 雅虎爬虫将以crawl.yahoo.net结尾,如llf520064.crawl.yahoo.net。
- 实时搜索爬虫将以 search.msn.com 结尾,如 msnbot-65-55-104-161.search.msn.com。
- Ask爬虫将以ask.com结尾,就像crawler4037.ask.com一样。
您最好使用 $_SERVER['HTTP_USER_AGENT'] 并查找 Googlebot 或 Yahoo!咕噜咕噜。
我不认为抓取工具来自 google.com,而且我知道还有一些您不想将其视为来自 google.com 的机器人。所有搜索您网站的人。
您需要做的是查看不同机器人的IP。 http://www.google.com/support/webmasters/bin/answer.py?hl=zh-CN&answer=80553
$_SERVER['HTTP_USER_AGENT']
在此处检查各种用户代理字符串:http://www.user-agents.org/
Google/Bing/Yahoo 爬虫 IP 地址 -
http://myip.ms/info/bots/Google_Bing_Yahoo_Facebook_etc_Bot_IP_Addresses.html
使用众所周知且行为良好的机器人(如您提到的机器人)实现此目的的最佳方法是通过 用户代理,您可以在 $_SERVER['HTTP_USER_AGENT'] 上找到它。
通过用户代理检查非常不可靠,任何人都可以在那里写任何他们想要的东西。更好的方法是反向 DNS 检查,攻击者需要破坏主要搜索引擎的 DNS 才能绕过检查,但这种情况不太可能发生。对于那些不知道的人:你取一个地址,比如 1.2.3.4,对其进行 PTR 查找,该地址应该位于主要搜索引擎的区域中,例如 google.com、search.msn.com,但这不是这还不够,因为它很容易受到损害,但重要的一步是:对您获得的名称(例如 search.msn.com)进行正向 DNS 查找,并且 1.2.3.4 应该位于您收到的 A 记录列表中,这意味着 1.2.3.4 是合法的 MSN 搜索引擎地址。
我一起破解了一些东西,但你必须查看 $_SERVER['HTTP_USER_AGENT'] 看看它们是否来自搜索引擎域。
function is_crawlers() {
$sites = 'Google|Yahoo|msnbot|'; // Add the rest of the search-engines
return (preg_match("/$sites/", $_SERVER['HTTP_USER_AGENT']) > 0) ? true : false;
}