理系学生日記

おまえはいつまで学生気分なのか

スクレイピングで CD 売上のランキングを取得してみる

もう一個 CSS セレクタでの練習をしときたいなどと,平和なことを考えておりましたから,CD のウィークリーランキングを抜き出すなどをしてみた!
Oricon さんのを抜き出してみたんですけども,一位の扱いが他の順位の曲と違うのでアレな感じですね!!!
あと,なぜか英語が全角文字なのが気持ち悪かったので,そのへんは半角に変換する.

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use URI;
use Web::Scraper;
binmode( STDOUT, ':utf8' );

my $uri = URI->new( "http://www.oricon.co.jp/rank/js/w/" );

# retrieve weekly ranking 
my $s = scraper {
    process 'table[class="rank_m_01_1st"] h2', 'top_title' => "TEXT";
    process 'table[class="rank_m_01_1st"] h3 a', 'top_artist' => "TEXT";    
    process 'table[class="rank_m_01"] td[class="title"]', 'title[]' => "TEXT";
    process 'table[class="rank_m_01"] td[class="artist"] a', 'artists[]' => "TEXT";    
    result qw(top_title title top_artist artists);
};
my $result = $s->scrape( $uri );
my @titles  = ( $result->{top_title},  @{$result->{title}} );
my @artists = ( $result->{top_artist}, @{$result->{artists}} );

# convert full-width alphabets to half-width ones
@titles  = map { tr/A-Za-z/A-Za-z/; $_} @titles;
@artists = map { tr/A-Za-z/A-Za-z/; $_} @artists;

# print ranking in /etc/passwd format
my $rank = 1;

# ここの書き方をなんとかしたい
while( @titles ) {
    my($title, $artist) = (shift @titles, shift @artists);
    print "$rank:$title:$artist\n";
    $rank++;
}

出力はこんな感じ.コロン区切りにしたのは,あとでこのランキングからいろいろしてみたいなって思っているからですけど,いつ実現するかは神さましかわかりません!

1: SUMMER TIME : NEWS 
2: 虹: Aqua Timez 
3: ダイアモンド・クレバス/射手座☆午後九時Don’t be late: シェリル・ノーム starring May’n 
4: 羞恥心: 羞恥心 
5: MOTHER ギフトパッケージ盤: SEAMO 
6: トライアングラー: 坂本真綾 
7: 裏切り御免: The THREE(布袋寅泰×KREVA×亀田誠治) 
8: BIRTH: D 
9: No more: 米寿司 
10: changes: Base Ball Bear