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

    by  • 03.03.2010 • jQuery, php, программирование • Комментарии [5]

     Держи позиции сайтов под прицелом (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-шники получают деньги лишь имея продвигаемый сайт в десятке. Желаю, чтобы позиции ваших сайтов только росли! =)

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

    1. 18.08.2010 at 17:32

      все конечно хорошо, но вот только выдача yandex зависит от региона… Как тогда быть-то?

    2. 18.08.2010 at 17:36

      хотя я кажется догадался =)

      • 19.08.2010 at 17:19

        интересно услышать как?
        просто я пока не представляю как можно локализовать выдачу…
        буду признателен за ответ =)

    3. Max
      02.10.2010 at 03:04

      Сейчас другая проблема, с этим XML,
      Вообще все плохо, Yandex ограничивает число запросов до 1000 в день с одного IP, ну это ладно, несколько IP,
      А теперь он хочет Один User = 1 IP ,
      Число запросов 1000 — но он странным образом с одного запроса позиции — забирает 100пунктов. пока не понимаю в чем заморочка

      • 02.10.2010 at 16:56

        мне кажется дело в том, что один запрос тратится лишь тогда, когда сайт находится в первой десятке, если же сайт находится на n-странице, тратится n запросов, но могу ошибаться

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

    Ваш e-mail не будет опубликован. Обязательные поля помечены *