メメメモモ

プログラミング、筋トレ、ゲーム、etc

perlでスクレイピング「データ保存のためのディレクトリ操作」

スクレイピングで取得してきたデータは保存します。
ただ単に保存するだけでなく、何かしら整理して保存した方が後から参照しやすくなります。


例えば、複数のサイトから毎日画像データを取得する場合、
取得してきた画像を「サイト毎」「日付毎」に保存した方が良いと思います。


自分の場合は、「サイト毎」「日付毎」をディレクトリ階層にしています。
例えば「hogehoge.com」というサイトから「2010年8月29日」に画像を取得した場合は、
「data/hogehoge/20100829」というディレクトリを作成して、そのディレクトリに画像を保存していきます。


こういったことを行なう場合には、perlでディレクトリ操作を行なう必要が出てきます。
ディレクトリ操作を行なうモジュールがありますので、それを使用します。
下記のような感じで使用しています。

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

use FindBin;
use Time::Piece;
use File::Path qw/mkpath/;
use File::Spec;


# データを保存するディレクトリ                                                                              
my $save_dir = File::Spec->catfile($FindBin::Bin,'data');

# サイトのリスト                                                                                            
my @site_list = qw/hogehoge fugafuga/;

# ディレクトリ作成のために日付を取得                                                                        
my $t = Time::Piece::localtime();
my $today = $t->ymd('');


for my $site (@site_list) {
    # サイト毎 日付毎のディレクトリパスを作成                                                               
    my $dir = File::Spec->catfile($save_dir, $site, $today);

    # ディレクトリがなければ、作成する                                                                      
    unless (-e $dir) {
        mkpath $dir;
    }

    # スクレイピング                                                                                        
    my ($image_name, $image) = get_image($site);
    
    # 保存名                                                                                                
    my $file_path = File::Spec->catfile($dir, $image_name);

    # 保存                                                                                                  
    print "Save to $file_path\n";
    open my $fh, '>', $file_path or die "Can't open '$file_path: $!";
    binmode($fh);
    print $fh $image;
    close($fh);
}


主に使用しているモジュールと用途は次の通りです。

  • FindBin
    • 実行スクリプトがあるディレクトリパスの取得
  • Time::Piece
    • 時間関係
  • File::Path
    • ディレクトリの作成
  • File::Spec
    • ディレクトリパスの作成


各モジュールの詳細に付いてはperldocまたはperlcodesampleさんがとても参考になります。