scraperを使用して、タイトルとURLを抽出してCSV出力する汎用perlスクリプト

指定した URL からタイトルとURLリンクを抽出し、CSV形式で出力するperlスクリプトです。

$ cat getLinks.pl
#!/usr/bin/perl

use strict;
use Web::Scraper;
use URI;
use Encode;
use Text::CSV_XS;
use JSON;
use utf8; # to use japanese in the code

my $delimiter = ",";
my $myurl = "" . $ARGV[0];
my $uri = URI->new($myurl);
#my $uri = URI->new("file:$myurl");
my $scraper = scraper {
  process '//a', 
    'list[]' => { 'title' => 'TEXT', 'link' => '@href' };
};

my $result = $scraper->scrape($uri);

my @f_name= qw/ title link /;
print join($delimiter, @f_name), "\n";
my $csv = Text::CSV_XS->new({
  'quote_char'  => '',
  'escape_char' => '"',
  'sep_char' => $delimiter,
  'binary' => 1
});
for my $i (@{$result->{list}}) {
  my @record;
  for ( my $j=0; $j<=$#f_name; $j++ ){
    push (@record, $i->{$f_name[$j]});
  }
  $csv->combine(@record);
  print encode('utf-8',$csv->string()), "\n";
}

ポイントは、"scraper { process ..." の部分だけ。

my $scraper = scraper {
  process '//a', 'list[]' => { 'title' => 'TEXT', 'link' => '@href' };
};

キーがCSVヘッダー名の連想配列にデータを格納し、CSV出力しています。

 

使用例

$ sudo cpan Web/Scraper.pm Text/CSV_XS.pm JSON.pm
$ perl getLinks.pl http://eiga.com/link/ | head
title,link
ホーム,http://eiga.com/
日本の映画会社,http://eiga.com/link/japan/
映画館・興行会社,http://eiga.com/link/exhibitor/
海外の映画会社,http://eiga.com/link/overseas/
編集部オススメ,http://eiga.com/link/recommends/
ア行,http://eiga.com/link/#a
カ行,http://eiga.com/link/#ka
サ行,http://eiga.com/link/#sa
タ行,http://eiga.com/link/#ta