Pull to refresh

PHP класс для работы с Яндекс.XML

Reading time 3 min
Views 14K


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

Articles