发布方法请求/表单提交

时间:2011-07-31 20:08:16

标签: perl form-submit web-scraping

过去几个小时我一直在研究这个问题,经过大量的谷歌搜索结果后,我仍然无法让它发挥作用。

我正在编写一个连接到https://web5.uottawa.ca/rezweb/search.php的perl脚本,选择“Off / On-Campus Accomodation”,点击搜索并打印结果。

这是我到目前为止所做的:

#!/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 个答案:

答案 0 :(得分:1)

您基本上有两个可供选择的路径:硬编码您想要的特定表单值并使用LWP :: UserAgent将它们作为post数据传递(将arrayref参数添加到POST() - 请参阅HTTP::Request::Common文档),或使用其子类WWW::Mechanize,它将为您提供获取空白表单的方法,输入值的字段,提交表单,并获得结果。

任何一种方式都可能因网站的变化而中断;由你决定哪个更有可能,哪个更容易编码。

您没有使用任何LWP :: Simple功能;你应该删除它的use

更新

当我进入页面并选择校外住宿时,它会添加更多(可选)表单字段;在此时发布这些参数:

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

使用所有这些参数都可以。

答案 1 :(得分:0)

相关额外文档: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

我通过关闭JS来到达POST参数列表 - 他们的站点使用它进行增强 - 并检查请求。虽然这个解决方案有效,但它很脆弱。确保您没有违反网站的ToS或通过锤击来滥用表单。