Уже продолжительное время доступен сервис Яндекс.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/