前回、Yahoo!掲示板から「トランペット」関連の話題をピックアップ下のに続いて、次は「未来検索Livedoor」で同様の奴をやってみました。また下のほうにあるので、よろしければどうぞ。RSSの取得元は未来検索livedoorです。
ちなみに未来検索livedoorヘルプページによると、未来検索とは
未来検索 livedoorとはアラート(お知らせ)機能つきのBlog検索エンジンです。
未来検索livedoorの検索対象は日本国内のすべてのBlogです。
もちろん使用しているツールの種類やpingを送信しているかどうかも問いません。
です。つまりは横断Blog検索エンジンですね。
要領は前の
ようやっとiTunesMusicStoreのRSSを弄ってみた。【トランペットブログ"Horagay"】 http://www.horagay.com/archives/000200.html
Yahoo!掲示板からトランペットを検索【トランペットブログ"Horagay"】 http://www.horagay.com/archives/000202.html
と全く同じでしたが…
未だにエンコード周りが分からずいきあたりばったりで文字化けを直したり、ファイルハンドラにDATAを使わないとエラーが出るのがなぜか未だに分からんかったりと、散々ですヾ('A`)ノ
そしてcron上手くいってない予感…。
またソースのっけておきます…
#!/usr/bin/perl -I ./lib
#未来検索LivedoorのRSSを取得して、JS形式で表示する。
#cronでまわす。
#burazil_parse.pl
#[IN] : http://rss.sf.livedoor.com/search?q=%a5%c8%a5%e9%a5%f3%a5%da%a5%c3%a5%c8&sf=update_date&start=0
use strict ;
use Encode ;
use LWP::Simple ;
use XML::RSS ;
use HTML::Template ;
use encoding 'euc-jp' , STDOUT => 'UTF-8' ;
#ローカルにRSSをミラーする
my $url ="http://rss.sf.livedoor.com/search?q=%a5%c8%a5%e9%a5%f3%a5%da%a5%c3%a5%c8&sf=score&start=0" ;
my $local_path = "miraikensaku.rss" ;
mirror($url , $local_path) or die "I can't get data from $url\n" ;
#それをParseする。
my $rss = new XML::RSS ;
eval{
$rss -> parsefile( $local_path ) ;
};
warn "Error when parsing : $rss" ;
my @item_list ;
foreach ( @{$rss -> items} ){
my $title = $_ -> {title} ;
my $link = $_ -> {link} ;
my $description = $_ -> {description} ;
push @item_list , { title => $title , link => $link , description => $description
} ;
}
#テンプレートに。
my $template = HTML::Template -> new( filehandle => \*DATA ) ;
$template ->param( items => \@item_list ) ;
my $output = $template -> output() ;
open ( JS , ">mirai.js");
my @line = split/\n/ , $output ;
for ( @line ){
s/\x27/'/g ;
#Encode::encode("utf-8" , $_ );
print JS "document.writeln('$_') ; \n" ;
}
close JS ;
exit(0);
#テンプレート
__DATA__
<div id="miraikensaku_list">
<dl>
<TMPL_LOOP name=items>
<dt>■<a href="<TMPL_VAR name=link escape=HTML>" target="_blank"><TMPL_VAR
name=title escape=HTML></a></dt>
<dd><TMPL_VAR name=description escape=HTML></dd></TMPL_LOOP></dl>
</div>
早く進歩せんと…
Yahoo!掲示板で「トランペット」を検索した結果を表示するPerlスクリプトを書きました。
下のほうにさりげなくありますので、よろしければどうぞ。
”■Yahoo掲示板から「トランペット」を含む書き込みをピックアップ!”って奴です。
具体的には
Yahoo!掲示板・検索オプション
http://messages.yahoo.co.jp/soptions.html
から…
RSSを0.91じゃなくて0.9で宣言していて、ずっとdescriptionが出力されないことに頭を悩ませたり…いやはや先は長いです。いつの日かBlog Hackerになれるかなー。
ソースを載せておきます。ツッコミ大歓迎です(´・ω・`)ノ
でも、このまま使うのは危険な気がしますので、参考にすることはお勧めしません。なんないと思うけど。
#!/usr/bin/perl -I ./lib
#Yahoo!掲示板のパースをして、RSSに変換する。
#そして、JS形式で出力。
use strict ;
use LWP::Simple ;
use XML::RSS ;
use Encode ;
use encoding 'euc-jp' , STDOUT => 'UTF-8' ; #正直文字コード周りがワケワカメ
use HTML::Template ;
#まずは掲示板のデータをLWP::SimpleでGET
my $url = "http://search.mb.yahoo.co.jp/search?p=%a5%c8%a5%e9%a5%f3%a5%da%a5%c3%a5%c8&M=&R=yahoo%2Fentertainment" ;
my $rowdata = LWP::Simple::get( $url ) ;
$rowdata = decode('EUC-JP' , $rowdata) ;
#print $rowdata ;
#XMLを作っていく。
my $rss = XML::RSS -> new (
version => 0.91 ,
encode_output => 0 ,
);
$rss -> channel(
title => 'Yahoo!BBS search for trumpet RSS' ,
link => 'http://search.mb.yahoo.co.jp/' ,
description => 'Yahoo!掲示板の「トランペット」での検索結果のRSS' ,
language => 'ja' ,
);
#rssに、マッチされたものを入れていく。
my $regex = q{<UL><LI>\n<a href="(.+?)">(.+?)</a><br>(.+?)<BR>.+?</LI></UL>}
;
my @save_hash ;
while( $rowdata =~ m/$regex/gs){
$rss -> add_item(
link => $1 ,
title => $2 ,
description => $3 ,
);
push @save_hash , { link => $1 , title => $2 , description => $3 } ;
}
#ひとまず、RSSを出力。
open (RSS , ">yahoobbs.rss") ;
print RSS $rss -> as_string() ;
close RSS ;
#続いて、控えておいたデータでJavaScriptを出力
foreach ( @{@save_hash} ){
$_ -> {description} =~ s/<.*?>//g ;
}
#続いて、JSを出力するのでとりあえずHTML::Template
my $template = HTML::Template -> new( filehandle => \*DATA ) ;
$template -> param(item => \@save_hash ) ;
my @lines = split /\n/ , $template -> output() ;
open (JS , ">yahoo_bbs.js") ;
for (@lines){
s/\x27/'/g ; #シングルクォテーションをエスケープ。10進数表記では上手くいかないのは何故…
Encode::encode("utf-8" , $_ );
print JS "document.writeln('$_') ; \n" ;
}
close JS ;
exit(0);
__DATA__
<div class="yahoo_bbs">
<dl>
<TMPL_LOOP name = item >
<dt><a href="<TMPL_VAR name = link escape = HTML >"><TMPL_VAR
name = title escape = HTML ></a></dt>
<dd><TMPL_VAR name = description escape = HTML ></dd></TMPL_LOOP></dl>
</div>
何とかiTunes Music StoreのRSSを利用して、Blues, Classical, Jazz、Latinの中でのトップ10アルバムを表示してみました。右下のほうにちょこんとありますので、よろしければ。
#[加工元のIMSのRSS生成サイト]iTunes Music Store RSS Generator
しかしまだ、名前と概説しかのっけられてません…とりあえず、アルバム紹介へのリンクを貼りたいのですが、RSSに含まれてるデータは、iTunes Music Storeへのリンクなので、載せたとしてもいきなりiTunesが起動されるか、インストールすらされていなければどうなるかもわかりません代物で(^_^;
何はともあれ…
、MSN MusicはRSSを吐くらしいのエントリーで、oscarblogさんにiTunesのRSSについてコメントをもらって、よっしゃいっちょやってみようと思ってから、軽く1月半以上…
仕事で使えた方が今後いいだろうということで、「Amazon.co.jp: 本: Blog Hacks ―プロが教えるテクニック&ツール100選」を買って見たものの、どうやら簡単に出来るものではなく、きちんと(?)PerlやらXMLやらやっておかないと無理な予感。
しょうがないので一念発起して、オライリーの『初めてのPerl』やら『プログラミングPerl』やら買い込んで、仕事の合間にカリカリやってきました…いやはや3日開けると忘れてる忘れてる…学生のころはもっと覚えも集中力もあったような…と思いつつ何とかBlogHackのドアを叩けるようになりました(-_-;
何か面白いことが出来るように精進せねば…何か要望などありましたらどうぞコメントくださいませ。そして、oscarblogさん改めてありがたうございました。
後はcrontabとシェルスクリプトがちゃんと動いてるかどうかだ…
ソースを載せておきます。ツッコミ大歓迎です(´・ω・`)ノ
でも、このまま使うのは危険な気がしますので、参考にすることはお勧めしません。なんないと思うけど。
#!/usr/bin/perl -I ./lib
#iTunesのRSSを取り込んでJavaScriptで出力するPerlScript
#定期的にこのscriptをcronで回して更新。
#itunes_parse.pl
#
#<IN> $feedRss : FeedするRSS。http://phobos.apple.com/WebObjects/MZSearch.woa/wo/9.1から生成
#<OUT> itunes_rss.jsファイル。
use strict
use XML::RSS
use LWP::Simple
use HTML::Template
use Encode ;
#対象RSSをLWPでGET。
my $target_rss = "http://ax.phobos.apple.com.edgesuite.net/WebObjects/MZStore.woa/wpa/
MRSS/topalbums/sf=143441/genre=9060000/limit=10/rss.xml"
my $local_path = "itunes.rss"
my $res = LWP::Simple::mirror ($target_rss => $local_path) or die "Cant
locate RSS ..." ;
#GETしたRSSをXML::RSSモジュールでParse。
my $rss = new XML::RSS
$rss -> parsefile($local_path) ;
#各要素を取り出していく
my $channel = $rss->channel
my $items = $rss->items ;
my @item_list
foreach (@$items){
my $title = $_ -> {title}
my $description = $_ -> {description}
push @item_list , { title => $title , description => $description }
}
#HTML::Templateで、出力していく
my $template = HTML::Template -> new( filehandle => \*DATA );
#paramaterの設定
$template -> param (
maintitle => $rss -> {channel} -> {description} ,
items => \@item_list ,
) ;
#binmodeでSTDOUTのエンコーディング指定
#binmode STDOUT , ":encoding('utf-8')" ;
#Javascriptで出力する際に、クオテーションが問題になるらしいので
#エスケープしておく。エスケープ、エンコーディング周りはよくワカランです…
my @lines = split /\n/ , $template->output()
open (JS , ">itunes_rss.js")
for( @lines ){
s/\x27/'/g
print JS "document.writeln('$_') ; \n "
}
close JS
exit(0);
#ここからテンプレート
__DATA__
<div id="itunes_list">
<h3><TMPL_VAR name=maintitle escape=HTML></h3>
<dl>
<TMPL_LOOP name=items>
<dt><TMPL_VAR name=title escape=HTML></dt>
<dd><TMPL_VAR name=description escape=HTML></dd></TMPL_LOOP></dl>
</div>