読者です 読者をやめる 読者になる 読者になる

HTML::TreeBuilder::XPathを使ってみた。

perl scraping

XPathを知りたくてというか実践したくて使ってみた。
返り値となるオブジェクトがいろいろとでてきてわからないが、
そんなときは refとか isaで型をチェックして、ドキュメントを見て
ということを繰り返せばなんとかなる。

以下毎度お馴染みのサンプルです。ファイル取得の部分も入れてみた。

#!/usr/bin/perl
use strict;
use warnings;

use HTML::TreeBuilder::XPath;
use LWP::Simple;
use LWP::UserAgent;
use File::Basename;
use Time::HiRes;

my $url = shift @ARGV or die "usage builder_xpath.pl url\n";

my $tree = HTML::TreeBuilder::XPath->new();
$tree->parse( get $url );

my $nodes = $tree->findnodes( '//a' );

my @matchs;
foreach my $context ($nodes->get_nodelist) {
    next unless defined $context->attr('href');

    my $href = $context->attr('href');
    push @matchs, $href if $href =~ m/\.jpe?g$/
}

my $ua = LWP::UserAgent->new();
$ua->agent( 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' );

foreach my $img ( @matchs ) {
    my $response = $ua->get($img, REFERER => $url);
    if ( $response->is_error ) {
        die "Download failed $img\n";
    }

    my $output_name = basename $img;
    open my $fh, ">", $output_name or die "Can't open $output_name\n";
    print $fh $response->content;
    close $fh;

    sleep 0.5;
}

Web::Scraperを使うともっと楽だろうけど、もっと下のところで
やってみたいということで試してみました。