1

私はかつて、JAVAでhttpページをダウンロードするための簡単な「クローラー」を作成しました。今、私はLWPモジュールを使用して、Perlに同じものに書き直そうとしています。

これは私のJavaコードです(これは正常に動作します):

String referer = "http://example.com";
String url = "http://example.com/something/cgi-bin/something.cgi";
String params= "a=0&b=1";

HttpState initialState = new HttpState(); HttpClient httpclient = new HttpClient(); httpclient.setState(initialState); httpclient.getParams().setCookiePolicy(CookiePolicy.NETSCAPE);

PostMethod postMethod = new PostMethod(url); postMethod.addRequestHeader("Referer", referer); postMethod.addRequestHeader("User-Agent", " Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13"); postMethod.addRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8"); postMethod.addRequestHeader("Content-Type", "application/x-www-form-urlencoded");

String length = String.valueOf(params.length()); postMethod.addRequestHeader("Content-Length", length); postMethod.setRequestBody(params);

httpclient.executeMethod(postMethod);

そしてこれはPerlバージョンです:

my $referer = "http://example.com/something/cgi-bin/something.cgi?module=A";
my $url = "http://example.com/something/cgi-bin/something.cgi";
my @headers = (
  'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13',
  'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Referer' => $referer,
  'Content-Type' => 'application/x-www-form-urlencoded',
);

my @params = (
    'a' => '0',
    'b' => '1',
);

my $browser = LWP::UserAgent->new( );
$browser->cookie_jar({});

$response = $browser->post($url, @params, @headers);
print $response->content;

postリクエストは正しく実行されますが、別の(メイン)Webページが表示されます。クッキーが正しく機能していないかのように...

何が悪いのか推測できますか?JAVAおよびperlプログラムとは異なる結果が得られるのはなぜですか?

4

3 に答える 3

7

LWP::UserAgentのラッパーであるWWW::Mechanizeを使用することもできます。それはあなたに自動的にクッキージャーを与えます。

于 2011-02-11T15:03:45.853 に答える
4

配列ではなくハッシュを作成する必要があります-たとえば、次の代わりに:

my @params = ( 'a' => '0', 'b' => '1', );

次を使用する必要があります。

my %params = ( a => 0, b => 1, );

パラメータをLWP::UserAgent postメソッドに渡すときは、ハッシュへの参照を渡す必要があります。例:

$response = $browser->post($url, \%params, %headers);

サーバーに送信しているリクエストを次のように確認することもできます。

print $response->request->as_string;

ハンドラーを使用して、デバッグ目的で要求と応答を自動的にダンプすることもできます。

$ua->add_handler("request_send", sub { shift->dump; return }); $ua->add_handler("response_done", sub { shift->dump; return });

于 2011-02-11T15:02:22.220 に答える
1

私はそれが関係していると信じています$response = $browser->post($url, @params, @headers);

LWP::UserAgentのドキュメントから

$ua->post( $url, \%form )
$ua->post( $url, \@form )
$ua->post( $url, \%form, $field_name => $value, ... )
$ua->post( $url, $field_name => $value,... Content => \%form )
$ua->post( $url, $field_name => $value,... Content => \@form )
$ua->post( $url, $field_name => $value,... Content => $content )

あなたのパラメータとヘッダーはハッシュとしてあるので、私はこれを試してみます:

my $referer = "http://example.com/something/cgi-bin/something.cgi?module=A";
my $url = "http://example.com/something/cgi-bin/something.cgi";
my %headers = (
  'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13',
  'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Referer' => $referer,
  'Content-Type' => 'application/x-www-form-urlencoded',
);

my %params = (
    'a' => '0',
    'b' => '1',
);

my $browser = LWP::UserAgent->new( );
$browser->cookie_jar({});

$response = $browser->post($url, \%params, %headers);
于 2011-02-11T15:01:22.600 に答える