Perl:WWW的问题:机械化和表单

时间:2012-01-27 13:09:29

标签: perl screen-scraping web-scraping

我正在尝试编写一个脚本,该脚本将通过足球网站导航到我选择的播放器并为我抓取他们的信息。我只是通过对单个播放器的页面进行硬编码来完成抓取工作,但是尝试实现导航会给我一些问题。有问题的网站是http://www.soccerbase.com

我必须在页面顶部填写一个包含玩家姓名的表格,然后将其提交给搜索。我已经尝试了两种不同的方式(根据我在网上找到的信息评出其中一种方式),但无济于事。对于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 个答案:

答案 0 :(得分: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 :(得分:1)

更简单的方法是查看它所做的HTTP请求,例如:

  

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

'kkkk'是玩家名称,使用LWP::UserAgent来发出请求,它会给你结果,将'kkk'更改为你想要获取信息的玩家的名字,以及如果你问我,使用Mech就可以完成这项任务,如果玩家名称有空格等,请确保编码。

答案 2 :(得分:1)

表单元素看起来没有名称属性,我假设查询字符串是通过将id属性转换为yield来通过其他方式形成的:

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";