Пишем инструмент для проверки наличия ссылок

Многие из вас наверняка используют для продвижения своих проектов, такую популярную вещь как покупка ссылок и статей «навсегда». Этот метод имеет очень много плюсов и, в долгосрочной перспективе, несомненно, выгоден. Но у него есть один большой недостаток — ваша честно купленная ссылка может в один прекрасный день быть просто снята, разместившим её вебмастером. Что же делать? Ответ очевиден — нам необходимо средство контроля размещения ссылок.

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

Давайте не будем оригинальничать и в качестве средства разработки выберем все тот же старый, добрый PHP. Итак, с чего начнем? Предлагаю для начала обсудить алгоритм работы скрипта. Что же он должен делать? А ничего особенного: проверить наличие данной ему ссылки на всех страницах, которые мы ему предложим, сигнализируя нам, если вдруг на какой-то из страниц, вдруг её не окажется. А если её там не окажется, то что? Правильно, значит недобросоветсный вебмастер коварно снял её и должен понести за это суровое, но весьма справедливое наказание :)

Начнем с разработки интерфейса. Не стоит изображать из себя Артемия Лебедева и пытаться сделать все красиво — это же обычный инструмент, от которого требуется только стабильная и корректная работа. Поэтому создадим файлик checker.php и впишем в него следующее содержимое, которое создаст нам форму и отрисует элементы управления:

<form action='checker.php' method='POST'>
<p>URL для поиска:<br/><input type='text' value='' name='url' /></p>
<p>Проверяемые адреса:<br/><textarea name='sites' rows='10' cols='80'></textarea></p>
<p><input type='submit' value='Начать проверку' name='go' /></p>
</form>

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

1.jpg

Принцип работы прост: вводим в верхнее поле URL, наличие которого мы будем проверять, а в нижнее — список URL, на которых мы покупали ссылки или статьи. Далее, нажимаем «Начать проверку» и скрипт пробегаясь по каждому URL из списка, пытается отыскать там нашу ссылку. Если это ему удается, то он выводит [OK], если нет — [NOT FOUND].

Двигаемся дальше. Под кодом формы добавляем следующий код.

if (isset($_POST) and !empty($_POST['url']))
{
if ($_POST['url']{strlen($_POST['url'])-1}!=="/")
$_POST['url'] .= "/"; // если адрес не оканчивается на слеш, то дописываем его в конец, тем самым унифицируя адрес

$_POST['url'] = str_replace("/", "\/", $_POST['url']); // экранируем слеши в адресе для последующей подстановки в строку

$sites = explode("\n", $_POST['sites']); // разбиваем текст из "Проверяемых адресов" на отдельные URL и загоняем их в массив

foreach ($sites as $site) // начинаем пробегаться по всему массиву проверяемых URL'ов
if (!empty($site))
{
// здесь будем скачивать страницу и проверять на ней искомый URL
}
}

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

if (!empty($site))
{
// здесь будем скачивать страницу и проверять на ней искомый URL
}

Вот, собственно, код, который нужно вставить

$ch = curl_init (); // инициализация
curl_setopt ($ch , CURLOPT_URL , $site); // адрес страницы для проверки
curl_setopt ($ch , CURLOPT_USERAGENT , "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.12) Gecko/20050919 Firefox/1.0.7"); // каким браузером будем прикидываться
curl_setopt ($ch , CURLOPT_RETURNTRANSFER , 1 ); // нам нужно вывести загруженную страницу в переменную
$content = curl_exec($ch); // скачиваем страницу
curl_close($ch); // закрываем соединение

if(preg_match_all(«/<a.+href=(\»|’)».$_POST[‘url’].»?(\»|’).+>.*<\/a>/isU», $content, $matches)) // ищем ссылку с нашим URL
echo «[OK] $site<br/>»; // найдена
else
echo «[NOT FOUND] $site<br/>»; // не найдена

flush(); // сразу выводим результат на экран, не дожидаясь окончания работы скрипта

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

2.jpg

Вот такие результаты мы получили. В принципе все верно, но как всегда есть одно «но». Дело в том, что я точно знаю, что на уканной для проверки статьи на блоге shakin.ru точно присутствует ссылка на блог maksis.ru! В чем же дело? Все просто — дело в том, что Михаил Шакин, когда составлял эту статью, сослался не на главную страницу блога WestSEO, а на одну из его статей, поэтому наш тестер и подумал, что ссылки нет.

Можно, конечно, оставить все как есть, предположив, что этот чекер нам нужен для проверки точных адресов, но я, все же, предлагаю его немного доработать, добавив пару строчек кода. И очень желательно сделать проверку точного соответствия адреса опциональной, чтобы инструмент был гибче. Поэтому давайте добавим небольшой переключатель в код формы, как раз после контрола textarea.

<p><label><input type='checkbox' value='' name='deep_search' /> искать дочерние URL сайта</label></p>

Так, с интерфейсом разобрались. Теперь перейдем к части кода, ответственной непосредственно за работу скрипта. Для корректного поиска ссылок на внутренние страницы нашего домена, нам необходимо изменить регулярное выражение, снабдив его, заодно, условием, которое будет обрабатывать положение переключателя «искать дочерние URL сайта». Для этого заменим вот этот участок кода:

if(preg_match_all("/<a.+href=(\"|')".$_POST['url']."?(\"|').+>.*<\/a>/isU", $content, $matches)) // ищем ссылку с нашим URL

на этот:

if (isset($_POST[‘deep_search’]))
$regex_str = «/<a.+href=(\»|’)».$_POST[‘url’].».+(\»|’).+>.*<\/a>/isU»; // если галочка установлена — ищем как ссылки на главную, так и ссылки на внутренние страницы
else
$regex_str = «/<a.+href=(\»|’)».$_POST[‘url’].»?(\»|’).+>.*<\/a>/isU»; // в противном случае — только на главную.

if(preg_match_all($regex_str, $content, $matches)) // ищем ссылку с нашим URL

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

3.jpg

В принципе, скрипт закончен, но остается еще одна маленькая деталь, которая режет глаз — при нажатии кнопки «Начать проверку» и, как следствие, перезагрузки страницы, из формы начисто пропадает все её содержимое! Давайте поправим это, заменив следующий участок кода:

<form action='checker.php' method='POST'>
<p>URL для поиска:<br/><input type='text' value='' name='url' /></p>
<p>Проверяемые адреса:<br/><textarea name='sites' rows='10' cols='80'></textarea></p>
<p><label><input type='checkbox' value='' name='deep_search' /> искать дочерние URL сайта</label></p>
<p><input type='submit' value='Начать проверку' name='go' /></p>
</form>

на этот:

<form action='checker.php' method='POST'>
<p>URL для поиска:<br/><input type='text' value='<?=isset($_POST['url'])?$_POST['url']:''?>' name='url' /></p>
<p>Проверяемые адреса:<br/><textarea name='sites' rows='10' cols='80'><?=isset($_POST['sites'])?$_POST['sites']:''?></textarea></p>
<p><label><input type='checkbox' value='' name='deep_search' <?=isset($_POST['deep_search'])?'checked':''?>/> искать дочерние URL сайта</label></p>
<p><input type='submit' value='Начать проверку' name='go' /></p>
</form>

Вот теперь все, скрипт доведен до логического конца и им можно пользоваться, проверяя длинные списки URL’ов с купленными ссылками и выявляя недобросовестных вебмастеров:) Решение отлично работает даже на блогах со сложной структурой, типа блога Wildo.

Полный текст скрипта:

<form action='checker.php' method='POST'>
<p>URL для поиска:<br/><input type='text' value='<?=isset($_POST['url'])?$_POST['url']:''?>' name='url' /></p>
<p>Проверяемые адреса:<br/><textarea name='sites' rows='10' cols='80'><?=isset($_POST['sites'])?$_POST['sites']:''?></textarea></p>
<p><label><input type='checkbox' value='' name='deep_search' <?=isset($_POST['deep_search'])?'checked':''?>/> искать дочерние URL сайта</label></p>
<p><input type='submit' value='Начать проверку' name='go' /></p>
</form>
<?
if (isset($_POST) and !empty($_POST['url']))
{
if ($_POST['url']{strlen($_POST['url'])-1}!=="/")
$_POST['url'] .= "/";

$_POST['url'] = str_replace("/", "\/", $_POST['url']);

$sites = explode("\n", $_POST['sites']);

foreach ($sites as $site)
if (!empty($site))
{
$ch = curl_init (); // инициализация
curl_setopt ($ch , CURLOPT_URL , $site); // адрес страницы для проверки
curl_setopt ($ch , CURLOPT_USERAGENT , "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.12) Gecko/20050919 Firefox/1.0.7"); // каким браузером будем прикидываться
curl_setopt ($ch , CURLOPT_RETURNTRANSFER , 1 ); // нам нужно вывести загруженную страницу в переменную
$content = curl_exec($ch); // скачиваем страницу
curl_close($ch); // закрываем соединение

if (isset($_POST['deep_search']))
$regex_str = "/<a.+href=(\"|')".$_POST['url'].".+(\"|').+>.*<\/a>/isU"; // если галочка установлена - ищем как ссылки на главную, так и ссылки на внутренние страницы
else
$regex_str = "/<a.+href=(\"|')".$_POST['url']."?(\"|').+>.*<\/a>/isU"; // в противном случае - только на главную.

if(preg_match_all($regex_str, $content, $matches)) // ищем ссылку с нашим URL
echo "[OK] $site<br/>"; // найдена
else
echo "[NOT FOUND] $site<br/>"; // не найдена

flush(); // сразу выводим результат на экран, не дожидаясь окончания работы скрипта
}
}
?>

Заключение и дальнейшая доработка

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

  • Запоминание введенной информации полях формы (например, используя cookies);
  • Синхронизация базы ссылок, купленных в Блогуне или GoGetLinks;
  • Возможность создания нескольких кампаний для проверки;
  • Опция поиска домена с www и без;
  • Опция контроля наличия слеша в конце адреса;
  • Возможность поиска ссылок-картинок;
  • Проверка страницы на наличие (это может быть необходимо при покупке статей — нехороший вебмастер может не только удалить ссылку из статьи, а вообще снести статью целиком);
  • Проверка на видимость существующей ссылки (вебмасте мог впоследствии изменить цвет ссылки цвет фона или скрыть её);

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

Удачной работы!

Оставьте первый комментарий

Оставить комментарий

Ваш электронный адрес не будет опубликован.


*


девятнадцать + два =