Листинг 10.7. Узнай место сайта в выдаче
#!/usr/bin/perl — w — Ilib use strict;
# модули для получения информации из XML и доступа к
# веб-ресурсам, соответственно use XML::XPath;
use LWP::UserAgent;
# верхняя и нижняя части страницы require"./page-template.pl";
# библиотека функций. Например, для обработки полей присланной
# формы
require"./xml-lib.pl";
print "Content-Type: text/html;charset=utf-8\n\n"; print &header
# обработка полей формы my %params = &parse_form;
my $host = $params {'host'}; my $query = $params {'query'}; my $query_esc = xmlescape($query); my $host_esc = xmlescape($host);
$host =~ s[Ahttp://|www\.][];
# готовим запрос
my $ua = LWP::UserAgent->new;
$ua->agent("Bond, James Bond/0.07"); my $exit = 1;
$exit = 0 if $ENV{'REQUEST_METHOD'} eq 'POST'; my $reqid = undef; my $page = 0;
my $found = 0; my $pages = 20;
print "
"; |
# мы должны получить место сервера в выдаче по некоему запросу.
# делаем запрос по десять ссылок на страницу и запрашиваем 50
# страниц. При нахождении сервера останавливаемся и выдаем его
# место в выдаче
while (not $exit and $page < $pages and $host)
{
my $reqid_tag = '';
$reqid_tag = "
# XML запрос
my $doc = < $reqid_tag DOC my $req = HTTP::Request — > new # (POST => 'http://xmlsearch.yandex.ru/cgi-bin/xmlsearch.pl'); (POST => 'http://xmlsearch.yandex.ru/cgi-bin/xmlsearch.pl'); $req — > content_type ('application/xml'); $req — > content ("$doc"); # отправляем запрос my $response = $ua — > request ($req); if ($response->is_success) { #print $response — > content; my $doc = XML::XPath — > new (xml => $response — > content); # пробуем получить ошибку my $error = $doc — > findvalue ('/yandexsearch/response/error'); if ("$error") { print "Возникла следующая ошибка: ", $error, " $exit = 1; last; } $reqid = $doc — > findvalue ('/yandexsearch/response/reqid'); my $pos = 1; my @nodes = $doc — > findnodes ('/yandexsearch/response/results/grouping/group/doc/url'); foreach (@nodes) { # если URL начинается с имени хоста, выходим из цикла if ($_ — > string_value =~ m^http: \/\/(www\.)?$host/i) { $found = $pos + $page * 10; $exit = 1; last; } $pos++; } $page++; } else { print "внутренняя ошибка сервера^"; $exit = 1; } } # если что-то найдено, то выводим результат if ($found) { print " сайт «$host» находится на месте № $found по запросу «$query» Попробуйте узнать позицию другого сайта!
\n";
\n";
} elsif (defined $host and $host)
{
print "
сайт «$host» находится далее, чем на". $pages*10." месте в выдаче «Яндекса» по запросу «$query»
Попробуйте узнать позицию другого сайта!
}
else
{
print "
Узнайте позицию сайта в выдаче «Яндекса» по запросу!
";}
print "";
# выводим форму с запросом. print <
сервера:
value="?? скать!"/>
FORM
# дописываем html
print &footer
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии