Wednesday, December 21, 2011

Google PageRank 로 뽑아보는 인기 Blog 글

 한해를 정리하며 자신이 일년간 쓴 블로그 글들이 얼마나 impact가 있었는지 체크해보는 것도 의미 있으리라... Google analytics 등 분석 툴을 이용해 각 글들의 클릭수, 읽은 시간 등을 체크해 볼 수도 있지만, 여기서는 각 블로그 글의 Google PageRank 를 이용해 인기순위를 체크해 보는 간단한 Perl script 를 만들어 본다.

준비
WWW::Google::PageRank
Web::Query
두개의 Perl 모듈

1. Blogger 에서 BlogID 얻어내기
Google 에서 제공하는  Blogger API 를 보면, 각 Blogger 블로그에 대한 feed를 얻기 위해, blogID를 알아야 한다. 이를 확인 하는 방법은 아래 두가지를 꼽아 볼 수 있다.

 a) 디폴트 feed 페이지( http://blog-name.blogspot.com/feeds/posts/default )에서 id 태그에 blog-'blogID' 형태로 삽입된 blogID 를 얻어내는 방법

b) feedburner 등으로 디폴트 feed 페이지를 변경하여 a) 방법이 불가능한  경우, 블로그 대문 html 파일 하에 item-action 클래스로 묶인 태그 하의 링크 주소에 blogID='blogID' 형태로 삽입된 blogID를 읽어오는 방법

위 두가지 방법으로 이 블로그의 blogID 를 얻어내는 코드는 아래와 같다.

# Blogger계정의 블로그 feed 주소 ( goldbio 부분에 자신의 블로그 주소 앞부분을 넣으면 된다 )
my $blog_add=qq|http://goldbio.blogspot.com/feeds/posts/default|;
# a 방법 wq($blog_add)->find('id')->text=~/blog-(\d+)/; my $id=$1; # b 방법  wq($blog_add)->find('.item-action')->find('a')->attr('href')=~/blogID=(\d+)/; my $id=$1;




위의 코드에는 Web::Query 를 이용해 html 페이지를 파싱했는데, 이 모듈은 jQuery와 같은 방식으로 태그 이름, 클래스 이름 등을 사용해 간편하게 html 페이지 요소에 접근할 수 있도록 하는데, 같은 기능을 하는 모듈로 pQuery 라는 모듈도 있다.  ( 이 모듈은 올해 진행되는 서울 펄 크리스마스 트리에 언급되어 알게 되었는데, jQuery 를 최근에 많이 쓰다보니 다른 모듈들 보다 훨씬 편한 느낌^^)




2. 각 블로그 글의 PageRank 얻어내기
  
blogID 를 얻어낸 후엔 이를 이용해 해당 블로그의 feed를 아래 주소를 통해 접근할 수 있다.
http://www.blogger.com/feeds/blogID/posts/default ( blogID 부분에 해당 블로그 id를 넣으면 된다 )
이 주소로는 대문 페이지에 보이는 글들만 얻어올 수 있기에, 한해 동안의 블로그 글을 얻어내려면 옵션을 추가해야 한다. 


&published-min=2011-01-01-T00:00:00 을 위의 feed 주소 뒤에 붙이면 2011년 1월 1일 0시 부터 쓴  모든 글들에 접근할 수 있다. 2011년에 쓴 글들이 꾀나 많다면 &max-results=100000 과 같이 적당한 최대 검색값을 덧붙인다.  


www.blogger.com/feeds/$id/posts/default?published-min=2011-01-01T00:00:00&max-results=100000000


위의 주소로 접근하면 이 블로그에 2011년 한 해 동안 업데이트된 글들이 모두 포함된 feed 를 확인할 수 있다.  이제 각 글들의 Pagerank 를 확인하면 된다. 먼저  각 글들의 URL 을 얻어내고, 얻어진 URL 을 WWW::Google::PageRank 를 이용해 확인하면 된다.


글의 URL 은 아래와 같은 형태로 각 블로그 글 마다 삽입되어 있는데, 
<link rel='alternate' type='text/html' href='http://goldbio.blogspot.com/2011/09/jquery.html' title='jQuery::이미지 크기 동적으로 변경'/>

여기서 href 아래 주소만 Web::Query 를 이용해 얻어내는 코드는 
$feed->find('link')->attr('href') 와 같이 쓸 수 있다.  $feed에는 이와 같은 link 가 블로그 글 숫자 만큼 들어 있고, 이를 모두 얻어내야 하므로 코드는

$feed->find('link')->each ( sub {
   my $i=shift;
   my $post_link=$_->attr('href');
});
와 같이 쓸 수 있다. 

WWW::Google::PageRank 사용법은 간단하다.

주어진 URL 에 대해 아래와 같은 코드로 pagerank를 확인할 수 있다.

my $pagerank=WWW::Google::PageRank->new;
my $pagerank= scalar( $pagerank->get( URL ) ) ; 

최종적으로 Feed 페이지를 Web::Query 모듈을 이용해 파싱하여 각 블로그 글들의 URL 을 얻고, 해당 URL 을 이용 Pagerank 를 얻어내는 코드를 종합해 보면 아래와 같이 쓸 수 있다. 




## 2011년 블로그 Feed 주소
my $blogger_API=qq|http://www.blogger.com/feeds/$id/posts/default?published-min=2011-01-01T00:00:00&max-results=100000000|;



## 각 블로그 글에 해당하는 Google Pagerank 출력
my $q=Web::Query->new( $blogger_API );
$q->find('link')->each( sub{
    my $i=shift;
    next if $_->attr('rel')!~/alternate/;
    my $post_link=$_->attr('href');
    my $post_title=$_->attr('title');
    my $post_pagerank=scalar( $pr->get($post_link) );
    print "$post_title\t$post_link\t$post_pagerank\n" ;
});




3. 종합

인기 블로거가 아닌 이상, 각 블로그 글들은 아마 대부분의  글의 Pagerank 가 0 일 것이다. (참고로 이 블로그의 모든 글 108개 중 pagerank 가 1 이상인 글은 2개 뿐이다 -pagerank 는 10점이 최고 점수) 그러니 결론적으로 블로그 글 인기순위 메기기에 pagerank 는 부적합해 보인다. 따라서 다른 용도로 pagerank 수치를 적절하게 결합해서 사용하는 것을 추천!