mixiニュースの記事を取得する #perl

久々にmixiにログインした。
結構、アカウント残ってるものなんですね。

せっかくログインしたので、perlの勉強がてら書いてみた

概要

・今回は、mixiニュースのランキングから記事を取得してみました。
・記事はhtml形式で取得するようにしたので、plaggerなどを用いて、gmail等に送れるようにすれば、便利に使えるかも
・WWW::Mixiというモジュールを使えば、もっと簡単に書けると思いますが、勉強ということで、自分なりにコーティングした。
・サービス目的での使用は、違反?だと思うので、個人使用ならセーフ?

サンプルソース

#!/usr/bin/perl
use strict;
use warnings;
use WWW::Mechanize;
use Web::Scraper;
use YAML::Syck;

## Instance
my $yml = "mixi.yml";
my $conf = YAML::Syck::LoadFile($yml) or die "$yml:$!";
my $mech = new WWW::Mechanize;

## Login
warn "login as $conf->{email}\n";
$mech->get('http://mixi.jp/');
$mech->submit_form(fields =>$conf);

## Scrape links
$mech->get("http://news.mixi.jp/show_ranking.pl");
my $rank = scraper {
             process '//table[@class="rankingTable"]//td[@class="newsTitle"]/a' ,
                     'url[]' => '@href';
    result 'url';
};
my  $ref = $rank->scrape($mech->content, $mech->uri);
foreach my $links (@{$ref}){
        my $entries = scrp_pg($links);

        ## Output
        foreach my $entry (@{$entries}){
                binmode STDOUT, ":utf8";
                print $links;
                print $entry->{title} . "\n";
#                print $entry->{body} . "\n";
        }
};

## Scrape Pages
sub scrp_pg {
        my $link = shift;
        $mech->get($link);
        my $scrp = scraper {
                process '//div[@id="bodyMainArea"]',
                        'entry[]' => scraper {
                                process '//div[@class="newsArticle"]//h2',title => 'TEXT';
                                process '//div[@class="article"]', body => 'HTML';
                        };
        result 'entry';
        };
        my $hml_ref = $scrp->scrape($mech->content, $mech->uri);
        return $hml_ref;
}
print "==============END==============\n";
__END__
・ユーザー名(email)とパスワード(password)は、mixi.yml

フォーマットは
 email: your@host.name
 password: yourpassword

・ログイン認証はWWW::Mechanize

ymlで取得したファイルからリファレンスで引数を渡してログイン
はじめはWWW::UserAgentで書こうとしていたのですが、form処理がよくわからなかったので、Mechanizeさんにやっていただいた。ちゃんと、勉強しないと・・・

・urlの抜き出しと記事の抜き出しは、Web::Scraper

配列に入れて、ループ処理させています。

実行結果。(URLとタイトルのみ表示させるようにしています)

#root@test:~/perl$date;perl mixinews_get.pl
2012年 2月 26日 日曜日 13:20:25 JST
login as your@host.name
http://news.mixi.jp/view_news.pl?id=1929030&media_id=84
RAG FAIRおっくんが顔面麻痺で入院、公式ブログで現在の病状を報告。
http://news.mixi.jp/view_news.pl?id=1928909&media_id=95
一人暮らしで良い点・悪い点
http://news.mixi.jp/view_news.pl?id=1928722&media_id=20
ミニチュアダックス10匹無残、女が飼育放棄か
http://news.mixi.jp/view_news.pl?id=1929109&media_id=42
アヤパン感涙、北川が愛妻にサプライズ新曲
http://news.mixi.jp/view_news.pl?id=1928837&media_id=131
『映画けいおん!』出演の声優は、元「ボキャブラ」芸人だった
http://news.mixi.jp/view_news.pl?id=1928813&media_id=95
男性に対して「器が小さい」と感じた瞬間
http://news.mixi.jp/view_news.pl?id=1929147&media_id=47
ポケモン、シリーズ最新作『ポケットモンスター ブラック2・ホワイト2』発表!発売は6月
http://news.mixi.jp/view_news.pl?id=1928742&media_id=45
ダメ嫁役がハマると思う女優ランキング
http://news.mixi.jp/view_news.pl?id=1928895&media_id=20
配偶者控除廃止、撤回を示唆…岡田副総理
http://news.mixi.jp/view_news.pl?id=1928732&media_id=2
<客引き>大阪・ミナミで横行 半年で苦情1135件
http://news.mixi.jp/view_news.pl?id=1929135&media_id=8
アヤパン披露宴に小田、さだ、ユーミン…
http://news.mixi.jp/view_news.pl?id=1928657&media_id=20
小学校で給食用エレベーター落下、作業員死亡
http://news.mixi.jp/view_news.pl?id=1928880&media_id=20
被災中学生に迫られ…平野復興相「胸にグサッ」
http://news.mixi.jp/view_news.pl?id=1928707&media_id=62
保温対策を!冬のネコちゃんケアをおさらい
http://news.mixi.jp/view_news.pl?id=1928693&media_id=95
不調を招く! 目の酷使が日常的になっていませんか?
http://news.mixi.jp/view_news.pl?id=1928804&media_id=121
プロのカメラマンに聞く、料理写真をおいしそうに撮る方法
http://news.mixi.jp/view_news.pl?id=1928784&media_id=54
野見隆明、“日本アカデミー新人賞”に大喜び「まだ信じられない」
http://news.mixi.jp/view_news.pl?id=1929262&media_id=20
東京マラソン、藤原新が2位…川内は14位
http://news.mixi.jp/view_news.pl?id=1929077&media_id=76
告白したいとき、背中を押してくれる「片思いソング」9パターン
http://news.mixi.jp/view_news.pl?id=1928717&media_id=4
「1票格差」違法状態に=遠のく合意、解散時期に影響も―衆院選挙制度
==============END==============
#root@naka01:~/perl$

感想

・前回に引き続き、Web::Scraperを活用しました。サイトの巡回とかしながら動画のみを自動ダウンロードすることも可能な、そんな素敵なモジュール:)