2011-07-31 63 views
0

我在过去的几个小时里一直在努力研究这个问题,在经历了大量谷歌搜索结果之后,我仍然无法使用它。发布方法申请/表格提交

我正在写一个连接到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; 

不幸的是,它仍然是形式的网页源代码 - 而不是搜索结果页面。

+1

看看'WWW :: Mechanize' – ErikR

回答

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或者通过锤击它来滥用表单。

1

您基本上有两种选择路径:硬编码您想要的特定表单值,并使用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

谢谢;我已阅读了文档,并在网上找到了一些示例,但我仍然遇到问题(请参阅上文,我编辑了我的原始文章)。 – Konrad

+0

@Konrad:更新了我的答案 – ysth