2011-07-31 104 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