Запрос метода отправки / отправка формы - PullRequest
0 голосов
/ 01 августа 2011

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

Я пишу Perl-скрипт, который подключается к https://web5.uottawa.ca/rezweb/search.php,, выбирает «Выкл. / Размещение в кампусе», нажимает кнопку поиска и печатает результаты.

Вот что у меня есть:

#!/user/bin/perl
use strict; use warnings;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
use Crypt::SSLeay; #Since it's HTTPS

my $ua = LWP::UserAgent->new();
my $url = 'https://web5.uottawa.ca/rezweb/search.php';
my $formdata = ['accomodationType' => '1', 'submit' => 'Search'];

my $response = $ua->post($url, $formdata);
die "Error: ", $response->status_line . "\n"
  unless $response->content;

К сожалению, это по-прежнему источник страницы формы, а не страница результатов поиска.

Ответы [ 2 ]

1 голос
/ 01 августа 2011

По сути, у вас есть два пути на выбор: жестко закодировать конкретные значения формы, которые вы хотите, и использовать LWP :: UserAgent для передачи их в качестве данных публикации (добавление параметра arrayref в POST () - см. HTTP ::Request :: Common документация) или используйте его подкласс WWW :: Mechanize , который предоставит вам методы для получения пустой формы, ввода значений в ее поля, отправки формы и получения результата.

Любой путь может сломаться из-за изменений на сайте;Вам решать, какой из них более вероятен, а какой - легче кодировать.

Вы не используете какую-либо функциональность LWP :: Simple;Вы должны удалить его use.

Обновление:

Когда я зашел на страницу и выбрал размещение за пределами кампуса, он добавляет еще несколько (необязательных) полей формы;публикация в этот момент отправляет эти параметры:

accomodationType    1
maximum 9999
maximumOnCampus 9999
minimum 0
minimumOnCampus 0
submit  Search
zone    0

Использование всех этих параметров будет работать.

0 голосов
/ 04 августа 2011

Связанные дополнительные документы: Mojo :: DOM .

use strict;
use warnings;
use LWP::UserAgent;
use Mojo::DOM;

my $ua = LWP::UserAgent->new();
my $url = 'https://web5.uottawa.ca/rezweb/search.php';
my $formdata = [
                accomodationType => 1,
                maximum => 9999,
                maximumOnCampus => 9999,
                minimum => 0,
                minimumOnCampus => 0,
                "search_op[]" => 5,
                "search_op[]" => 6,
                "search_op[]" => 7,
                "search_op[]" => 8,
                "search_op[]" => 9,
                "search_op[]" => 10,
                "search_op[]" => 11,
                srch_rental_type4 => "on",
                srch_rental_type5 => "on",
                submit => "Search",
                zone => 0,
                ];

my $response = $ua->post($url, $formdata);
die "Error: ", $response->status_line, "\n"
    unless $response->content;

my $dom = Mojo::DOM->new( $response->decoded_content );
my @matches = map { $_->parent->parent }
    grep { $_->attrs("href") =~ /search\.php\?id=\d+/ }
    $dom->find("tr > td > a")->each;

for my $row ( @matches ) {
    print $row->all_text, $/;
}

__END__

157 Laurier Ave E 1 Hyman Soloway Sublet 1 bedroom 0400 01/08/2011
75 Louis Pasteur Pvt 1 Brooks Sublet 1 bedroom 0650 01/08/2011
75 Louis Pasteur Pvt 1 Brooks Sublet 1 bedroom 0750 25/07/2011

Я пришел к списку параметров POST, отключив JS - их сайт использует его для улучшения - и изучив запрос,Хотя это решение работает, оно хрупкое.Убедитесь, что вы не нарушаете ToS сайта и не злоупотребляете формой, забивая его.

...