Поиск по сайту с помощью Яндекс.XML

Дорогие зрители, сегодня мы с Вами совершим увлекательное путешествие в загадочную страну под названием Яндекс.XML.
Итак, Яндекс.XML — это сервис Яндекса, который позволяет выполнять автоматические поисковые запросы к ранееупомянутой поисковой системе и публиковать его ответы у себя на своем сайте в удобной для Вас форме.

В этой статье я опишу как отправлять сервису свои поисковые в формате XML на примере скрипта поиска по сайту.

Самый простой XML-запрос к сервису имеет вид
<?xml version='1.0' encoding='utf-8'?>
<request>
<query>your query</query>
<page>0</page>
</request>

Здесь в теге query должен размещаться Ваш поисковый запрос, а в теге page — номер страницы результатов поиска (отсчет страниц результатов поиска начинается с нуля).

Текст поискового запроса представляется простой текстовой строкой, в которой не должно быть специальных символов html. Чтобы избавиться от этих символов можно в Вашем скрипте поиска по сайту воспользоваться функцией htmlspecialchars:
$search_query = htmlspecialchars($search_query);

Для поиска Вашего запроса по определенному сайту, а не по всей базе Яндекса можно воспользоваться поисковым оператором << host="www.site.ru". Он ограничивает область поиска только сайтом www.site.ru.

Ваш XML-запрос должен отправляться сервису методом POST и Content-type: application/xml. Реализуется это с помощью передачи функции file_get_contents() заполненного метода stream_context. Пример передачи запроса сервису Яндекс.XML на PHP смотрите в примере ниже (блок, отвечающий за передачу запроса выделен).

$query = «Ваш поисковый запрос»;
$your_url= «www.site.ru»; //Ваш сайт
$search_query = $query . " << url="" . $your_url . """;
$search_query = htmlspecialchars($search_query); // заменяем в запросе все символы html в соответствующие им кодовые обозначения

$xml_query = "<?xml version='1.0' encoding='utf-8'?>
<request>
<query>" . $search_query . "</query>
<page>0</page>
"</request>;

//---- отправляем методом POST наш запрос -----
$context = stream_context_create (array (
'http' => array (
'method'=>«POST»,
'header'=>«Content-type: application/xmlrn» .
"Content-length: " . strlen ($xml_query),
'content'=>$xml_query
)
));
//----------------------------------------------------------------------

$response = file_get_contents ('http://xmlsearch.yandex.ru/xmlsearch', true, $context);
if ( $response ) {
$xmldoc = new SimpleXMLElement ($response);
// выполняем обработку ответа
}

Как Вы видите, результат запроса возвращается в формате XML, и поэтому его можно обработать с помощью SimpleXMLElement.
Процедуру обработки результата запроса я здесь не разбираю, потому как механизм работы с XML в PHP был доступно мною описан в одноименной статье (хотя если у Вас возникнут какие-либо проблемы с обработкой данных, возвращаемых сервисом, то пишите — обязательно помогу).

Итак, на этом можно считать процедуру отправки простого поискового запроса в Яндекс.XML завершенной.
Позже я расскажу как выполнять запросы с сортировкой а также опишу коды основных ошибок, которые могут возникнуть во время выполения запроса.

ЗЫ: чуть не забыл. Чтобы Яндекс.XML обрабатывал Ваши запросы, нужно зарегистрировать свой IP-адрес (IP-адрес машины, на которой выполняется PHP-скрипт запроса) на странице http://xml.yandex.ru/ip.xml.

Поблагодарить автора

3 Responses to Поиск по сайту с помощью Яндекс.XML

  1. здравствуйте, вы тут написали, что можете помочь... если вам нетрудно, помогите мне пож-ста с моей проблемой.

    у себя в скрипте я пытаюсь обработать все passages таким образом: www.pasteme.org/5ff283e94...026df913b1f20575 (много закомменчено — я пытался по разному справиться)

    но мне постоянно мешает тег hlwords: при выдаче результатов у меня на страницу выводится всё кроме того, что находится внутри этого тега (((

    не знаю как с этим бороться :(

    заранее спасибо.

  2. Здесь-же можно обойтись и без регулярных выражений:

    $detagged_node = str_replace ('<hlword>', '<strong>',$detagged_node);

    $detagged_node = str_replace ('</hlword>', '</strong>',$detagged_node);

  3. дело в том, что hlword там находится с атрибутом priority («hlword priority="strict"»).

    плюс, я не знаю, что делать, если в тексте пассажа содержатся не теги, а html символы, которые через амперсанд записываются.

    помогите пожалуйста... мне просто для диплома очень нужно :)

    спасибо.

Оставить комментарий

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>