Держи позиции сайтов под прицелом (Yandex XML)

Все, кто занимается продвижением или делает это не специально, интересуется позициями своего сайта/сайтов. Хоть и каждый для этого дела использует разные программы/скрипты, я предлагаю же создать что-то под себя почти с нуля. Сегодня мы будем снимать позиции с популярной в России поисковой системы Яндекс. Яндекс разработчикам предлагает очень удобный интерфейс для взаимодействия. Благодаря которому мы с легкостью можем встроить на свой сайт поиск или что-нибудь полезное еще. Но сегодня мы ограничимся лишь снятием для конкретного сайта и ключевого слова позиции. В начале нам зарегистрировать свой IP-адрес, потому как Яндекс накладывает ограничение на количество запросов с одного IP-адреса, но их с лихвой хватит для нескольких сайтов. Нетерпеливым предлагаю сразу скачать исходник со всеми скриптами и картинкой, отображающейся когда идет запрос, но еще не получен результат. И тут применяется AJAX технология, реализовать которую нам помог так любимый мной jQuery.

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

Файл post.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php
header ("Content-Type: text/html;charset=utf-8");
$host = isset($_REQUEST['host']) ? $_REQUEST['host'] : '';
$query = isset($_REQUEST['query']) ? $_REQUEST['query'] : '';

$query_esc = htmlspecialchars($query);
$host_esc  = htmlspecialchars($host);

$host = preg_replace("[^http://|www\.]", '', $host);

$page  = 0;
$found = 0;
$pages = 50;
$error = false;
$exit = 0;
while (!$exit && $page < $pages && $host)
{
   // XML запрос
$doc = <<<DOC
   <?xml version='1.0' encoding='utf-8'?>
      <request>
      <query>$query_esc</query>
      <page>$page</page>
      <maxpassages>0</maxpassages>
      <groupings>
         <groupby attr='d' mode='deep' groups-on-page='10' docs-in-group='1' curcateg='-1'/>
      </groupings>
   </request>
DOC
;

    $context = stream_context_create(array(
        'http' => array(
      'method'=>"POST",
      'header'=>"Content-type: application/xml\r\n" .
           "Content-length: " . strlen($doc),
      'content'=>$doc
        )
    ));
    $response = file_get_contents('http://xmlsearch.yandex.ru/xmlsearch', true, $context);

    if ( $response ) {
       $xmldoc = new SimpleXMLElement($response);
       $xmlresponce = $xmldoc->response;
        if ($xmlresponce->error) {
            print "Возникла следующая ошибка: " . $xmlresponce->error . "<br/>\n";
            $exit  = 1;
            $error = true;
            break;
        }
        $pos = 1;
        $nodes = $xmldoc->xpath('/yandexsearch/response/results/grouping/group/doc/url');
        foreach ($nodes as $node) {
            if ( preg_match("/^http:\/\/(www\.)?$host/i", $node) ) {
                $found = $pos + $page * 10;
                $exit = 1;
                break;
            }
            $pos++;
        }
        $page++;
    } else {
        print "внутренняя ошибка сервера\n";
        $exit = 1;
    }
}
if (!$error) {
    // если что-то найдено, то выводим результат
    if ($found) {
      print $found;
    } elseif ($host) {
        print "<p>сайт находится далее, чем на ". $pages*10 ." месте в выдаче";
    }
}
?>

В строке указывается количество страниц, которое нужно просмотреть в поисках своего сайта.

И теперь HTML-файл, который обернет нам это большой, но несложный код.

index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
      <script type="text/javascript" src="js/jquery.js"></script>
      <script type="text/javascript">
         $('document').ready(function() {
            $('img.busy').hide();
           
            $("button#push").click(function() {
               $('div#output div').text('');
               var host = $('input#host').val();
               var query = $('input#query').val();
               var queryString = '/post.php?query=' + query + "&host=" + host;
               $('img.busy').bind("ajaxSend", function() {
                  $(this).show();
               }).bind("ajaxComplete", function() {
                  $(this).hide();
               });

               $.get(queryString, function(data) {
                  $('div#output div').text(data);
               });
            });
         });
      </script>
   </head>
   <body>
      <table width="40%" border="0" align="center" cellpadding="3" cellspacing="3">
        <tr>
         <td>хост</td>
         <td><input id="host" type="text"></td>
         <td><center><div id="output"><img src="img/ajax.gif" class="busy"/><div></div></div></center></td>
        </tr>
        <tr>
         <td>запрос</td>
         <td><input id="query" type="text"></td>
         <td><center><button id="push">запросить</button></center></td>
        </tr>
      </table>    
   </body>
</html>

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

Этот скрипт легко можно переделать так, чтобы каждый день он запускался по расписанию и проверял позиции для некоторых ключевых слов для десятка сайтов, сохранял полученную информацию в БД. Насколько мне известно, некоторые SEO-шники получают деньги лишь имея продвигаемый сайт в десятке. Желаю, чтобы позиции ваших сайтов только росли! =)