Интернет, компьютеры, софт и прочий Hi-Tech

Подписаться через RSS2Email.ru

Проверка robots.txt

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

Проверяемая страница:
Проверяемый бот:

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


Парсим robots.txt

Зачем это нужно? Допустим, что вы разместили ссылку или статью на сайте Васи Пупкина и хотите знать, не запретил ли хитрый Вася эту страницу для Яндекса в robots.txt? Можно, конечно, глазами посмотреть, но если покупаете статьи/ссылки большими партиями, то смотреть замучаетесь и захотите этот процесс автоматизировать. Тут-то и пригодится мой скрипт. Вот как с ним работать:

Сначала скачайте скрипт Xbb_RobotsTxt-0.0.0.zip. Затем распакуйте содержимое архива куда нибудь на ваш сервер. Зайдя через вебинтерфейс на файл index.php, вы можете проверить его работоспособность. После этого файл index.php можно удалить. Он ненужен для работы парсера.

Установив скрипт, можете использовать его в своем коде PHP. Использование, я думаю, понятно из следующего примера кода:

try { // Вдруг чего случится

    // Подключение класса для работы с robots.txt
    include_once 'ваш/путь/к/Xbb/RobotsTxt.php';

    // Инициализация объекта для robots.txt сайта http://вася.пупкин/
    $robotsTxt = new Xbb_RobotsTxt(
        'http://вася.пупкин/возможно/еще/какой-то?мусор=в&урле=неважно'
    );

    // Выведет: http://вася.пупкин/
    echo $robotsTxt->getSite();

    // Покажет массив со структурированными данными о директивах
    // из http://вася.пупкин/robots.txt
    var_dump ( $robotsTxt->getDirectives() );

    // Проверяем доступность страницы для заданного бота
    if ( $robotsTxt->allow('http://вася.пупкин/секретная/страница', 'Yandex') ) {
        echo 'Секретная страница Васи Пупкина РАЗРЕШЕНА для индексации Яндексом';
    } else {
        echo 'Секретная страница Васи Пупкина ЗАПРЕЩЕНА для индексации Яндексом';
    }

    // Еще одна проверка
    if ( $robotsTxt->allow('/продажная/страница', 'Google') ) {
        echo 'Продажная страница Васи Пупкина РАЗРЕШЕНА для индексации Гуглом';
    } else {
        echo 'Продажная страница Васи Пупкина ЗАПРЕЩЕНА для индексации Гуглом';
    }

} catch (Exception $e) {
    echo $e->getMessage(); // Чтобы знать ошибку
}

Надеюсь, что теперь ни для кого не секрет, как работать с этим парсером robots.txt Well Осталось только пояснить структуру архива, возвращаемого методом getDirectives(). Собственно, ничего сложного в нем нет, и с помощью var_dump вы можете сами в нем разобраться, но все-таки из академических соображений:

array
  'имя_бота' =>
    array                       - Список разобранных директив
      0 =>
        array                   - Название и значение директивы
          0 => string 'название_директивы'

          1 => string 'значение_директивы'
      1 => 
        array
          0 => string 'название_следующей_директивы'

          1 => string 'значение_следующей_директивы'
      ...
  'имя_следующего_бота' =>
    ...

где

  • 'имя_бота' может быть, например, '*', 'yandex' или 'google'. Всегда в нижнем регистре.
  • 'название_директивы' может быть, например, 'allow', 'disallow' или 'host'. Всегда в нижнем регистре. Директивы 'user-agent' в этих списках никогда не встречаются.
  • 'значение_директивы'. Для 'allow' или 'disallow' это, скорее всего, URL. Причем, если в реальном robots.txt этот URL не заканчивался на символ '$' или '*', то при парсинге к нему в конец обязательно будет приставлен '*', который и подразумевается в таких случаях синтаксисом robots.txt.

Можно в класс Xbb_RobotsTxt еще множество полезных свойств и методов напихать, но это уже сами Well Если что-то улучшите, сообщайте, - буду очень благодарен. Успешной работы!

27.01.2012


Рекомендуемые публикации:

Биржа долевых инвестиций SIMEX.

Метки материала: xbb, php, парсер, robots.txt, скрипт php, скрипт, скачать скрипт, поисковая оптимизация


25 комментариев

Последние десять комментариев:

21.02.2013 04:58:54 #
Mozilla Firefox dima
Спасибо за сообщение. В ближайшее время постараюсь найти время и разобраться с указанными Вами нюансами.
20.02.2013 15:39:39 #
Opera Гость BS
dima
06.11.2012 18:51:24 #
 
dima
Поэкспериментировал с этим здесь: http://webmaster.yandex.ru/robots.xml
 
В общем, в описанном вами случае Яндекс отдает предпочтение выражению Allow. Если поменять строчки местами, все равно выбирает Allow
Да, так и должно быть. А у Вас выберет disallow потому что он длиннее. Суть в том, что нужно к концу каждого правила приписывать "*", если там нет знака "*" или "$". Иначе возникает ошибка.
Ещё одна ошибка связана с allow.
PHP
        if (false === ($arUrl = @parse_url($url))) {
            $er = 'Невозможно распарсить проверяемый URL "' . $url . '"';
            throw new Exception($er);
        }
        if (! empty($arUrl['scheme']) && ! empty($arUrl['host'])  && $this->_site != $arUrl['scheme'] . '://' . $arUrl['host'] . '/') {
            $er = 'Проверяемый URL "' . $url . '" принадлежит другому домену';
            throw new Exception($er);
        }
               
        $path = empty($arUrl['path']) ? '/' : $arUrl['path'];

После этой строки надо добавить что-то вроде
PHP
if (isset($arUrl['query']) && !empty($arUrl['query']))
                {
                        $path .= "?{$arUrl['query']}";
                }
Иначе отбрасывается всё после "?" в url, а часто надо убрать что-нибудь из поиска. Типа disallow: /yasearch?=
Чтобы результаты поиска не кешировать.
06.11.2012 18:51:24 #
Mozilla Firefox dima
Поэкспериментировал с этим здесь: http://webmaster.yandex.ru/robots.xml
 
В общем, в описанном вами случае Яндекс отдает предпочтение выражению Allow. Если поменять строчки местами, все равно выбирает Allow.
06.11.2012 18:01:26 #
Opera Гость BS
Если верить яндексу http://help.yandex.ru/webma.../?id=996567
Яндекс
По умолчанию к концу каждого правила, описанного в robots.txt, приписывается '*', например:
То для парсера выражения должны быть идентичными.
Text
Disallow: /asdf*
Allow: /asdf
В то время, когда приоритет в данном случае отдаётся длинной строке.
Возможно я ошибаюсь.
07.09.2012 22:38:02 #
Opera Гость RubtsovAV
Заметил опечатку:
PHP
public function isUrlOwnSite($url){
         if (false === ($arUrl = @parse_url($url))) {
             return false;
         }
         return (! empty($arUrl['scheme']) && ! empty($arUrl['host'])  && $this->_site == $arUrl['scheme'] . '://' . $arUrl['host'] . '/');   
}
07.09.2012 21:40:22 #
Opera Гость RubtsovAV
Может такой вариант устроит?
PHP

    public function __construct($path, $initByUrl = false)
    {
        if (($arUrl = @parse_url($path)) || $initByUrl){
                if($arUrl === false){
                        throw new Exception('Невозможно распарсить URL "' . $path . '"');
                }
                if (empty($arUrl['scheme']) || empty($arUrl['host'])) {
                        $er = 'Введенный URL "' . $path . '" не содержит схемы и имени хоста';
                        throw new Exception($er);
                }
                $this->_site = $arUrl['scheme'] . '://' . $arUrl['host'] . '/';
                if($initByUrl) $path = $this->_site . 'robots.txt';
        }
    ...
    }
 
 

Только как быть с проверкой домена в allow(...)? Может в отдельный метод вынести?
PHP

function public function isUrlOwnSite($url){
        if (false === ($arUrl = @parse_url($url))) {
            return false;
        }
        return (! empty($arUrl['scheme']) && ! empty($arUrl['host'])  && $this->_site != $arUrl['scheme'] . '://' . $arUrl['host'] . '/');   
}
 

И тогда в allow можно будет обойтись одно регуляркой:
PHP
public function allow($url, $bot='*')
{
    $path = preg_replace('#^[a-z]*://[^/]+#','',$url);
    $path = trim($path);
    if(empty($path)) $path = '/';
...
}
 

Если подобные изменения не устраивают, то хотя бы в функции allow надо бы добавить query фрагмент ссылки:
PHP

$path = empty($arUrl['path']) ? '/' : $arUrl['path'];
if(!empty($arUrl['query'])) $path .= '?'.$arUrl['query'];
 
07.09.2012 20:34:56 #
Opera Гость RubtsovAV
И еще вариант добавить второй не обязательный аргумент для конструктора $initByUrl = false
07.09.2012 20:09:02 #
Opera Гость RubtsovAV
Еще вариант, можно конструктор сделать как initByFile($path), и просто добавить как отдельную функция initByUrl($url)
07.09.2012 20:07:29 #
Opera Гость RubtsovAV
Хм... Вариант. Могу реализовать.
07.09.2012 19:02:42 #
Mozilla Firefox dima
Насчет пути к файлу в качестве параметра конструктора Вы правы. Я вернул URL в конструктор только из соображений совместимости с предыдущими версиями. Кстати, о номерах версий. Когда нумерация версий не связана с маркетингом, я стараюсь придерживаться следующих правил:
  1. Багфиксы изменяют третье число номера версии. Ограничение на размер файла тоже считаю багфиксом (в плане безопасности).
  2. Дополнительная функциональность или ослабление лицензии изменяют второе число номера версии.
  3. Изменение функциональности, нарушающее обратную совместимость, или усиление лицензии изменяет первое число номера версии.
Согласно этим правилам, код который Вы мне прислали, тянет на номер 1.0.0 Well Но, к сожалению, изменения меня несколько не устроили. Как Вы относитесь к следующему решению вопроса:
  1. В конструктор передается строка - содержимое файла robots.txt;
  2. Метод
     
    PHP
    public static function initByFile($path)

    Инициализирует объект с помощью содержимого файла по заданному пути.
  3. Метод
     
    PHP
    public static function initByUrl($url)

    Инициализирует объект с помощью содержимого файла, соответствующего заданному URL.
Т.е. для любого случая был бы свой способ получения экземпляра класса. Ко всеобщему консенсусу. Тогда я поднял бы номер версии до 1.0.0.

Оставьте, пожалуйста, свой комментарий к публикации

Представиться как     Антибот:
   

Просьба не постить мусор. Если вы хотите потестить xBB, воспользуйтесь кнопкой предварительного просмотра на панели инструментов xBBEditor-а.


© 2007-2017, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.