Как узнать рейтинг своего сайта, не тратя лишнее время? Написать скрипт!
18.08.08Мой Компьютер, №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’>… 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 …</div> <div class=rur><span class=’rurl’>www.kiev-ukraine-hotels.com/links/</span> <a class=’rest’ target=’_blank’ href=’/getpage.asp?q=ukraine&docid=168312879’>текст документа</a> <a class=’rest’ href=’/search.asp?q=ukraine&o=doc&url=kiev-ukraine-hotels.com’ class=’rcount’>всего на сайте 99 »</a><div><span><a href=/rj.asp?http://kiev-ukraine-hotels.com target=_blank>Служба Kiev Romantic Apartments</a> </span> <span>Рубрика: <a href=’http://dir.meta.ua/topics/travels/hotels’>Гостиницы</a></span> <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 или какие-то другие. Все это просто не влезло бы в одну статью. Для примера я взял две абсолютно разные поисковые системы. Как видите, несмотря на некоторые различия реализации, принцип работы остается тем же. Так что вы сами сможете проделать подобные нехитрые действия применительно к любой поисковой системе, которая вас интересует.
Сергей ПАРИЖСКИЙ
Web-droid редактор
Не пропустите интересное!
Підписывайтесь на наши каналы и читайте анонсы хай-тек новостей, тестов и обзоров в удобном формате!
Обзор смартфона Oppo A40m (CPH2669): начало
Смартфон Oppo A40m приятно удивляет дизайном и набором некоторых компонентов, которые делают из него модель уверенного нижнего среднего класса. Разберемся в деталях
Lenovo на CES 2025: ноутбук с двумя экранами Yoga Book 9i и планшет Yoga Tab Plus на процессоре Snapdragon 8 Gen 3 CES Lenovo ноутбук планшет
Презентация Lenovo на выставке CES 2025 была довольно обширной. В этой новости расскажем двухэкранных ноутбук и планшет на чипе Qualcomm Snapdragon 8 Gen 3.
Ноутбуки Gigabyte Aorus Master, Aero и Gaming с графикой GeForce RTX 50-й серии получили нового ИИ-ассистента компании GeForce RTX Gigabyte искусственный интеллект ноутбук
Компания Gigabyte Technology продемонстрировала обновленную линейку ноутбуков на выставке CES 2025. Среди новинок — игровые и производственные устройства серий Aorus Master, Aero и Gaming