2012年10月18日木曜日

Download all Images in a URL 指定ページにあるすべての画像を自動的にダウンロード


 調子に乗って、指定ウェブアドレスのページを自動的にダウンロードの応用として、指定のページにあるすべての画像を自動的にダウンロードするプログラムを書いて見ました。
 パラメータはファイル名で、内容は一行に一URLです。
 この例では、jpgしか見ていませんが、pngやgifなどほしいフォーマットを追加すれば良いです。画像に限らず、PDFやDOCなどもっと広げることもできます。
 個々の課題については、調べるとくどい説明と分かりにくい例が一杯あり、読むだけで疲れてしまいます。よって、ここでは、タスクベース、つまり目的に応じた、独立したプログラムをまとめてみることにしました。へたくそとか、効率悪いとか言う見方もあるかもしれませんが、一応そこそこ快適に動くことは確認しました。結果オーライ!
 個々の課題の例としては、「URL文字列からファイル名だけを取り出す」や、行末の改行コードを除去する」、「ハッシュの配列の参照」、「ファイルの入出力」等等です。
 しかし、HTMLとかLWP、Fileなどのクラスってすばらしいものですね。すべて自作していたら日が暮れます。
use strict;
use HTML::LinkExtor;
use  LWP::Simple;
use File::Basename;
my $file=$ARGV[0];
my $tag;
open(IN, "$file") or die"$!";
sub getFileName{
    my $path = shift;
    my ($name, $path, $suffix) = fileparse($path, ());
    return ( $name );
}
my $out;
my $line;
while(<IN>) {
  $line = $_;
  $line =~ s/\n//;
  my $parser = HTML::LinkExtor->new(undef, $line);
  $parser->parse(get($line))->eof;
  @links = $parser->links;
  foreach $linkarray (@links) {
    my ($elt_type, %attrs) = @$linkarray;
    if (($elt_type eq 'img' || $elt_type eq 'IMG') && $attrs{'src'} =~ /\.jpg$/i) {
      $out = getFileName($attrs{'src'});
      getstore($attrs{'src'}, $out);
    }
  }
}

Download the Contents of a URL 指定ウェブアドレスのページを自動的にダウンロード


 Perlで書くと以下のように簡単に実現できます。
#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
my $url = 'http://example.com/example.html';
my $file = 'data.kml';
getstore($url, $file);

 メモリにダウンロードして、そこで処理したい場合、WWW::Mechanizeを使った方は便利です。
#!/usr/bin/perl
use strict;
use WWW::Mechanize;
my $url = 'example.com/example.html';
my $mech = WWW::Mechanize->new;
$mech->get($url);
WWW::Mechanizeでは、指定URLにあるすべてのリンクを階層指定して持ってくることも可能です。

2012年4月11日水曜日

Perlの学習・応用

Wikipediaによると、「Perl(パール)とは、ラリー・ウォールによって開発されたプログラミング言語である。記述の美しさよりも実用性と多様性をモットーにしており、Csedawkシェルスクリプトなど他のプログラミング言語やスクリプト言語の優れた機能を取り入れている。CGIスクリプトやシステム管理、テキスト処理などのプログラムを書くのに広く用いられている。代表的なアプリケーションMovable Typeなど。
言語処理系としてのperlはフリーソフトウェアである。Artistic LicenseおよびGPLのもとで配布されており、誰でもどちらかのライセンスを選択して利用することができる。UNIXWindowsなど多くのプラットフォーム上で動作する。」

基本的にパブリックドメイン系のものですので、ライブラリのようなものは沢山開発されています。他の言語でできることは、ほぼすべてPerlでできると考えてよいです。

記述の美しさはあまり考慮されていないのと、Unixのリソースから継承されたものが多いため、いわゆるプログラミングの初心者に分かりにくい部分も多いです。

以下は、少しでも早く入門者から卒業したい人のためのリンク集です。
とほほのperl入門:定番参考書です!
Perl講座:入門からデータベース連携など、初級から上級まで
Perl-users.jp:Perlユーザの日本サイトです。基礎知識から実践コードまで
CGI・Perl例文集:実践的なコード。コピー&ペストですぐ使える
Perl基礎入門PerlプログラミングTips:2008年までの更新ですが、基本は一緒ですので、今でも参考になります。ソースコード例が豊富で、広告が少ない。