Рубрики

Реклама




 

Створення індексу для сайту


Ви, може, знаєте, що HTML дозволяє вставляти META-теги в заголовку документа. Тоді ви, я просто упевнений, знаєте для чого вони потрібні. Хто не в курсі - коротенько поясню: Існують пошукові сервера, які повзають по тих, що реєструються в їх базі сайтах і індексують сторіночки. При цьому вони звертають пильну увагу на МЕТА-ТЕГИ, а особливо на keywords і description (<ключові слова> і <опис>).


Синтаксис цих двох МЕТА-ТЕГОВ виглядає так:

Ключові слова також можуть бути розділені комою.

Ну а зараз безпосередньо про скрипт. Скрипт оглядає всі сторіночки сайту на предмет 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 потрібний для того, щоб вверху сторіночки видати посилання у вигляді букв алфавіту, наприклад:

Для кожного ключового слова видається посилання на документ, де воно зустрічається і опис з цього документа (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 а, 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= [а,
=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 = а({ 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= );


(c) Perl.com.ua | Про мову програмування Perl. Книга perl. Perl php. Perl mysql. Cправочник perl. Perl настройка. Про Перл українською.