Thursday, August 1, 2013

Perl 을 이용한 간단한 네이버날씨 파싱


 Perl 이라는 언어는 언어적인 측면에서 아주 강력한 언어임엔 틀림없습니다.
특정 문서에서 반복적인 일련의 작업이라던지 시시각각 변하는 웹상의 글들을
파싱할 이유가 있다던지 할 땐 항상 Perl 이라는 언어를 떠올리게 됩니다.

Perl 을 처음 접한지 오래 되지는 않았고, 잘한다고 할 수준도 아니지만
Perl 을 처음 접하고 흥미를 느끼게 된 분들을 위해 간단한 웹 파싱 모듈을 소개합니다.

Perl 을 공부하셧던 분이라면 다들 들어 보셨을법한 LWP::Simple 이라는 모듈입니다.
워낙에 간단하고 기능이 좋아서 많이들 사용하는 것으로 알고 있습니다.

그날 그날 날씨를 확인 하려면 포털사이트로 접속해서 확인하곤 하는데
그마저도 귀찮아서 그냥 콘솔에서 확인 할 수 있도록 Perl로 간단히 만들었습니다.

=========================================================================
use LWP::Simple;
use Encode;

# 아래의 웹사이트로 접근하여 해당 지역의 날씨와 관련된 data를 긇어옵니다.
$url = "http://weather.naver.com/rgn/cityWetrWarea.nhn?cityRgnCd=CT001000";
$doc = get($url);
$doc = encode ('cp-949',$doc);          #한글관련 인코딩 변경

$doc =~ /<caption class="blind">(.+?)<\/caption>/g;
$doc = $';
$doc =~ /<div class="aside">/g;
$doc = $`;

#익명 해쉬로 돌려받음
$weather{'day'} = [ $doc =~ /<th scope="col">(.+?)<br><span>/g ];
$weather{'after'} = [ $doc =~ /<th scope="col" class="line">(.+?)<br><span>/g ];
$weather{'city'} = ["온도","날씨","강수"];
$weather{'temp'} = [ $doc =~ /<li class="nm">.+?<\/li>\s+<li>.+?<span class="temp"><strong>(.+?)<\/strong>.+?<\/span><br>\s+.+?<span class="rain"><strong>.+?<\/strong>.+?<\/span><\/li>/g ];

$weather{'atemp'} = [ $doc =~ /<th><a href\=\"\/rgn\/cityWetrCity\.nhn\?cityRgnCd\=CT0010\d{2}\">(.+?)<\/a><\/th>/g ];

$weather{'cloud'} = [ $doc =~ /<p class="icon"><img src\="http\:\/\/static\.naver\.net\/weather\/images\/w_icon\/.+?\.gif" width="64" height="46" alt="(.+?)"><\/p>/g ];

$weather{'rain'} = [ $doc =~ /강수확률\s+<span class="rain"><strong>(.+?)<\/strong>%<\/span>/g ];


#출력 부분
printf ("%-20s%-20s%-20s%-20s%-20s\n\n",$weather{'day'}[2],$weather{'day'}[0],$weather{'after'}[0],$weather{'day'}[1],$weather{'day'}[1]);

printf ("%-20s%-20s%-20s%-20s%-20s\n",$weather{'city'}[0],$weather{'temp'}
[12],$weather{'temp'}[13],$weather{'temp'}[14],$weather{'temp'}[15]);
printf ("%-20s%-20s%-20s%-20s%-20s\n",$weather{'city'}[1],$weather{'cloud'}[12],$weather{'cloud'}[13],$weather{'cloud'}[14],$weather{'cloud'}[15]);
printf ("%-20s%-20s%-20s%-20s%-20s\n",$weather{'city'}[2],$weather{'rain'}[0],$weather{'rain'}[13],$weather{'rain'}[14],$weather{'rain'}[15]);
=================================================
아래와 같이 간단히 수원지역의 날씨를 파싱해 왔습니다~
약간 수정을 거쳐야 하는 부분이 보이지만 숙제로 남겨 놓겠습니다~
참 그리고 저는 귀찮아서 use strict; use warnings; 는 쓰지 않았는데 
배우실땐 꼭 사용하시는것이 좋습니다.















No comments:

Post a Comment