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

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

Содержание:

Настройка API Яндекс.XML

Для начала вам нужно указать в настройках API Яндекс.XML IP-адрес локального компьютера или веб-сервера, а также получить имя пользователя (user) и API-ключ (key) из поля «Ваш адрес для совершения запроса» на этой же странице.

Настройка API Яндекс.XML

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

Мой IP - Яндекс интернетометр

Второй вариант относится к случаю, когда вы делаете запрос с Интернет-сервера, т.е. своего сайта. Таким образом, вам нужно узнать IP-адрес сервера, на котором расположен ваш сайт. Для этого вы можете использовать инструмент «Информация об IP адресе или домене» на 2ip.ru. По умолчанию он указывает IP-адрес вашего компьютера. Введите в поле доменное имя сайта, с которого будут осуществляться запросы и нажмите кнопку «Проверить». В поле 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 и сама статья были вам полезны. Буду благодарен, если поделитесь ссылкой со своими друзьями в социальных сетях. На этом у меня всё. Спасибо за внимание. Удачи!

Скачать Сейчас

GIN
GIN комментирует...

Все просто и понятно. Единственное «но» - под php5 и curl его бы заточить уже, а то все эти var и file_get_contents в 2014 году как то не актуальны )
В любом случай - спасибо за труд!

Константин Кирилюк
Константин Кирилюк комментирует...

2GIN а что не так в плане PHP5? По моему cURL был раньше _contents функций. Конечно можно использовать и cURL, но зачем? В данном случае всё и так нормально работает.