RTFM! статьи, советы, скрипты
::Заработок с помощью сайта ::JScript по-русски! ::Все русские мануалы::
МЕНЮ
О САЙТЕ
НОВОСТИ
СТАТЬИ
КНИГИ
АППЛЕТЫ
СВЯЗЬ

СЧЕТЧИКИ
Rambler's Top100
Рейтинг@Mail.ru
Яндекс цитирования

Создание индекса для сайта

Автор: Анисимов Михаил Сайт: http://mih.da.ru     Рейтинг: N/A из 7       <<НАЗАД
   
   
   Вы, может, знаете, что HTML разрешает вставлять META-тэги в заголовок документа. Тогда вы, я просто уверен, знаете для чего они нужны. Кто не в курсе - кратенько поясню: Существуют поисковые сервера, которые ползают по зарегистрировавшимся в их базе сайтах и индексируют странички. При этом они обращают пристальное внимание на МЕТА-тэги, а особенно на keywords и description (<ключевые слова> и <описание>).
   
   Синтаксис этих двух МЕТА-тэгов выглядит так:
   
   <meta name=description content="CGI&Perl - Документация и скрипты">
   <meta name=keywords content="perl cgi documentation scripts скрипты документация перл">
   
   Ключевые слова также могут быть разделены запятой.
   
   Ну а теперь непосредственно о скрипте. Скрипт осматривает все странички сайта на предмет meta description и meta keywords и составляет итоговую таблицу - индекс, или предметный указатель.
   
   Строки 1-3: Обычное начало программы.
   
   5-26: Часть скрипта, которую нужно сконфигурировать под свои нужды.
   
   7: Список URLов, которые необходимо проиндексировать. Но если все страницы сайта связаны гиперссылками - то необходима лишь один URL.
   
   9-24: Определение процедуры OK_TO_FOLLOW. Принимает URI-объект (http), возвращает единицу, если эту ссылку надо сканировать и нуль, если не надо.
   
   11-13: Необходимо, чтобы скрипт не выходил за пределы сайта.
   
   14-16: Не нужно также запускать никакие CGI-скрипты
   
   17-22: Убираем из процесса индексации картинки и другие не-HTML файлы.
   
   Отметьте небольшую хитрость: цикл for здесь вовсе не цикл, он нужен лишь для того, чтобы переменная $_ равнялась тому, что внутри скобок for ()
   
   23: Передано то, что необходимо проиндексировать - вернем единицу.
   
   28-31: Подключаем модули: CGI::Pretty - стандартный, LWP::UserAgent, HTML:Entities, WWW::Robot - входят в библиотеку LWP.
   
   33-35: Определение глобальных переменных. %description - хэш, ключами которого являются URLы, а значениями - описания (meta description). %keywords - URL- >ключевые слова (keywords). %keywords_caps содержит регистр (верхний или нижний) написания ключевого слова.
   
   37-45: Настройки индексатора. За подробностями обратитесь к документации по WWW::Robot. Здесь же устанавливаем, что индексатор идентифицирует себя как MetaBot, версии 0.15, ну и e-mail адрес. USERAGENT - будет LWP::UserAgent, отключена проверка MIME-типов.
   
   47: Включает проверку конфигурации прокси-сервера, вобщем-то это и не нужно. 49-54: Одна из двух callback-функций, которую вызывает WWW::Robot. Как только найден URL, вызывается follow-url-test callback. Здесь вызываем функцию OK_TO_FOLLOW, чтобы отсеять лишнее.
   
   55-76: Вытаскиваем информацию с каждой странички.
   
   58-61: Нам нужны только keywords и description
   
   63-67: Сохраним описание, предварительно очистив его от переносов строк и символов табуляции, заменив их на пробелы.
   
   68-75: Запомним ключевые слова и их регистр. В данном скрипте предполагается, что слова разделены запятыми. Можно разделителями сделать пробелы, заменив split(/,/,... на split (/ /, ... Или и пробелы и запятые - split (/[, ]/,...
   
   77: Запуск индексации. Для большого сайта займет довольно длительное время.
   
   В строке 81 содержится оператор print, который продолжается до конца скрипта и выводит таблицу-индекс.
   
   79: хэш %seen_letter нужен для того чтобы вверху странички выдать ссылки в виде букв алфавита, например: <Jump to: A B K L P R S W Z>
   
   Для каждого ключевого слова выдается ссылка на документ, где оно встречается и описание из этого документа (3 колонки в таблице).
   
   Вот и все.
   
   Листинг:
    =1= #!/usr/bin/perl -w
    =2= use strict;
    =3= $|++;
    =4=
    =5= ## config
    =6=
    =7= my @URL = qw(http://www.stonehenge.Xcom/);
    =8=
    =9= sub OK_TO_FOLLOW {
    =10= my $uri = shift; # URI object, known to be http only
    =11= for ($uri->host) {
    =12= return 0 unless /\.stonehenge\.Xcom$/i;
    =13= }
    =14= for ($uri->query) {
    =15= return 0 if defined $_ and length;
    =16= }
    =17= for ($uri->path) {
    =18= return 0 if /^\/(cgi|fors|-)/;
    =19= return 0 if /col\d\d|index/;
    =20= return 0 if /Pictures/;
    =21= return 0 unless /(\.html?|\/)$/;
    =22= }
    =23= return 1;
    =24= }
    =25=
    =26= ## end config
    =27=
    =28= use WWW::Robot;
    =29= use LWP::UserAgent;
    =30= use CGI::Pretty qw(-no_debug :html);
    =31= use HTML::Entities;
    =32=
    =33= my %description;
    =34= my %keywords;
    =35= my %keyword_caps;
    =36=
    =37= my $robot = WWW::Robot->new
    =38= (
    =39= NAME => 'MetaBot',
    =40= VERSION => '0.15',
    =41= EMAIL => 'merlyn@stonehenge.Xcom',
    =42= USERAGENT => LWP::UserAgent->new,
    =43= CHECK_MIME_TYPES => 0,
    =44= ## VERBOSE => 1,
    =45= );
    =46=
    =47= $robot->env_proxy;
    =48=
    =49= $robot->addHook
    =50= ("follow-url-test" => sub {
    =51= my ($robot, $hook, $url) = @_;
    =52= return 0 unless $url->scheme eq 'http';
    =53= OK_TO_FOLLOW($url);
    =54= });
    =55= $robot->addHook
    =56= ("invoke-on-contents" => sub {
    =57= my ($robot, $hook, $url, $response, $structure) = @_;
    =58= my %meta = map {
    =59= my $header = $response->header("X-Meta-$_");
    =60= defined $header ? ($_, $header) : ();
    =61= } qw(Description Keywords);
    =62= return unless %meta;
    =63= if (exists $meta{Description}) {
    =64= $_ = $meta{Description};
    =65= tr/ \t\n/ /s;
    =66= $description{$url} = $_;
    =67= }
    =68= if (exists $meta{Keywords}) {
    =69= for (split /,/, $meta{Keywords}) {
    =70= s/^\s+//;
    =71= s/\s+$//;
    =72= $keywords{lc $_}{$url}++;
    =73= $keyword_caps{lc $_} = $_;
    =74= }
    =75= }
    =76= });
    =77= $robot->run(@URL);
    =78=
    =79= my %seen_letter;
    =80=
    =81= print
    =82= table({ Cellspacing => 0, Cellpadding => 10, Border => 2 },
    =83= do {
    =84= my %letters;
    =85= @letters{map /^([a-z])/, keys %keywords} = ();
    =86= %letters ?
    =87= Tr(td({Colspan => 3},
    =88= p("Jump to:",
    =89= map a({Href => "#index_$_"}, uc $_), sort keys %letters)))
    =90= : 0;
    =91= },
    =92= map {
    =93= my $key = $_;
    =94= my @value =
    =95= map {
    =96= my $url = $_;
    =97= my $text = exists $description{$url} ?
    =98= $description{$url} : "(no description provided)";
    =99=
    =100= [a({Href => encode_entities($url)}, encode_entities($url)),
    =101= encode_entities($text),
    =102= ];
    =103= } sort keys %{$keywords{$key}};
    =104= my $key_text = $keyword_caps{$key};
    =105= if ($key =~ /^([a-z])/ and not $seen_letter{$1}++ ) {
    =106= $key_text = a({ Name => "index_$1" }, $key_text);
    =107= }
    =108=
    =109= map {
    =110= Tr(($_ > 0 ? () : td({Rowspan => scalar @value}, $key_text)),
    =111= td($value[$_]));
    =112= } 0..$#value;
    =113= } sort keys %keywords
    =114= );
   
   
   


<<НАЗАД      ОЦЕНИТЬ СТАТЬЮ    ВЕРСИЯ ДЛЯ ПЕЧАТИ>>
Статья прочитана :  раз.




пейкюлю



 
 
 
 
 
pauk ©® 2000-2015. All rights reserved.
При перепечатке ссылка на сайт и указание обязательны.
Мнение администрации сайта не всегда совпадает с мнением автора.
Орфография и пунктуация - авторские.
Администрация не несет никакой ответственности за использование материалов.
.
Protected by Copyscape DMCA Takedown Notice Infringement Search Tool