добавить
ссылку в
Email
Fb
подписка
RSS
Twitter
Email
Fb

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

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

Не спешите бежать на биржу фрилансеров и искать и исполнителя, ведь написание этого скрипта — не такое сложное дело как кажется на первый взгляд. Постоянные читатели журнала наверняка помнят, что в одной из статей мы подробно разбирали процесс написания простого парсера на 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>
multitoolbox syntax highlighter

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

Интерфейст будущего тестера

Принцип работы прост: вводим в верхнее поле 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
        }
}
multitoolbox syntax highlighter

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

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

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

$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(); // сразу выводим результат на экран, не дожидаясь окончания работы скрипта
multitoolbox syntax highlighter

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

Первый запуск

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

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

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

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

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

на этот:

f (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
multitoolbox syntax highlighter

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

Финальное тестирование проверяльщика ссылок

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

<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>
multitoolbox syntax highlighter

на этот:

<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>
multitoolbox syntax highlighter

Вот теперь все, скрипт доведен до логического конца и им можно пользоваться, проверяя длинные списки 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(); // сразу выводим результат на экран, не дожидаясь окончания работы скрипта
        }
}
?>
multitoolbox syntax highlighter

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

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

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

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

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

Если если вам понравилась эта статья, вы можете подписаться на материалы моего блога через rssRSS или emailemail, а также присоединиться ко мне в twitterTwitter или vkontakteВКонтакте.

Похожее видео
Похожие статьи
* эксперт · Дата 30 июля 2010 г. · seo  php   
RSS подписка Комментарии (16 штук)
Gravatar 1st_MAN 30 июля 2010 г. в 01:43 #
круто конечно, но:
1. курл работает далеко не везде. неплохо было бы вариант с file_get_contents рассмотреть или наподобие
2. самое гланвое забыл — проверка на ноиндекс и нофоллоу

остальное действительно по желанию, а вот эти 2 вещи надо бязательно, ибо например на денвере нет курла по дефолту, а я бы юзал сей скрипт именно с денвера.


а вообще хорошоий простой скрипт =)
Gravatar Алексей Московский 30 июля 2010 г. в 11:40 #
CURL должен стоять на каждом сервере, file_get_contents не очень мощен и в более сложных задачах неюзабелен, поэтому смыслы привыкать к нему и тем более приучивать новичков я не вижу.
А вот с ноиндекс/нофоллоу — абсолютно здравая идея, спасибо!
Gravatar Aronsky 30 июля 2010 г. в 12:04 #
Хорошая статья, на её примере хорошо можно понять работу Curl.
Gravatar Blaster 30 июля 2010 г. в 12:52 #
А я обычно использую Snoopy — это такой класс PHP для упрощения работы с CURL. Заметил, что ссылки из RSS-ленты не работают, нужно поправить…
Gravatar Алексей Московский 30 июля 2010 г. в 12:57 #
Спасибо за дополнение и багрепорт — поправим!
Gravatar 1st_MAN 31 июля 2010 г. в 03:45 #
и всетаки курл стоит не везде, в первую очередь его нету в денвере)

но наверное вы правы, надо юзать его.

жду версию с ноиндекс =)
Gravatar Островитянин 2 августа 2010 г. в 17:50 #
1st_MAN, насчет file_get_contents вы не правы, так как большинство хостеров закрывают возможность использовать ее на удаленных сетевых ресурсах, в целях безопасности, если я правильно помню это официальная рекомендация разработчиков. Таких хостеров очень много, а вот хостеров у которых бы не был установлен curl я лет 5 если не больше не видел.
Gravatar Островитянин 2 августа 2010 г. в 17:54 #
>в первую очередь его нету в денвере)
:D насмешили.
1. Денвер это не хостинг.
2. В денвере он есть в дополнениях, все что нужно сделать скачать дополнения, установить их и разкомментировать одну строку в файле php.ini
Gravatar leo 17 августа 2010 г. в 11:36 #
Зачем изобретать велосипед? hilog.ru — инструмент для проверки статей, баннеров, ссылок на конкретном сайте. Добавляем туда адрес страницы, текст, который нужно проверять и все, каждый день ваша ссылка/статья/баннер будет проверяться. Бесплатно
Gravatar Алексей Московский 17 августа 2010 г. в 12:31 #
leo, главная цель этой статьи — обучение созданию инструментов для себя.
Gravatar deniel 18 августа 2010 г. в 16:59 #
Очень полезный скрипт!но оказалось он неумеет парсить ссылки с доменов 4-го уровня.(а для меня это очень важно!)Автор ПОЖАЛУЙСТА!зделай что небудь с ним или подскажи в какой стороне копать.Просто он экономит мне очень много времени, но этот маленький недостаток делает его не пригодным(для меня).Заранее спасибо.
Gravatar Алексей Московский 18 августа 2010 г. в 17:11 #
deniel, это, в основном, учебный скрипт. Для ежедневного применения попробуй hilog.ru
Gravatar deniel 18 августа 2010 г. в 17:11 #
Ссори за клевету) проблема оказалась не в уровне домена а в размере страници.Опытным путем установил что страници размером более 90 KB не проверяет.
Gravatar alla 6 октября 2010 г. в 12:40 #
много сайтов, которые выдают 400 ошибку.
Gravatar Дарья 20 декабря 2011 г. в 16:24 #
Вообще что-то не заходит на hilog.ru. А этот сайт вообще рабочий? или проблемы где-то у меня с инетом?
Gravatar Forbidden 4 марта 2012 г. в 16:41 #
Не учтено несколько факторов.
1)Заходить проверять нужно желательно под видом поисковиков (CURLOPT_USERAGENT) — так как ссылки эти могут быть скрыты от ПС.
2)Нет проверки robots.txt