Парсер выдачи «статистики запросов Яндекса» (wordstat)

Тема в разделе "Мелочи", создана пользователем H01mes, 8 сен 2009.

Статус темы:
Закрыта.
  1. H01mes

    H01mes В прошлом rkinfo

    Регистр.:
    28 авг 2008
    Сообщения:
    129
    Симпатии:
    27
    Делал для себя парсер выдачи http://wordstat.yandex.ru. Подозреваю, что кому-то может пригодиться (скажем для роботизированного поиска низкочастотников с целью клепания страничек под них), а потому выкладываю исходник.
    Скрипт работает на момент публикации этого поста (11 апреля 2009). Он перестанет работать, если Яндекс сменит вывод (вёрстку, оформление) wordstat`а.

    Чтобы код понять, надо немного знать php. Комментировал я всё неприлично подробно. Чтобы парсер использовать — достаточно скопировать весь код в файл parser.php, сохранить файл и закинуть куда-то к себе на сервер. Нужно, правда, чтобы на сервере кроме интерпретатора php была ещё и библиотека cURL, но оная имеется на любом адекватном хостинге, даже на пятикопеечных. Также нужно нормальное время исполнения скрипта, в худшем случае он будет работать 40 секунд (для пяти страниц выдачи), приходится искусственно притормаживать перед запросом очередной страницы у wordstat`а. Если этого не делать, то wordstat начнёт просить капчу (если вы на капчу таки нарвались, то подождите часок-другой, пока wordstat простит ваш IP-адрес).

    Собственно, тем кто код понимает, вряд ли составит труда нечто подобное написать за час самостоятельно. Но вдруг нужна таки готовая функция.

    Новичкам готов рассказать дополнительно как и чего работает. И если людям это нужно, то возможно буду что-то и в будущем выкладывать в паблик с подробными комментариями.


    PHP:
    <?
    function 
    yandexwordstat($query, &$keywords null$maxpage 5) { // Аргументы функции: запрос, ссылка на создаваемый функцией массив, максимальное количество страниц для обработки.
       
    srand(time()); // Нам потребуются случайные числа, чтобы вносить нерегулярную задержку перед повторными запросами к Вордстату, иначе он после n-ого запроса затребует вводить капчу.  
       
    $page 1// Предполагаем, что по нашему запросу в выдаче Вордстата будет лишь единственная страница.
       
    $query urlencode($query); // Кодируем в запросе символы так, как положено, чтобы не осталось там русских букв.
       
    do {
          
    $repeat true// Предполагаем, что парсить выдачу мы будем бесконечно. Позже мы остановимся, когда не останется страниц для дальнейшего анализа.
          
    $url "http://wordstat.yandex.ru/?cmd=words&geo=1&page=".$page."&text=$query&text_geo=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0+%D0%B8+%D0%BE%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C"// Ссылка с запросом и порядковым номером страницы выдачи по этому запросу. Выбран регион «Москва и область». Если регион не нужен, то убирайте из запроса ключ text_geo и его значение.
          
    $ch curl_init(); // Создаём объект-страницу. Нам помогает великая библиотека cURL -- лучший друг любого бота, который хочет претвориться браузером живого пользорвателя.
          
    curl_setopt($chCURLOPT_URL$url); // Указываем откуда затащить содержимое в наш объект.
          
    curl_setopt($chCURLOPT_HEADER0);
          
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)"); // Прикинемся каким-нибудь популярным браузером.
          
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
          
    $html curl_exec($ch); // Получаем объект-страницу в виде длинной символьной строки.
          
    curl_close($ch); // Убиваем объект-страницу, он нам больше не нужен, исходный код страницы уже в строковой переменной.
          // Регулярное выражение, выбирающее со страницы ключевики. Этой регуляркой выбираются вообще все ключевики со страницы, в том числе и запросы из колонки «Что еще искали люди, искавшие...». Благо в последнем случае показываются только самые популярные -- добавить в наш набор их будет полезно.
          
    $pattern '/<tr class="tlist" bgcolor="#......">[[:space:]]*<td>[[:space:]]*<a href=".*?">(.*?)<\/a>[[:space:]]*<\/td>[[:space:]]*<td align="right">(.*?)<\/td>[[:space:]]*<\/tr>/s';
          
    $ismatches preg_match_all($pattern$html$out); // Вытягиваем в соответствии с регулярным выражением $pattern все его вхождения в великую строку $html, результаты отправляем в многомерный ассоциированный массив $out. А возвращает функция истину, если хоть одно вхождение нашлось.
          
    if ($ismatches) { // Если нашлись слова, то вытаскиваем их из сложноустроенного массива и складываем в просто устроенный ассоциированный, вида $keywords['ключевик'] = кол-во запросов.
             
    foreach ($out[1] as $key => $value) {
                
    $value str_replace('+',''$value); // Заодно выбросим плюсики из ключевиков.
                
    $keywords[$value] = $out[2][$key]; // Кстати, индекс ассоциированного массива в виде ключевика гарантирует нам, что дублей ключевиков в массиве не будет.
             
    }
          }
          
    $pattern2 "/page=";
          
    $pattern2 .= $page+"&/s"// Новое регулярное выражение, с помощью которого мы будем выявлять, есть ли по заданному ключевику следующая страница выдачи.
          
    if(preg_match($pattern2,$html)) {
             
    $repeat true// Страница есть, будем повторять цикл парсинга, но уже для следующей страницы.
             
    sleep(rand()%3*3+2); // Но перед повторением немного покурим, чтобы Вордстат не принял нас за интенсивных ботов. В текущем варианте парсер будет тратить от 2 до 8 секунд на страницу выдачи. Уменьшайте аккуратно, дабы не схлопотать капчу.
             
    $page++; // Номер страницы выдачи меняем на следующий.
          
    } else {
             
    $repeat false// Нету следующей страницы, пора цикл завершать.
          
    }
       } while (
    $repeat && ($page $maxpage)); // Повторим цикл, если имеется следующая страница выдачи. А также если нам разрешено обрабатывать так много страниц (см. третий апарметр функции).
       
    arsort(&$keywords); // Отсортируем массив так, чтобы сначала шли ключевики с наибольшей частотой.
       
    return $page// А возвращает-то функция количество обработанных страниц выдачи.
    }
    $keywords = array(); // Создаём пустой массив. После вызова функции в него отправятся ключевики с их частотой.
    $pages yandexwordstat($_POST['keyword'], $keywords); // Вызываем функцию, передавая ей ключевик, прочитанный из текстового поля формы.
    if (count($keywords) > 0) { // Будем что-то стряпать для дальнейшего вывода только если в массив попали какие-то ключевики.
       // Соберём из кусочков таблицу о двух столбцах: Запросы и количество показов в месяц по данным Яндекса.
       
    $str '<table class="keywords"><tbody>'// Начало таблицы.
       
    $str .= '<tr class="header"><th>Поисковый запрос</th><th>Месячное количество запросов в Яндексе</th></tr>'// Шапка таблицы.
       
    $i 1// Порядковый номер генерируемой строки таблицы.
       
    foreach ($keywords as $key => $value) { // Разбираем на запчасти массив ключевиков и количества запросов.
          // Открывать строки таблицы мы будем тегами с разными атрибутами в зависимости от чётности строки.
          
    if ($i%== 0) { // Строчки с чётным номером я буду выводить с одним стилем. Класс even.
             // JavaScript поможет нам подсветить иным цветом ту строку таблицы, над которой завис курсор мыши. Для строк под указателем добавим css-класс current. Удобно.
             
    $str .= '<tr onmouseover="this.className=\'current even\';" onmouseout="this.className=\'even\';" class="even"><th>';      
          } else { 
    // А с нечётным  -- с другим стилем. Класс odd. Такую «зебру» зрительно воспринимать удобнее.
             
    $str .= '<tr onmouseover="this.className=\'current odd\';" onmouseout="this.className=\'odd\';" class="odd"><th>';      
          }
          
    $i++; // Следующая строка со следующим номером. Нас, впрочем, только его чётность будет волновать.
          
    $str .= $key// В первом столбце показываем ключевик.
          
    $str .= '</th><td>';
          
    $str .= $value// Во втором -- количество запросов.
          
    $str .= '</td>';
          
    $str .= '</tr>'// Закрываем строку таблицы.
       
    }
       
    $str .= '</tbody></table>'// Конец таблицы.
       
    $str .= '<p>Обработано страниц: '.$pages.'</p>'// Покажем, сколько страниц пришлось переварить нашему парсеру.
    } else {
       
    $str .= '<p>По указанному запросу никто и ничего в Яндексе не искал.</p>';
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    
        <title>Парсер статистики запросов Яндекса</title>
        <style>
          body {
             font-family: sans-serif;
             font-size: 12px;
          }
          table.keywords {
             border-collapse: collapse;
          }
          table.keywords th, table.keywords td {
             border: 1px solid #EE9900;
             padding: 6px;
             background-color: #FFCC33;
          }      
          table.keywords th {
             text-align: left;
          }
          tr.odd td, tr.odd th {
             background-color: #FFFFCC;
          }
          tr.even td, tr.even th {
             background-color: #FFFFEE;
          }
          tr.current td, tr.current th {
             background-color: #FFDD66;
          }      
        </style>
    </head>
    <body>
    <?php print $str?> <!--// Выводим то, что сгенерировал нам скрипт: таблицу, либо сообщение об отсутствии результатов. //--> 
    <form action="parser.php" method="post">
    <p>
       <strong>Запрос:</strong>
       <input name="keyword" type="text" value="<?php print $_POST['keyword']; ?>" />
       <input type="submit" />
    </p>
    </form>
    </body>
    </html>
    Источник: http://singlehomeless.ru/parser-na-php-vydachi-statistiki-zaprosov-yandeksa-wordstat/

     
    numan нравится это.
  2. tarkut

    tarkut

    Регистр.:
    26 авг 2008
    Сообщения:
    312
    Симпатии:
    69
    Суть скрипта я так и не понял. И почему нель зя использовать тот-же Магадан? Как он будет искать нч кеи?
    Интересно было бы увидеть следующий срипт:
    Парсер Прямого эфира яндекс(серверный)
    Сбор всех кеев и разбивка их на нч, сч, вч.
    Возможность определение тематики
    Для меня был бы интересен такой скрипт, я так думаю похожим собирается база Пастухова.
     
Статус темы:
Закрыта.