Perlでクロールする(LWP::UserAgent)
しばらく、Rubyをやっていたので忘れないようにPerlでクロールスクリプトを書いてみます。
PerlもWebアプリ開発はやったことがないですが、、、仕事でパッチワーク的なツールをつくるのによく使っています。
環境は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(トラックバックは承認後に公開されます)


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