Perlでクロールする(LWP::UserAgent)

   ブックマークに追加する



しばらく、Rubyをやっていたので忘れないようにPerlでクロールスクリプトを書いてみます。
PerlWebアプリ開発はやったことがないですが、、、仕事でパッチワーク的なツールをつくるのによく使っています。

環境はWindows&ActivePerl()で実施しました。

指定したURLにアクセスし、検索結果から価格等の情報を抜き取る
input.txtに検索ワードを読み込み、LWP::UserAgent->getで検索結果からコンテンツを抜き出し、欲しい情報をCSVファイルに保存する

    
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use URI;
use Encode;
use encoding 'shiftjis';
binmode(STDERR, ':raw :encoding(shiftjis)');
use Text::CSV_XS;

####################
###  初期設定    ###
####################
my $inputfile = "input.txt";
my ($day,$month,$year) = (localtime)[3..5];
my $outputfile = 1900 + $year . $month+1 . $day . ".csv";
my $baseUrl = 'http://target_domain/';
my @cvs_header = qw(no name price url);
my $user_agent = ’user_agent';

sub input_data{
    open(IN, $inputfile) || die "Can't open $inputfile :$!";
    my @data = ;
    my $num = @data;
    print "取得データ件数:$num\n";
    close(IN) || die "Can't close $inputfile :$!";
    return \@data;
}

sub url_encode($) {
    my $str = shift;
    $str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
    $str =~ tr/ /+/;
    return $str;
}

sub http_connect {
    my $data = shift;
    my @output;
    push @output, \@cvs_header;
    my @headers = ('User-Agent' => $user_agent);
    my $url = URI->new($baseUrl);
    my $browse = LWP::UserAgent->new;
    foreach (@$data) {
        chomp;
        $url->query_form(
            sitem => $_
            );

        my $response = $browse->get($url, @headers);
        my $content=decode('euc-jp',$response->content);
        print "#";

        my ($rec)   = $content =~ m#\n(.*?)\n#mis;
        my ($link, $name)  = $rec =~ m#([^<]*?)#;
        my ($price) = $rec =~ m#(.+?円)#mis;
        push @output, [($_,$name,$price,$link)];
        sleep 3;
    }
    return \@output;
}

sub output_CSV {
    my $output = shift;
    my $csv = Text::CSV_XS->new({'binary' => 1});

    open(OUT, ">:encoding(shiftjis)", "$outputfile") || die "Can't open outputfile!:$!";
    foreach(@$output){
        $csv->combine(@$_);
        print OUT decode('utf8', $csv->string);
        print OUT "\n";
    }
    close(OUT) || die "Can't close outputfile!:$!";
}

my $data = input_data;
my $output = http_connect($data);
output_CSV($output);

まぁ、こんな感じでしょうか?
とりあえず、Rubyでも同様のプログラム作ってみたいな。

※Rubyでもクローラー作成しました。詳細はこちら




トラックバック(0)

このブログ記事に対するトラックバックURL(トラックバックは承認後に公開されます)

コメント(1)

通りすがり :

Rubyのスクレーピングのソースも公開してください。
今、自分でつくっているのですがうまくいかないです。

コメントする

このブログ記事について

このページは、Humが2007年12月 7日 00:12に書いたブログ記事です。

ひとつ前のブログ記事は「RubyでHTTPヘルスチェックプログラムをつくる(mechanizeとnet/smtpを使用する)」です。

次のブログ記事は「Amazonアソシエイツに登録しました。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

あわせて読みたいブログパーツ
フィードメーター - ウェブ-HACKS 「とりあえずやってみよう!」ブログ   
track feed
  • SEO対策 
  • _ 
  • _ 
  •  
  •  

このブログはクリエイティブ・コモンズでライセンスされています。