PHP класс для работы с Яндекс.XML
В принципе, если не вдаваться в детали, то здесь нет ничего сложного. Правда есть мутки с IP и лимитами, но всё остальное, особенно если использовать GET запросы, вполне понятно. Следует также отметить, что решений для работы с Яндекс.XML достаточно много. Например, PHP-класс Антона Шевчука, подробней читайте на этой странице. Я не стал особо с ним разбираться и написал свой, который бы полностью отвечал моим требованиям, а именно – простота использования и наличие кэширования запросов. Также отмечу, что в своей статье я не буду разбирать особенности API Яндекс.XML и PHP-программирования, просто расскажу, как и что делать, а дальше решайте сами.
Содержание:
Настройка API Яндекс.XML
Для начала вам нужно указать в настройках API Яндекс.XML IP-адрес локального компьютера или веб-сервера, а также получить имя пользователя (user) и API-ключ (key) из поля «Ваш адрес для совершения запроса» на этой же странице.

Здесь то и начинаются танцы с бубнов. Что касается IP-адреса, то тут есть два варианта. Если делаете запросы со своего компьютера, то вам нужно узнать свой IP-адрес. Сделать это можно на странице интернетометра, см значение «Мой IPv4». Примечательно, что если ваш адрес не статичный, у вас могут возникнуть проблемы с лимитами, т.к. они распределяются между всеми пользователями этого IP-адреса.

Второй вариант относится к случаю, когда вы делаете запрос с Интернет-сервера, т.е. своего сайта. Таким образом, вам нужно узнать IP-адрес сервера, на котором расположен ваш сайт. Для этого вы можете использовать инструмент «Информация об IP адресе или домене» на 2ip.ru. По умолчанию он указывает IP-адрес вашего компьютера. Введите в поле доменное имя сайта, с которого будут осуществляться запросы и нажмите кнопку «Проверить». В поле IP будет нужное вам значение. Примечательно, что если вы используете виртуальный хостинг, то на одном IP-адресе может быть несколько сайтов, между которыми и будут распределяться лимиты.

Подводя итог, должен отметить, что я могу ошибаться в плане распределения лимитов. В строке запроса указывается пользователь и ключ, а значит лимитация может быть вполне уточнена.
PHP-класс YandexXML
Как не сложно догадаться, Яндекс XML возвращает результаты в XML-формате, да ещё и в UTF-8 кодировке. Для его парсинга я использую PHP-расширение SimpleXML. Сам PHP-класс YandexXML достаточно прост. У него есть всего две функции, одна для указания параметров, а другая для получения и парсинга результата. Не забываем и о фозможности кэширования результатов в виде XML-файлов.
Подключение
Для того чтобы подключить PHP-класс YandexXML в испольняемый скрипт, вам нужно скачать его архив, достать из него файл yandexml.php и переместить в нужную папку на компьютере или сервере. Далее просто инклудим его в PHP-код.
include_once('yandexxml.php');
Дальше нам надо создать объект PHP-класса, сделать это также просто, например:
$yxml = new YandexXML;
Теперь мы можем использовать функции PHP-класса через этот объект.
Задача параметров
Для того чтобы задать нужные параметры, имеется функция set_param(). Вы можете задавать параметры как ключ и значение, например:
$yxml->set_param('query', 'поисковый запрос');
так и в виде массива, например:
$yxml->set_param(array(
'query' => 'поисковый запрос',
'lr' => '213'
));
Примечательно здесь то, что имеются как «системные» параметры, так и параметр, которые передаются в запросе к Яндекс XML методом GET. Для начала разберёмся с системными параметрами:
domain– доменное имя API, по умолчанию задано значение «ru». Речь идёт о домене, на котором находится поддоменxmlsearch.yandex. Если не ошибаюсь, ещё существуют, как минимум,comиua, но тут смотрите сами.life_time– время жизни файла кэша в секундах, по умолчанию задано значение «0», т.е. кэширование не осуществляется.cache_path– путь где будут располагаться файлы кэша, по умолчанию не указано, т.е. кэш будет храниться в текущей папке. Примечательно, что при указании пути, он должен заканчиваться символом слеша (/).
Теперь, что касается параметров запроса. Как я и говорил, это переменные в строке GET. Для их формирования я использовал PHP-функцию http_build_query(), которая сама инкодит значения и формирует нужную строку. Подробное описание каждого такого параметра вы можете найти на этой странице в официальной документации API Яндекс.XML. Я же приведу лишь их краткое описание:
user– имя пользователя, см. Настройки API Яндекс XML.key– API-ключ, см. Настройки API Яндекс XML.query– текст поискового запроса.lr(не обязательно) – идентификатор страны/региона поиска, полный перечень которых вы можете найти на этой странице в официальной документации API Яндекс.XML.l10n(не обязательно) – язык уведомлений (ru,uaи т.д.).sortby(не обязательно) – тип сортировки:rlv(по умолчанию, по релевантности) илиtm(по времени изменения документа).filter(не обязательно) – тип фильтрации.maxpassages(не обязательно) – количество пассажей (фрагментов науденного документа) от 1 до 5.groupby(не обязательно) – параметры группировки результатов.page(не обязательно) – номер страницы (первой странице соответствует значение нуля).showmecaptcha(не обязательно) – всегда «yes».
Примечательно, что задать количество возвращаемых результатов здесь не получится, т.е. обычно их 10 штук. На счёт файлов кэширования, их название имеет вид: yandex_{md5(params)}.xml– они в XML-форме и имеют идентификатор на основе параметров.
Выполнение запроса
Осталось лишь выполнить запрос к Яндекс XML серверу, что делает функция request(), которая возвращает результат в виде объекта SimpleXML. Дальше вы можете обрабатывать результат исходя из структуры результата, подробней он ней читайте на этой странице в официальной документации API Яндекс.XML. Я же приведу лишь простенький пример:
$xml = $yxml->request();
$groups = $xml->response->results->grouping->group;
if ( sizeof($groups) > 0 ) {
$group_num = 1;
foreach ( $groups as $group ) {
$docs = $group->doc;
echo '<p><b>Group #'. $group_num .' have '. sizeof($docs) .' docs.</b></p>';
if ( sizeof($docs) > 0 ) {
foreach ( $docs as $doc ) {
echo '<pre>'; print_r($doc); echo '</pre>';
}
}
$group_num++;
}
}
Честно говоря, я не слишком разобрался с группами документов, но всё же учтите, что результат состоит из groupи docэлементов.
Надеюсь мой PHP-класс для работы с API Яндекс.XML и сама статья были вам полезны. Буду благодарен, если поделитесь ссылкой со своими друзьями в социальных сетях. На этом у меня всё. Спасибо за внимание. Удачи!
