
Уже продолжительное время доступен сервис Яндекс.XML — сие есть не что иное, как поисковый сервис, который позволяет делать автоматические поисковые запросы к Яндексу и публиковать его ответы у себя на сайте и данный пост посвящен приручению сего зверя с использованием PHP.
!: Данный пост есть развитие диалога в топике habrahabr.ru/blogs/php/36932
Для начала нам необходимо зарегистрировать IP адрес сайта в базе Яндекса. После этого нам станет доступен бесплатный вариант поиска, который предполагает не более 1000 запросов в сутки с одного IP. Так же одним из условий использования сервиса является размещение фразы «Поиск реализован на основе Яндекс.XML» на странице результатов поиска.
Теперь приступим непосредственно к PHP, нам понадобится класс Yandex (скромное название — могут не понять), его Вы можете скачать со странички проекта на Code-Google, так же есть доступ к SVN репозиторию:
svn checkout yandex.googlecode.com/svn/trunk yandex-read-only
Требования вполне приемлемые:
- PHP 5.1+
- SimpleXML
- CURL
Приступим, для начала подключаем сам класс:
require_once 'Yandex.php';
Далее — нам необходимо забрать из реквеста поисковый запрос, номер страницы и сайт по которому будем искать (вполне вероятно Вам понадобится гораздо больше параметров, но будем считать это необходимым минимумом):
// забираем "query", "page" и "host" с request'а
$query = isset($_REQUEST['query'])?$_REQUEST['query']:'';
$page = isset($_REQUEST['page']) ?$_REQUEST['page']:0;
$host = isset($_REQUEST['host']) ?$_REQUEST['host']:null;
Теперь непосредственно манипуляции с классом Yandex:
if ($query) {
// создаем экземпляр класса Yandex
$Yandex = new Yandex();
$Yandex -> query($query) // устанавливаем поисковый запрос
-> host($host) // ограничиваемся поиском по сайту
-> page($page) // текущая страница
-> limit(10) // результатов на странице
-> set('max-title-length', 160) // тонкая настройка поисковой выдачи (см. http://code.google.com/p/yandex/source/browse/trunk/Yandex.php#48)
-> set('max-passage-length', 200)
-> request() // отправляем запрос
;
}
Если всё прошло гладко, то результат будет доступен в "$Yandex->result" — сие есть SimpleXML объект, ничем и никак не порезанный — дабы предоставить полную свободу действий для его обработки. Далее привожу пример вывода результатов поиска (HTML опущен):
// проверяем всё ли гладко
if (isset($Yandex) && empty($Yandex->error)) :
// вот таким образом мы стучимся к результатам
foreach ($Yandex->result->response->results->grouping->group as $group) :
// вывод URL
echo $group->doc->url;
// вывод заголовка - метод Yandex::highlight выделяет поисковую фразу
Yandex::highlight($group->doc->title);
// выводим пассажи
foreach ($group->doc->passages->passage as $passage) :
Yandex::highlight($passage);
endforeach;
endforeach;
// далее выводим постраничную навигацию, она немного громоздка
foreach ($Yandex->pageBar() as $page => $value) :
// switch statement for $value['type']
switch ($value['type']) {
// ссылка на страничку
case 'link':
echo '<a href="'. $url .'&page='. $page .'" title="Page '. ($page+1) .'">'. sprintf($value['text'], $page+1) .'</a> | ';
break;
// текущая страница
case 'current':
echo sprintf($value['text'], $page+1) .' | ';
break;
// текст разделителя - ".."
case 'text':
echo $value['text'] .' | ';
break;
default:
break;
}
endforeach;
// если что-то не так - выводим ошибку
elseif(isset($Yandex) && isset($Yandex->error)):
echo $Yandex->error;
endif;
В данном примере используются конструкции ввида «if (..):… endif;», т.к. они наиболее подходят для шаблонизаторов с нативным PHP синтаксисом, для оборачивания сего в Smarty Вам понадобиться заасайнить $Yandex в шаблон и далее переделываем пример:
// будет что-то типа:
$Smarty->assign("Yandex", $Yandex);
Разбирать сам класс по запчастям, я думаю, особо не стоит — кто знает PHP и так поймет — благо комментарии присутствуют, да и ничего военного в нем нет — все достаточно просто. Если же есть пожелания иль замечания — пишите — будем обсуждать…
Попробывать скрипт на вкус можно на страничке http://yandex.hohli.com/
