2011-07-31 46 views
0

私はここ数時間、この作業に取り組んできましたが、Googleの検索結果を数多く調べても、まだ動作させることはできません。投稿方法リクエスト/フォーム投稿

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

関連する別冊doc: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

基本的に2つのパスを選択できます。必要な特定のフォーム値をハードコードし、LWP :: UserAgentを使用してポストデータとして渡します(POST()にarrayrefパラメータを追加 - 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