Created
December 6, 2011 03:28
-
-
Save am0c/1436572 to your computer and use it in GitHub Desktop.
grep_gstar.pl
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env perl | |
| use utf8; | |
| use 5.010; | |
| use Dancer qw(); | |
| use Dancer::Plugin::Redis; | |
| use Digest::MD5 qw(md5_hex); | |
| use GD::Thumbnail; | |
| use File::Basename; | |
| use LWP::Simple; | |
| ## 시작 전 데이터베이스 항목 초기화 | |
| redis->setnx("youperl:img:cat.gstar:page", 0); | |
| ## 긁을 페이지 목록을 구하는 구하는 정규표현식과 | |
| ## 각 페이지에서 이미지를 긁을 정규표현식 | |
| my $grep_srclist = qr|<a href="([^"]+)".{1,30}지스타 2011 부스걸 사진 보기|si; | |
| my $grep_imglist = qr|http://p.playforum.net/[^"]+|si; | |
| ## 일단 첫번째 페이지를 가져와요! | |
| my $first_page = 'http://www.playforum.net/www/newsDirectory/-/id/1047955'; | |
| my $src_list = get $first_page; | |
| ## 페이지 목록을 긁어요! | |
| my @urls = $src_list =~ m/$grep_srclist/g; | |
| my @imgs; | |
| ## 각 페이지를 순회하면서 이미지 목록을 긁어요! | |
| for my $url ($first_page, @urls) { | |
| say " <- $url"; | |
| my $src_imgs = get $url; | |
| push @imgs, $src_imgs =~ m/$grep_imglist/g; | |
| } | |
| ## 각 이미지를 처리합니다. | |
| for my $img (@imgs) { | |
| say $img; | |
| my ($name, $path, $suffix) = fileparse $img, qr/\.[a-z]+/i; | |
| my $hex = md5_hex "youperl_$path$name"; | |
| my $fn = "public/img/$hex$suffix"; | |
| my $thumb = "public/img/thumb/$hex$suffix"; | |
| my $i; | |
| ## 유일한 파일명을 구해요. | |
| while (-e $fn) { | |
| ++$i; | |
| $fn = sprintf "public/img/${hex}_%d$suffix", $i; | |
| $thumb = sprintf "public/img/thumb/${hex}_%d$suffix", $i; | |
| } | |
| $hex = "${hex}_$i" if defined $i; | |
| ## 이미지를 저장하구요. | |
| say " -> $fn"; | |
| getstore $img, $fn unless -e $fn; | |
| ## 작은 파일은 필요 없습니다. | |
| if (-s $fn < 1024 * 8) { | |
| say " xx $fn"; | |
| unlink $fn; | |
| next; | |
| } | |
| ## 썸네일도 생성합시다. | |
| say " -> $thumb"; | |
| my $t = GD::Thumbnail->new; | |
| my $raw = $t->create($fn, 140, 0); | |
| open my $fh, '>', $thumb or die; | |
| binmode $fh; | |
| print $fh $raw; | |
| say " -o $fn"; | |
| ## 데이터베이스에 400개씩 기록합니다. | |
| my $page = redis->get("youperl:img:cat.gstar:page"); | |
| my $size = redis->llen("youperl:img:cat.gstar:$page"); | |
| if ($size >= 400) { | |
| $page = redis->incr("youperl:img:cat.gstar:page"); | |
| } | |
| redis->lpush("youperl:img:cat.gstar:$page", $hex); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment