как идентифицировать веб-искателей google / yahoo / msn с помощью PHP?

НАСКОЛЬКО МНЕ ИЗВЕСТНО,

$ _SERVER ['REMOTE_HOST'] должен заканчиваться «google.com» или «yahoo.com».

но является ли он наиболее эффективным методом?

любой другой выход?

Вы определяете поисковые системы с помощью агента пользователя и IP-адреса . Более подробную информацию можно найти в разделе «Как определить поисковые роботы и веб-узлы» . Также стоит отметить этот список . Однако вы не должны обращаться с агентами пользователя (или даже с удаленными хостами) как обязательно окончательными. Пользовательские агенты – это не что иное, как то, что говорит вам другой конец, и, конечно же, он может вам что-то сказать. Тривиально писать код, чтобы притворяться роботом Google.

В PHP это означает просмотр $_SERVER['HTTP_USER_AGENT'] и $_SERVER['REMOTE_HOST'] .

Есть много поисковых систем, но, честно говоря, это только те немногие, которые вам действительно нравятся в целом. Google и Yahoo вместе имеют почти весь рынок. Но, конечно, это зависит от того, чего вы пытаетесь достичь.

Примечание: будьте очень осторожны в отношении поисковых систем по-разному к обычным пользователям (например, к «злому дефисному сайту», как выразился Джоэл), когда дело касается контента . В особенно вопиющих случаях это может привести к удалению вашего сайта из этой поисковой системы. Даже если этого не произойдет, вы, вероятно, отключите некоторых пользователей, которые отправятся на сайт, ожидающий чего-то. Если тогда они будут представлены с полем «Пожалуйста, зарегистрируйтесь, чтобы увидеть эту статью», ну, скажите, что ваш высокий показатель отказов.

Прежде всего, я надеюсь, что вы не пытаетесь сделать это, чтобы обслуживать ботов в поисковых системах различного контента, чем ваш сайт для обычных пользователей. Если они обнаружат, что вы это делаете, ваш сайт полностью удаляется из своих списков. До тех пор, пока вы понимаете риски этого, вы обычно можете найти информацию о том, какой уникальный пользовательский агент они будут использовать:

  • Проверка Googlebot (используйте пользовательский агент, обратный DNS, если вы хотите быть уверенным)
  • Пользовательский агент Yahoo будет содержать «Slurp»,

Тем не менее, некоторые люди, пишущие (обычно плохое поведение) веб-скребки, будут устанавливать свои строки User Agent так же, как «законные» сканеры, такие как Google. Вы можете поймать их, выполнив поиск по IP-адресу / имени хоста бота, чтобы убедиться, что они действительно поступают из Google / Yahoo / и т. Д. Дополнительная информация о том, что искать в именах хостов ( из этой статьи ):

  • Google crawlers закончится с googlebot.com, как в crawl-66-249-70-244.googlebot.com.
  • Yahoo crawlers закончится crawl.yahoo.net, как в llf520064.crawl.yahoo.net.
  • Поисковые роботы в реальном времени завершатся поиском.msn.com, например, в msnbot-65-55-104-161.search.msn.com.
  • Спросить сканеров заканчивается ask.com, как в crawler4037.ask.com.

Вероятно, вам лучше использовать $ _SERVER ['HTTP_USER_AGENT'] и искать Googlebot или Yahoo! Slurp.

Я не думаю, что сканеры идут с google.com, и я знаю некоторых других людей, которых вы не хотите рассматривать как ботов, которые происходят оттуда. Все, кто ищет ваш сайт.

Что вам нужно сделать, так это взглянуть на IP-адрес разных ботов. http://www.google.com/support/webmasters/bin/answer.py?hl=en&answer=80553

 $_SERVER['HTTP_USER_AGENT'] 

Проверьте различные строки пользовательских агентов здесь: http://www.user-agents.org/

Google / Bing / Yahoo Crawlers IP-адреса –

http://myip.ms/info/bots/Google_Bing_Yahoo_Facebook_etc_Bot_IP_Addresses.html

Лучший способ сделать это с помощью хорошо известных и управляющих роботов, как и упомянутых вами, – это пользовательский агент, который можно найти на $ _SERVER ['HTTP_USER_AGENT'].

Я взломал что-то вместе, но вам нужно посмотреть на $ _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; }