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 и сама статья были вам полезны. Буду благодарен, если поделитесь ссылкой со своими друзьями в социальных сетях. На этом у меня всё. Спасибо за внимание. Удачи!
Все просто и понятно. Единственное «но» - под php5 и curl его бы заточить уже, а то все эти var и file_get_contents в 2014 году как то не актуальны )
В любом случай - спасибо за труд!
2GIN а что не так в плане PHP5? По моему cURL был раньше _contents функций. Конечно можно использовать и cURL, но зачем? В данном случае всё и так нормально работает.