25 November 2009

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

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

Чаще всего прибегают к готовому решению от 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
Tags:ЯндексXMLразработкапоиск
Hubs: PHP
+26
11.4k 167
Comments 58
Popular right now
Middle PHP developer (удалённо)
from 120,000 ₽BoxberryRemote job
Веб-разработчик php (1с-Битрикс)
from 35,000 to 50,000 ₽Пластилин-АртКурскRemote job
PHP разработчик
to 110,000 ₽Sportmaster LabМоскваRemote job
PHP-разработчик
from 40,000 to 60,000 ₽Dota2.ruRemote job
Backend разработчик, разработчик PHP
from 90,000 ₽Комплектующие для ЧПУRemote job