2012-01-27 14 views
2

私はサッカーのウェブサイトから自分が選んだプレイヤーにナビゲートし、自分の情報を盗み出すスクリプトを作成しようとしています。個々のプレイヤーのページをハードにコーディングするだけで作業をしていますが、ナビゲーションを実装しようとすると問題が発生します。問題のウェブサイトはhttp://www.soccerbase.comです。Perl:WWWの問題:機械化とフォーム

私は、ページの上部にあるフォームにプレーヤーの名前を記入してから、検索のために提出する必要があります。私はオンラインで見つけた情報に基づいて2つの異なる方法(それらのうちの1つをコメントアウト)を試しましたが、無駄です。私はPerlになると絶対的な初心者ですので、どんな助けでも大歓迎です!前もって感謝します。ここに私のコードは次のとおりです。

#!/usr/bin/perl 
use strict; 

require WWW::Mechanize; 
require HTML::TokeParser; 

my $player = 'Luis Antonio Valencia'; 
#die "Must provide a player's name" unless $player ne 1; 

my $agent = WWW::Mechanize->new(); 
$agent->get('http://www.soccerbase.com/players/home.sd'); 
$agent->form_name('headSearch'); 
$agent->set_fields('searchTeamField', $player); 
$agent->click_button(name=>"Search"); 

#$agent->submit_form(
#  form_number => 1, 
#  fields => { => 'Luis Antonio Valencia', }  
# ); 

my $stream = HTML::TokeParser->new(\$agent->{content}); 
my $player_name; 

$stream->get_tag("strong"); 
$player_name = $stream->get_trimmed_text("/strong"); 

print "\n", "Player Name: ", $player_name, "\n"; 

答えて

3

フォームアクションはJavascriptをswitcharooを果たしているので、それは少しトリッキーですが、HTML::Formは完全に罰金それを処理することができます:

#!/usr/bin/env perl 
use WWW::Mechanize qw(); 
use URI qw(); 

my $player = 'Luis Antonio Valencia'; 
my $agent = WWW::Mechanize->new; 
$agent->get('http://www.soccerbase.com/players/home.sd'); 
my $form = $agent->form_id('headSearch'); 
{ 
    my $search_uri = $agent->uri; 
    $search_uri->path('/players/search.sd'); 
    $form->action($search_uri); 
    # requires absolute URI 
} 
$agent->submit_form(
    fields => { 
     search => $player, 
     type => 'player', 
    } 
); 
1

簡単な方法は、例えば、落札HTTPリクエストを見ることである。

http://www.soccerbase.com/players/search.sd?search=kkkk&type=player

'KKKK' LWP::UserAgentを使用して、プレイヤー名ですそのリクエストをすると、それはあなたに結果を与えるでしょう、あなたが情報を得るために探しているプレーヤーの名前に 'kkk'を変更し、それはあなたが尋ねるなら、それは過剰なですMechを使用して、仕事を行います私は、もしプレイヤー名にスペースがあれば、e tcはそれをエンコードします。

1

それはフォーム要素は、name属性を持っていないと私は、クエリ文字列が収率にid属性を変換することによって、いくつかの他の手段によって形成されたと仮定しています以下のようになります。

http://www.soccerbase.com/players/search.sd?search=Luis+Antonio+Valencia&type=player

あなたが思うだろう次のように動作しますが、背後で起こっている他のJavaScriptの良さ(!)があることは示唆していません。

#!/usr/bin/env perl 

use strict; 
use warnings; 

use HTML::TableExtract; 
use LWP::Simple qw(get); 
use URI; 

my $player = 'Luis Antonio Valencia'; 

my $uri = URI->new('http://www.soccerbase.com/players/home.sd'); 
$uri->query_form(
    search => $player, 
    type => 'player', 
); 

my $content = get "$uri"; 
die "Failed to get '$uri'\n" unless defined $content; 

my $te = HTML::TableExtract->new(
    attribs => { class => 'clubInfo' }, 
); 

$te->parse($content); 
die unless $te->tables; 

my ($table) = $te->tables; 
my ($row) = $table->rows; 

print $row->[1], "\n"; 
関連する問題