Chess-Games-DotCom
view release on metacpan or search on metacpan
use HTML::Entities;
use HTML::TreeBuilder;
use LWP::Simple;
require Exporter;
our @ISA = qw(Exporter);
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
# This allows declaration use Chess::Games::DotCom ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our %EXPORT_TAGS = ( 'all' => [ qw(
) ] );
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw(
game_of_day puzzle_of_day
);
our $VERSION = '1.2';
our $home = 'http://www.chessgames.com';
my $tb = HTML::TreeBuilder->new;
# Preloaded methods go here.
my $ua;
sub _init_ua
{
require LWP;
require LWP::UserAgent;
require HTTP::Status;
require HTTP::Date;
$ua = new LWP::UserAgent; # we create a global UserAgent object
my $ver = $LWP::VERSION = $LWP::VERSION; # avoid warning
$ua->agent("Mozilla/5.001 (windows; U; NT4.0; en-us) Gecko/25250101");
$ua->env_proxy;
}
sub _get
{
my $url = shift;
my $ret;
_init_ua() unless $ua;
if (@_ && $url !~ /^\w+:/)
{
# non-absolute redirect from &_trivial_http_get
my($host, $port, $path) = @_;
require URI;
$url = URI->new_abs($url, "http://$host:$port$path");
}
my $request = HTTP::Request->new
(GET => $url,
);
my $response = $ua->request($request);
return $response->is_success ? $response->content : undef;
}
sub pgn_url {
my $gid = shift;
"http://www.chessgames.com/perl/nph-chesspgndownload?gid=$gid"
}
sub game_of_day {
my $outfile = shift || "game_of_day.pgn";
# retrieve http://www.chessgames.com
my $html = get $home;
# parse the page
$tb->parse($html);
my $god; # god == Game of the Day
# make it so that text nodes are changed into nodes with tags
# just like any other HTML aspect.
# then they can be searched with look_down
$tb->objectify_text;
# Find the place in the HTML where Game of the Day is
my $G = $tb->look_down
(
'_tag' => '~text',
text => 'Game of the Day'
);
my $table = $G->look_up
(
'_tag' => 'table',
);
my @tr = $table->look_down('_tag' => 'tr');
my $god_tr = $tr[1];
my $a = $god_tr->look_down('_tag' => 'a');
# lets get the URL of the game
my $game_url = $a->attr('href');
my ($game_id) = $game_url =~ m/(\d+)/;
# let's get the game, faking out the web spider filter in the process:
my $pgn = _get pgn_url $game_id;
# let's save it to disk
open F, ">$outfile" or die "error opening $outfile for writing: $!";
( run in 0.381 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )