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

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

Проверка robots.txt

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

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


Парсим robots.txt

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

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

Публикация сокращена для удобства обсуждения.
Полная версия: Парсер для robots.txt

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


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

05.09.2012 17:21:00 #
Opera Гость RubtsovAV
Отправил.
06.09.2012 21:23:21 #
Mozilla Firefox dima
Огромное спасибо. Потестировал и собрал новую версию библиотеки - 0.1.1 со следующими багфиксами:
 
1. Исправлена обработка пустых директив Allow и Disallow.
2. Исправлена обработка полностью или частично совпадающих директив Allow и Disallow.
 
Кроме того, добавлено ограничение на размер обрабатываемого файла - 32КБ.
 
Новая версия доступна для скачивания со страницы http://xbb.uz/download.bb
 
Человек, благодаря которому новая версия увидела свет, - Александр Рубцов. Страна должна знать своих героев Well
07.09.2012 16:42:12 #
Opera Гость RubtsovAV
Пасиб Well Думал, что уже до 0.2 дотягивает, но автору виднее ;)
07.09.2012 17:14:29 #
Opera Гость RubtsovAV
Спасибо, что поправили мои грабли с размером файла, как то забыл совсем про file_get_contents. Жаль всё же, что локальные файлы исключены. Думаю всё же было бы логично передавать в конструктор путь к robots файлу, а просто любую ссылку из которой уже вырезается домен. Но это уже не сложно исправить. Всё равно спасибо!
07.09.2012 17:16:15 #
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.
07.09.2012 20:07:29 #
Opera Гость RubtsovAV
Хм... Вариант. Могу реализовать.
07.09.2012 20:09:02 #
Opera Гость RubtsovAV
Еще вариант, можно конструктор сделать как initByFile($path), и просто добавить как отдельную функция initByUrl($url)
07.09.2012 20:34:56 #
Opera Гость RubtsovAV
И еще вариант добавить второй не обязательный аргумент для конструктора $initByUrl = false
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'];
 

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

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

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


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