PHP

индекс
206,76

Поиск по сайту на основе Yandex.XML

Почему-то вебмастера ленятся сделать нормальный поиск по своему сайту. Особенно это касается высокопосещаемых сайтов, где качественный поиск был бы очень удобен для рядового пользователя.

Чаще всего прибегают к готовому решению от Google, с помощью которого можно еще и подзаработать на контекстной рекламе. Но для рунета я бы посоветовал сделать поиск при помощи сервиса Yandex.XML, потому что такой поиск больше адаптирован под морфологию русского языка. К тому же вы можете получить шанс получить самые жирные биды для контекста, если будете использовать поисковый директ.

В этом посте я хочу подробно показать вам, что подобный поиск организовать совсем не сложно. Это займет всего несколько минут и выльется в десяток строк на PHP.


Шаг 1: Регистрация IP на сервисе яндекс

Для начала идем на http://xml.yandex.ru/ и регистриуем свой IP:

image

Шаг 2: Читаем маны

На сервисе довольно запутанная навигациия, поэтому я сразу даю ссылку на документацию по поисковому запросу

Шаг 3: Пишем программу на PHP

Далее привожу часть своей программы, из которой станет понятно как создать аналогичный модуль для своего сайта.

Получаем строку для поиска методом GET или POST

$q = $_GET['q'];

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

$q = preg_replace("/[^а-яА-Я\d\w\s]/iu", "", $q);

Сервер XML-поиска Яндекса принимает поисковые запросы из входного потока методом POST (в формате XML). Также запросы принимаются методом GET по адресу xmlsearch.yandex.ru/xmlsearch/ Я не стал особо мудрить и решил использовать метод GET. $page — это номер страницы, начиная с 0, а yousite.ru — ваш сайт, по которому будет вестись поиск.

$ya_query = "http://xmlsearch.yandex.ru/xmlsearch" . "/?page=" . $page . "&query=" . urlencode($q . " << host=\"yoursite.ru\"");

Отправляем GET запрос в яшу:

$xml_data = file_get_contents($ya_query);

Дальше я удалил из XML файла часть поискового запроса (<< host=«yoursite.ru»), для того, чтобы он «не мешался под ногами».

$xml_data = str_replace("& lt ;& lt ; host=& quot ;yoursite.ru& quot ;", "", $xml_data);
(не забудьте убрать пробелы)

XML ответ у нас теперь есть. Теперь возьмем шаблон XSL для того, чтобы вставить туда наши данные. Различные шаблоны можно найти на самом сервисе яндексе.xml, а здесь я дам ссылку на свой шаблон, который вам придется заточить под себя. Кажется я и сам нашел его где-то на просторах интернета, потому в нем будет довольно много «мусора».

Я надеюсь, что вы интуитивно в нем все-таки разберетесь. Впринципе, все довольно просто.

Загружаем наш XSL шаблон, у меня это делает smarty, а у вас, допустим будет вот так:

$handle = fopen($filename, "r");
$xsl_data = fread($handle, filesize($filename));
fclose($handle);


Ну вот и все, остается только воспользоваться мощью PHP5 и соединить все это воедино:

$xh = new xsltprocessor();

$xml = new DOMDocument();
$xsl = new DOMDocument();

$xml->loadXML($xml_data);
$xsl->loadXML($xsl_data);

$xh->importStyleSheet($xsl);
$search_result = $xh->transformToXML($xml);


Ну, и еще я поменял кодировку на utf-8:

$search_result = iconv("windows-1251", "utf-8", $search_result);

Распечатываем наш результат:

print $search_result;

Вот и вся наука. Пример реализации можно посмотреть у меня на блоге. Как видите прикрутить поиск по сайту на основе Yandex.XML не так уж и сложно!

Я не считаю себя гуру программирования, возможно я упустил какие-то детали, или какие-то места выглядят не очень красиво с точки зрения программиста. Укажите, пожалуйста, мне на мои недочеты, буду очень признателен.

Еще по теме:

PHP класс для работы с Яндекс.XML
+26
25 ноября 2009, 04:19
163

комментарии (58)

+2
Nascosto #
Я прогоняю эту переменную через регулярку, дабы всякие шалуны не вздумали пихать туда что попало, такс, на всякий пожарный.

$q = preg_replace("/[^а-яА-Я\d\w\s]/iu", "", $q);

А как же кавычки? Как же ключевые + — в запросе?
+2
Blurayman #
Если текст в UTF-8 (или в других вариациях Unicode), то диапазон «а-яА-Я» не захватит буквы «Ё» и «ё»
Unicode Cyrillic Charts[http://www.unicode.org/charts/PDF/U0400.pdf]
–2
egorinsk #
C этим юникодом одни заморочки, блин!
0
anmiles #
Кстати, а вы не знаете, почему с буквой Ё исторически сложились такие сложные взаимоотношения?
(предвижу ответ: правильно, исторически :))
0
Blurayman #
Видимо потому, что буква Ё имеет диакритические символы, расширяющие основной кириллический алфавит. А коды всех символов с диакритикой, надстрочными и подстрочными символами, специфичные для разных вариантов алфавитов кириллицы (как и в других алфавитах) обычно расположены после общеупотребительных символов.
0
anmiles #
Странно… Буква Й тоже имеет хренюжку над собой, однако торчит в диапазоне вместе со всеми остальными.
0
Blurayman #
> Видимо потому, что буква Ё имеет диакритические символы, расширяющие основной кириллический алфавит

видимо, в большинстве кириллиц буква Й все-таки присутствует, в отличие от бухвы Ё
–6
Nc_Soft #
Нет, это даже не потому что Екатерина 2 ввела эту тупую букву, которой практически никто не пользуется на манер немецких буковок с точечками.
Проблемы с ней потому, что она по кодам символов не входит в диаппазон а-я, в котором все буквы идут по порядку возрастания их кодов.
0
anmiles #
Вот мне и интересно, почему у неё такой исключительный скан-код :)
+3
MadJeck #
Если у вас там включен режим юникода то почему бы не использовать вместо \d \w \s эквиваленты для юникода \pN \pL \pZs (http://ru2.php.net/manual/en/regexp.reference.unicode.php) ну и с буквами возиться не придется.
0
MadJeck #
P. S. Не вам а автору конечно :)
0
Snicke #
Не штудировал даже этот ман, надо будет ознакомиться, спасибо.
+2
Screen #
Что то не прийдет в голову символ, который может в итоге помешать запросу. Думаю яндекс сам отфильтрует что не нужно.
+8
mishinoleg #
обидно, если в какой-то момент поиск отрубится из-за ограничения в 1000 запросов =)
+1
erfen #
Если на сайте есть Директ в результатах поиска — пожно попробовать договориться.
help.yandex.ru/xml/licence.xml п.1
+2
mishinoleg #
А если к примеру не хочу я использовать директ на своих сатах, а пользоваться их поиском хочу — что мне делать?

кстати, я бы с удовольствием платил бы допустим 1000р в год да поиск без ограничений.
Яндекс, вы меня слышите — вот они денежки, приходите и забирайте =)
0
danger4k #
софт проверки позиций в Яндексе XML-кой кормите? ;)
0
mishinoleg #
для этих целей не кормлю, для этих целей распределяю запросы между несколькими (порядка 15) IP-адресами, там запросов хватает, все позиции проверяю ежедневно — без проблем.

Но с этим проще, здесь объёмы запросов прогнозируемые, чего не скажешь о поиске по сайту.
+3
Alver #
используйте Яндекс.Сервер. как вариант если хочется использовать их поиск без ограничений.
0
mishinoleg #
спасибо, очень интересно, возможно это то самое =)
+2
semenovs #
За 1000, но не рублей и не в год можете купить у яндекса неограниченное кол-во запросов :) Одно время баловался покупал. Потом понял что смысла нет, Google «номер один» везде.
0
AndrewTishkin #
Гугл конечно №1, но в последнее время его тоже всякой гадостью замусорили, не всегда резулльтаты поиска радуют :( У гиганта и проблемы гигантские, что поделать

Кстати, ещё у Bing-а есть халявные поисковые интерфейсы (XML, JSON). Жаль, что сам бинг очень «зелёный»…
0
kukutz #
В этом случае можно попробовать воспользоваться site.yandex.ru, который специально для этого предназначен.
0
AndrewTishkin #
Настоящее ограничение количества запросов не применяется в отношении сайтов, подключенных к Рекламной сети Яндекса согласно договору с Яндексом, предусматривающему возможность использования Сервиса.

Для меня это новость. Я почему-то раньше думал что тут как у гугла для снятия ограничения нужно платить o_O Хотя чуть ниже говорят, что и за деньги можно

Хм, ещё один повод использовать Яндекс.Директ :) Спасибо автору, Вы мне раскрыли глаза )
0
Snicke #
Эту проблему можно решить: просто написать в саппорт (мыло можно найти в xml.yandex.ru) чтобы они увеличили тебе лимит, если это конечно необходимо.
0
VIST #
Я уже словил

Limit exceed for 62.109.2.129

limit exceed
0
Snicke #
Ага, хабраэффект, однако =) Все хотят попробовать. Теперь только после полуночи по Москве можно будет снова безболезненно пользовать поиск.
+7
Nc_Soft #
Надо ставить sphinx, решение с яндексом имеет недостатки: неполная индексация, долгая индексация, лимит запросов.
0
zar0ku1 #
Ищу хороший поиск по сайту, в данный момент использую яндекс.сервер, в связи с этим вопрос: sphinx умеет индексацию не по базе, а именно по сайту? Потому что есть просто html-страницы
0
docomo #
Не умеет. Только по SQL. Тем и хорош.
+3
smmurf #
И тем же, судя по всему, в некоторых ситуациях плох -(
0
Nc_Soft #
Он умеет индексировать также и xml документы, коими являются правильные html страницы. Но вот непонятно зачем искать по страницам сайта, если они формируются из данных базы.
+1
zar0ku1 #
Ой как не всегда
–2
Quiz #
На дворе XXI век, а люди всё ещё пишут на чистом HTML?
Зачем?
0
smmurf #
Когда контент статичен, я бы спросил про бекенд: зачем?
Визитка, например. По ней поиск, конечно, не нужен, но «чистый HTML» тут — то, что надо.
0
Quiz #
С этим согласен.
Визитки/заглушки делаются статикой.
Но тогда при чем здесь поиск? :)
–1
aktuba #
Спросите у Opera. Насколько помню, у них чистый html на бекендах…
+1
alfa #
Аналогично, используем sphinx очень удобное API, до этого аспсёрч использовали и яндекс.серч (не xml) со всеми вытекающими последствиями. А sphinx потихонечку себе подключается к slave mysql серверу и посасывает данные не нагружая систему.
+5
alexeyenko #
А если сайт новый и не в индексе?
+2
musuk #
Google csbe не анализировали в сравнении с яндыксом?
0
Snicke #
Нет, даже не знаком, надо будет погуглить
+3
amxm #
Толку от яндекс поиска если он не все страницы сайта индексирует.
+1
nobody #
Очень глючный поиск, долгое время отклика, не все страницы сайта в индексе, частое отсутствие релевантности в результатах, частые проблемы с кодировкой.

Часто так бывает, если результатов отвечающих запросу нет на сайте, выдаются левые сайты конкурентов.
Зачем отдавать свой траф конкурентам?

Идеально писать поиск под свой сайт, чтобы управлять результатами и не юзать глюки яндекса.
Даже гугловский поиск на порядок адекватнее.

0
Snicke #
> Часто так бывает, если результатов отвечающих запросу нет на сайте, выдаются левые сайты конкурентов.
Зачем отдавать свой траф конкурентам?

А я все думал, что это с моей стороны где-то ошибка. Никак не мог понять почему в поиск лезут левые сайты…
+3
Antoxa #
Вообще есть еще поиск Quintura по сайту — affiliates.quintura.com/
Недостаток только один — надо подождать пока сайт проиндексится.

Плюс в том, что можно получить персональную помощь и настройки поиска от службы поддержки. Недавно для КТ сделали поиск по сайту — quintura.computerra.ru/ — по одному запросу можно поискать на каждом из сайтов КТ. Кстати так же можно сделать вкладки поиска по разным разделам одного сайта.

И да, я из Quintura, поэтому можете покидать в меня камни.
0
egoserg #
относительно жирных бидов, тут ты не прав.
Насколько я понимаю яха и гугл, всегда пытаются показать нормальную рекламу (подороже)
–1
tiaurus #
У Wordpress отличный поиск. Яндекс ни разу не нужен, тем более устанавливаемый такими извращенческими методами.
–4
Quiz #
Вообще-то нормальные вебмастера не ленятся делать нормальный поиск по своему сайту.
Решения со сторонними поисковыми машинами вообще считаю дикостью.
Во-первых не все страницы могут быть в индексе.
Во-вторых действительно сравнительно большое время отклика.
В-третьих это просто несолидно.
Собственно, об этом всём было сказано в комментариях выше.
0
smmurf #
Вы знаете, ничего не хочу сказать о поиске от Я и Г, но несолидным на мой взгляд получается как раз тот поиск, который сделали сами, не поленились, но им ничего невозможно найти. Было у меня как-то это на сайте МТС, у них свой поиск без учета словоформ сделан был (как сейчас — не знаю). Ну и толку от него?
0
Quiz #
Значит поленились. :)
Есть проекты, которым хватает и LIKE %keyword%, а есть и крупные системы, в которых такая халтура не прокатит.
Самое забавное, что делая поиск по первому варианту многие веб-студии пишут в смете «модуль поиска» и умудряются содрать с несчастного клиента за это дополнительные деньги. Порой, немалые.

И всё равно поиск на основе я.xml кажется мне одним большим костылём.
+1
Antoxa #
Можно привести огромный список больших и успешных интернет-проектов, которые используют для поиска по сайту G,Y и Q. Имея на то свои резоны и избавляясь от головной боли.

И тут приходит Quiz и авторитетно обвиняет их в лени и дикости.
0
barba #
Хм. www.w3schools.com — солидный ресурс. Поиск через google.
+1
yellow_duck #
Не очень понятно, зачем обрабатывать поисковую строку, тем более таки «ущербным регекспом», если яндекс и так все это делает.
2е непотно, зачем вырезать, что-то из xml ести можно просто не обрабатывать этот елемент в xsl.

Вобщем слабая статья и не точная статья, скорее расчитана на совсем на новичков, а не опытных(как вы сказали) программистов.
+1
Snicke #
Сейчас объясню:

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

2. Я не могу не обрабатывать параметр «query» в XSL, он мне нужен, но в другом виде, нежели он приходит из XML. Эта строчка нужна больше для красоты, можно сделать и по-другому.

3. Вы, yellow_duck, видимо не внимательно ознакомились с этой статьей, ведь в ней я не упоминал словов «опытный программист», поэтому ваши обвинения безосновательны.
0
kashey #
два года работал у меня поиск через Yandex.XML
в один момент перестал…
дампы входящего xml показали что он выдает страницы с других доменов( которые слава богу я прибивал)

суть в том что я писал как и написано в хелпе & lt ;& lt; host=& quot ;yoursite.ru& quot ; а теперь ( почему-то? ) писать << host=\«yoursite.ru\»
0
patt #
Для поиска на сайте я бы предпочёл гугл т.к. гугл индексирует больше страниц и быстрее. Тоесть добавляем материал на сайт, в поиске от гугл он становится доступен через сутки, в поиске от яндекс до месяца (по крайней мере на такие сроки ориентируются SEO конторы) и у яндекса, как правило меньше шансов, что страница будет проиндексирована вообще, тоесть часть контента будет недоступна для поиска.
–1
paxter #
Зачем использовать Яндекс.Xml? Яндекс.xml накладывает серьёзные ограничения на работу поиска: лимит запросов, использование стороннего сервиса… Если вы так любите Яндекс, то используйте Яндекс.Сервер!
+1
l0rda #
Ну и что это такое? Парсить XML, когда наши корабли бороздят просторы вселенной? Почему не сделать апи?
Я уже давно сделал App для django, который работает с гугловым API, вот только очень жаль, что новых ключей они(гугл) уже не выдают.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.