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

Категория: PHP , Веб-мастеру Комментариев: 3

Дорогие зрители, сегодня мы с Вами совершим увлекательное путешествие в загадочную страну под названием Яндекс.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.

Автор: Кто-то   @   8 января 2009 Комментариев: 3
Метки : , , , ,

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

Webmoney Z163628999150, R617151845974

Комментариев: 3

Комментарии
Окт 23, 2009
14:58
#1 soshial :

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

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

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

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

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

Автор Окт 25, 2009
22:14

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

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

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

Окт 26, 2009
0:53
#3 soshial :

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

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

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

спасибо.

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

Предыдущая запись
«
Следующая запись
»