Как узнать рейтинг своего сайта, не тратя лишнее время? Написать скрипт!

 | 18.11

Мой Компьютер, №1-2, 03.01.2008

Принцип работы

Итак, первое, что должен сделать скрипт, это узнать у пользователя, какой сайт его интересует и на какие ключевые слова он нацелен. Затем мы обращаемся к поисковой системе с запросом, передавая параметры, полученные от пользователя. Теперь начинается самый важный этап: мы получаем от поисковой системы HTML-страницу с результатами поиска. Эту страницу необходимо обработать регулярными выражениями и проанализировать на предмет присутствия ссылки на сайт, который был указан пользователем для скрипта. Если ссылка найдена, то вычисляется ее позиция, и цикл обработки прерывается, иначе переходим к следующей странице поисковой выдачи.

Для лучшего понимания анализа текста, который будет проводиться со страницей, желательно быть знакомым с регулярными выражениями. Советую скачать программу The Regex Coach, это значительно ускорит тесты и написание регулярных выражений под конкретные задачи.

Не существует универсального средства для обработки страниц всех поисковых систем. Потому что все эти страницы разные и строятся они тоже по-разному. Так что каждый поисковик будет обрабатываться индивидуально. Все популярные поисковые системы мы здесь не будем рассматривать, я выбрал только две, для демонстрации работы скрипта. Это поисковая система Рамблер (rambler.ru) и наш украинский поисковик Мета (meta.ua).

Примечание редактора: приведенный код, несомненно, работает, так как запустился во время верстки онлайн версии статьи

Общая часть

Перед тем как работать с каждой из поисковой систем, напишем общую часть, которая будет одинаковой вне зависимости от каких-либо действий. Создайте PHP-файл, сначала там будет обычный HTML-код:

  • <html>
  • <head>
  • <title>PoSearch</title>
  • </head>
  • <body>
  • <center>
  • <form action=»» method=GET>
  • <table border=0 align=center>
  • <tr>
  • <td>Ключевые слова:</td>
  • <td><input type=text name=user_words size=50 value=»<?=isset($_GET[‘user_words’])?$_GET[‘user_words’]:’’;?>»></td>
  • </tr>
  • <tr align=right>
  • <td>http://</td>
  • <td><input type=text name=user_site size=50 value=»<?=isset($_GET[‘user_site’])?$_GET[‘user_site’]:’’;?>»></td>
  • </tr>
  • <tr>
  • <td align=right><input type=checkbox name=rambler <?=isset($_GET[‘rambler’])?’checked’:’’;?>></td>
  • <td> Rambler</td>
  • </tr>
  • <tr>
  • <td align=right><input type=checkbox name=meta <?=isset($_GET[‘meta’])?’checked’:’’;?>></td><td> Meta</td>
  • /tr>
  • </table><p>
  • <input type=»submit» value=»Определить позицию»>
  • </form>
  • </center>
  • <p>

Это обычная форма, которую я даже не стал включать в PHP-код. Вставки PHP в этом фрагменте служат только для заполнения полей и установки флагов, если они были уже заполнены пользователем ранее. Форму можно увидеть на здесь.

Как видите, от пользователя требуется немного: указать ключевые слова, адрес сайта и поставить галочки напротив поисковиков, результаты которых ему нужно вывести.

Дальше идет исключительно PHP-код, ну, и еще немного общей части:

<?

if (!empty($_GET[‘user_words’]) && !empty($_GET[‘user_site’]))

{

$user_site = ‘http://’.$_GET[‘user_site’];

$user_site2 = ‘http://www.’.$_GET[‘user_site’];

 

$user_words = urlencode($_GET[‘user_words’]);

Здесь происходит проверка на то, какие параметры мы получаем. Записываем это все в удобном для себя виде и готовимся к работе. Ключевые слова мы обрабатываем функцией urlencode(). Делается это для того, чтобы символы кириллицы переводились в hex-код, разделялись знаком процента, а вместо пробела ставился знак +.

Meta

Начнем с нашего украинского поисковика. Перед тем как писать код нам нужно вычислить регулярное выражение, которое берет из него позицию и ссылку на сайт. Для этого зайдем на сайт поисковой системы и введем там какое-то слово для поиска, например, ukraine.

Теперь откройте страницу в виде HTML и найдите участки, которые описывают пункты поисковой выдачи. Найти соответствующие участки в коде можно с помощью текста или ссылок, которые находятся на странице. Если вы пользуетесь браузером Firefox, то вам достаточно выделить участок страницы и выбрать в контекстном меню пункт Просмотр исходного кода выделенного фрагмента. Я выделил из HTML-кода только второй пункт поисковой выдачи. Давайте попробуем его проанализировать:

<li class=rs id=»1″><div class=rtitle ><a href=»/go.asp?http://www.kiev-ukraine-hotels.com/links/» target=_blank> Kiev <b>Ukraine</b> Hotels — Kiev hotels and apartments</a></div><div class=’rquote’>&hellip; interested to add your site to Worldwide Travel Directory please click here. Kiev <b>Ukraine</b> Hotels Expert Picks Finest Apartments <b>Ukraine</b>- the way to enjoy <b>Ukraine</b> Kiev Apartment Service- selection &hellip;</div>

<div class=rur><span class=’rurl’>www.kiev-ukraine-hotels.com/links/</span> &nbsp;<a class=’rest’ target=’_blank’ href=’/getpage.asp?q=ukraine&docid=168312879’>текст документа</a> &nbsp;<a class=’rest’ href=’/search.asp?q=ukraine&o=doc&url=kiev-ukraine-hotels.com’ class=’rcount’>всего на сайте 99 &raquo;</a><div><span><a href=/rj.asp?http://kiev-ukraine-hotels.com target=_blank>Служба Kiev Romantic Apartments</a> </span> &nbsp; <span>Рубрика: <a href=’http://dir.meta.ua/topics/travels/hotels’>Гостиницы</a></span> &nbsp; <span>Регион: Киев</span></div></div></li>

Среди множества информации по описанию сайта и тэгов стилей нас интересует только верхняя часть. Обратите внимание на тэг нумерации <li> — к счастью, в нем есть параметр id, в котором указан его порядковый номер. Здесь это написано в самом начале:

<li class=rs id=»1″>

Так как нумерация начинается с нуля, то у второго пункта значение id равно 1. Позицию мы знаем, теперь нужно найти, где указывается ссылка на сайт. Это легко сделать, посмотрев соответствие ссылок на странице и в коде. Здесь ссылка не прямая, а через переадресацию:

<a href=»/go.asp?http://www.kiev-ukraine-hotels.com/links/» target=_blank>

Сама ссылка идет на скрипт go.asp, который осуществляет переадресацию на указанный сайт. Таким образом, нужно из этой строки извлечь именно адрес сайта, без скрипта переадресации.

Теперь, когда мы убрали все лишнее, осталась только строка:

<li class=rs id=»1″><div class=rtitle ><a href=»/go.asp?http://www.kiev-ukraine-hotels.com/links/» target=_blank>

Из этой строки нам нужно выделить позицию (1) и адрес сайта (www.kiev-ukraine-hotels.com). Регулярное выражение, которое реализует нашу задумку:

<li[a-zs=]*»([0-9])»[^?]+?(http://[^s’»/]+)

Рассмотрим весь участок кода, предназначенного для сайта meta.ua:

//проверка, указал ли пользователь этот поисковик

if (!empty($_GET[‘meta’]))

/* смотрим первые 15 страниц */

for($i=1;$i<=15;$i++)

{

 

/* получаем содержимое текущей страницы */

   $meta_site = file_get_contents(‘http://meta.ua/search.asp?q=’.$user_words.’&pg=’.$i);

/* шаблон поиска */

   $pattern = ‘|<li[a-zs=]*»([0-9])»[^?]+?(http://[^s’»/]+)|’;

   preg_match_all($pattern, $meta_site, $meta_result);

 

/* массив позиций */

   $positions = $meta_result[1];

/* массив сайтов поисковой выдачи */

   $sites = $meta_result[2];

 

/* обход всех сайтов */

   foreach($sites as $key=>$value)

   {

/* проверка, входит ли пользовательский сайт в список */

       if ($value == $user_site || $value == $user_site2)

       {

/* узнаем позицию сайта */

           $meta_position = $positions[$key+1] + ( $i * 10 — 10);

 

/* прерываем поиск */

           break(2);

       }

   }

}

Поиск занимает немалое количество времени, именно по этой причине мы берем только первые 15 страниц поисковой выдачи. В цикле мы получаем содержимое каждой страницы поисковой выдачи. С помощью регулярного выражения мы получаем массив позиций и массив ссылок на сайты. Затем достаточно произвести элементарный обход массива и посмотреть, есть ли там соответствия ссылке, которую указал пользователь. Если ссылка найдена, то прерываем поиск и вычисляем номер позиции, где расположен указанный сайт. Если ссылка пользователя не найдена, то переходим к следующей странице поисковой выдачи.

Rambler

В этой поисковой системе устроено все немного по-другому. Так что придется переписать и цикл, и регулярное выражение, а также заново провести анализ HTML-кода. Первое, что мы сделаем, это посмотрим на тот участок HTML-кода, который представляет отдельный пункт. Попробуем ввести в поиск все тот же тестовый запрос — ukraine.

Для примера возьмем второй пункт — не буду приводить полностью весь код, сразу выделю нужный участок из этого пункта:

<li><div class=»ttl»><a onclick=»R(this, ‘&ty=srchres2&lnk=numbler_4_2’)» href=»http://www.ukrindustrial.com/» target=_blank>

Адрес сайта указан напрямую, это http://www.ukrindustrial.com. Позиция сайта передается параметром ty и равняется srchres2. Последнее число после слова srchres и является позицией сайта. Регулярное выражение и код обработки страницы представлены ниже:

if (!empty($_GET[‘rambler’]))

/* цикл обхода по 15 сайтов */

for($i=1;$i<=225;$i+=15)

{

/* содержимое текущей страницы */

   $rambler_site = file_get_contents(‘http://www.rambler.ru/srch?oe=1251&words=’.$user_words.’&start=’.$i);

/* регулярное выражение */

   $pattern=‘|’&ty=srchres([0-9]+)&lnk=numbler[_0-9]+’)»shref=»(http://[^s’»/]{4,})|’;

   preg_match_all($pattern, $rambler_site, $rambler_result);

/* получение массивов позиций и ссылок */

   $positions = $rambler_result[1];

   $sites = $rambler_result[2];

/* проверка на присутствие сайта в поисковой выдаче */

   foreach($sites as $key=>$value)

   {

       if ($value == $user_site || $value == $user_site2)

       {

           $rambler_position = $positions[$key];

           break(2);

       }

   }

}

Этот код подобен тому, который был написан для meta.ua, но на самом деле переписан каждый из этапов: цикл, регулярное выражение и проверка на соответствие с вычислением позиции. В Рамблере нету указания страницы, вместо этого указывается номер позиции, с которой следует начинать вывод результата. Из-за различий в HTML-коде регулярное выражение также приняло совершенно другой вид. В отличие от предыдущего примера, позиция сайта всегда указывает не на абсолютный номер, а на относительный.

Выдача результата

Теперь нам остается только показать номера позиций в поисковых системах, которые пометил пользователь. Код выдачи результата:

if (!empty($_GET[‘rambler’]))

{

 echo ‘Позиция в Рамблере: ‘;

 if (!empty($rambler_position))

      echo ‘<b>’.$rambler_position.’</b>’;

 else

      echo ‘не определена’;

      echo ‘<br />’;

}

if (!empty($_GET[‘meta’]))

{

 echo ‘Позиция на Мете: ‘;

 

 if (!empty($meta_position))

      echo ‘<b>’.$meta_position.’</b>’;

 else

      echo ‘не определена’;

}

}

?>

Здесь происходит проверка: если пользователь указал поиск в текущей поисковой системе, и позиция сайта определена в ней, то показываем эту позицию. Если позиция не была найдена, то сообщаем о том, что определить значение не удалось.

Заключение

Некоторые хотели бы увидеть здесь свои излюбленные поисковые системы — Яндекс, Google, BigMir, Aport или какие-то другие. Все это просто не влезло бы в одну статью. Для примера я взял две абсолютно разные поисковые системы. Как видите, несмотря на некоторые различия реализации, принцип работы остается тем же. Так что вы сами сможете проделать подобные нехитрые действия применительно к любой поисковой системе, которая вас интересует.

Сергей ПАРИЖСКИЙ

Robo User
Web-droid editor

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

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