глянуть можно - но у меня тут только не дописанный вариант остался, остальное дома. Здесь я как раз заморачивался с объектами от LWP.
#!/usr/bin/perl -w
$|=1;
use strict;
use LWP::UserAgent;
use HTTP::Cookies;
#use URI::URL;
use CGI::Carp qw/fatalsToBrowser/;
use HTML::LinkExtor;
use CGI qw(Vars param header);
#################### Основные установки ###############
my $user=\'rpk74@uzhe.net\';
my $pass=\'131313\';
# основной url
my $url_main="http://www.careerbuilder.com";
# url логин-скрипта
my $login_page="http://www.careerbuilder.com/Share/Login.aspx";
# url формы для поиска.
my $search_form="http://www.careerbuilder.com/JobPoster/Resumes/ResumeSearchAdv.aspx";
#
# форма для логина
my %form1=( \'login:cbsys_login_email\' => $user,
\'login:cbsys_login_password\' => $pass,
\'__VIEWSTATE\' => undef,
);
# форма для поиска
my %Vars=();
# массив для хранения ссылок
my @LINKS=();
### переменная для хранения поля Location
my $location;
########### HTML ###############################
print header(-charset=>\'windows-1251\');
if(!param()) {
require \'./html.pm\';# подключаем модуль содержащий одну функцию вывода html
print show_first(); # <- вот она
exit 0;
} else {
print qq(Принимаю данные из формы................);
%Vars=Vars;# дампим все переменные переданные из формы в хэш
print qq(...OK
);
}
################################################
my $ua=LWP::UserAgent->new();
$ua->cookie_jar({ });# храним в памяти куки
# запрашиваем страницу с логином
print qq(Запрашиваю страницу для авторизации.....);
my $log=$ua->get("$login_page");
print qq(...OK
);
#if ($log->code eq \'302\') { # если ответ 302, то...
print qq(Перехожу по редиректу.........);
$location=$log->previous->headers->{location};
# переходим по редиректу
$log=$ua->get("$url_main$location");
print qq(...$location
);
#}
# сохраняем полученную страницу для парсинга элементов формы
my $form=$log->content;
print qq(Обрабатываю скрытые поля................);
$form1{\'__VIEWSTATE\'}=get_viewstate($form);
print qq(...OK
);
# авторизуемся
print qq(Авторизуюсь.............................);
$log=$ua->post("$url_main$location",\\%form1);
print qq(...OK
);
$location=$log->header(\'location\');
$log=$ua->get("$url_main$location");
print $log->content;
exit 0;
print qq(Авторизация прошла успешно
);
### вставить сюда запрос формы для поиска ###########
print qq(Запрашиваю форму для поиска.............);
$log=$ua->get("$search_form");# запрашиваем форму для поиска
print qq(...OK
);
#if ($log->code eq \'302\') {# если ответ не 200 (а к примеру 302) то отлавиливаем поле location
$location=$log->header(\'location\');# ловим location
print qq(Перемещаюсь на $location........);
$log=$ua->get("$url_main$location");# еще разик запрашиваем пагу
print qq(...OK
);
$search_form=$url_main.$location;
# }
$form=$log->content;# сохраняем пагу для извлечения viewstate поля
#print $form and exit 0;
# Меняем значение поля viewstate
print qq(Извлекаю скрытые поля...................);
$Vars{\'__VIEWSTATE\'}=get_viewstate($form);#
print qq(...$Vars{\'__VIEWSTATE\'}
);
######### Начинаем поиск ####################
print qq(Отправляю поисковый запрос на $search_form......);
# делаем запрос к нужной странице (возможно опять придется изгалятся с location)
$log=$ua->post("$search_form",\\%Vars);
print qq(...OK
);
#unless ($log->is_success) {# если ответ не 200 (а к примеру 302) то отлавиливаем поле location
print qq(Перемещаюсь на $location........);
$location=$log->header(\'location\');# ловим location
$log=$ua->get("$url_main$location");# еще разик запрашиваем пагу
print qq(...OK
);
# }
# создаем временный файл
print qq(Создаю временный файл....................);
open(TMP,">","./tmp/search.html") || die "Can\'t create temp file: $!\\n";
print qq(...OK
);
if ($log->is_success) {
print qq(Записываю результаты запроса во временный файл...);
print TMP $log->content; # будем сохранять результат запроса во временный файл
print qq(...OK
);
}
else {
print qq(Запрос неудачный!);
die $log->status_line;
}
close(TMP);
print qq(Извлекаю ссылки из временного файла....);
# дальше будем парсить файл, отбирать нужные линки, и складывать их в массив.
my $parser=HTML::LinkExtor->new(\\&get_it,$url_main);
$parser->parse_file("./tmp/search.html");
# функция callback на вызов LinkExtor
sub get_it {
my($tag, %links) = @_;
if($tag=~/^a/) {
my (undef,$str)=split(/\\s+/,"@{[%links]}");
push(@LINKS,$str) if($str=~m|/jobposter/resumes/resumedetails.aspx|i);# только линки на скрипты с параметрами
}
}
# сюда мы по идее должны прийти с полным массивом @LINKS
print qq(...OK
);
if(scalar @LINKS <1) {
print qq(По вашему запросу ничего не найдено
);
}
print qq(Создаю временный файл для хранения ссылок.....);
open(TMP,">","./tmp/links.html") || die "Can\'t create temp file: $!\\n";
print qq(...OK
);
foreach my $linkz (@LINKS) {
print TMP $linkz,"\\n";
}
close(TMP);
print qq(Файл записан успешно!
);
print qq(Приступаю к многопоточной обработке ссылок
);
exit;
### всякие подпрограммы ############
sub striptohtml
{
($_) = @_;
s/\\n//g;
s/\\t//g;
s/\\s\\s+/ /g;
s/\\\\n\\ s/\\>/\\>\\n/sg;
return($_);
}
# парсим форму для логина
sub get_viewstate {
my $form=shift;
$form=striptohtml($form); # делаем хтмл более убодоваримым
for my $line (split(/\\n/,$form)) {
if ($line =~ /for my $element (split / /,$line)
{
$element =~ s/[<>\\"]//g;# вырезаем тэги
# если элемент содержит поле value считываем его в хэш для формы
if($element=~/^value/) {
$element=substr($element,6);
$element=~s/^\\"//; $element=~s/\\"$//;
return $element; }
}
}
}
}
Даю код как есть. то есть сайт реальный.
Огромный гимор на этом сайте был с постоянными редиректами (поэтому приходилось отлавливать поле Location) и с отловом сессии.
Работать с куками руками я предпочел так (примерно):
#!/usr/bin/perl
use LWP::UserAgent;
$url=\'http://forums.webscript.ru/\';
$ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => $url);
my $res = $ua->request($req);
($header)=split(/\\n\\n/,$res->as_string);
# дальше работаем с заголовком
foreach (split/\\n/,$header) {
push(@cookies,$_) if /^Set-Cookie/;
}
# выводим кукисы
foreach (@cookies) {
print $_,"\\n";
}
или так:
!/usr/bin/perl
use LWP::UserAgent;
$url=\'http://forums.webscript.ru/\';
$ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => $url);
my $res = $ua->request($req);
$header= $res->headers;
@cookies=@{$header->{\'set-cookie\'}};
foreach (@cookies) {
print $_,"\\n";
}
Что в результате получилось значительно надежнее в моем варианте. Хотя возможно просто нехватка толковой документации по модулю.