新ジャグラBBの動画コンテンツの野良RSS
スポンサードリンク
(旧ジャグラBBの時の記事はこちら)
社団法人日本グラフィックサービス工業会(JaGra)さんのウェブサイト
社団法人日本グラフィックサービス工業会 [JaGra] [www.jagra.or.jp]
には、RSSがあるのに、新ジャグラBB
ジャグラBB - 印刷業のためのWebラーニングサイト:HOME [www.jagrabb.net]
には、RSSがなくて、とても残念です。
~~~
そこで、新ジャグラBBのページをRSSに変換しました(野良RSSです)。
新ジャグラBB 動画コンテンツ [dtpwiki.jp]
1時間に1回の間欠取得です。
JaGraさんが、RSS配信を始めるまでお使いください。無理な気がしますが。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use DateTime::Format::HTTP;
use Encode;
use URI;
use Web::Scraper;
use XML::Feed;
use YAML;
my $link = 'http://www.jagrabb.net/';
my $uri = URI->new( $link );
my $scraper = scraper {
process '//div[@id="news"]//div[@class="box"]', 'items[]' => scraper {
process '.title', title => 'TEXT';
process '.title>a', url => '@href';
process '.date', date => [ 'TEXT',
sub {
s/^.+公開日//;s{[^\d]}{-}g;
return DateTime::Format::HTTP->
parse_datetime($_)->
set_time_zone('Asia/Tokyo');
}
];
}
};
my $result = $scraper->scrape($uri);
my $list;
foreach my $item ( @{$result->{items}} ) {
my $uri = URI->new( $item->{url});
my $scraper = scraper {
process '//div[@id="naiyou-inner"]//div[@class="txt"]', content => 'HTML';
process '//div[@id="naiyou-inner"]//div[@class="txt"]', summary => 'TEXT';
};
my $result = $scraper->scrape($uri);
$item->{content} = $result->{content};
$item->{summary} = $result->{summary};
push @$list, $item;
}
my $feed = XML::Feed->new( 'RSS',
version => '1.0', encode_output => 0 );
$feed->title( 'ジャグラBB 動画コンテンツ' );
$feed->description( 'ジャグラBBの最新動画一覧' );
$feed->author('DTPWiki.jp');
$feed->language('ja');
$feed->copyright('社団法人日本グラフィックサービス工業会');
$feed->link( $link );
foreach my $item ( @$list ) {
my $entry = XML::Feed::Entry->new( 'RSS' );
$entry->title ( $item->{title} );
$entry->link ( $item->{url} );
$entry->summary( $item->{summary} );
$entry->content( "<![CDATA[$item->{content}]]>", );
$entry->issued ( $item->{date} );
$feed->add_entry( $entry );
}
if ($ENV{GATEWAY_INTERFACE}) {
print "Content-Type: text/xml; charset=UTF-8;\n\n";
}
print encode_utf8( $feed->as_xml);
exit;
__END__
印刷業界にRSSを定着させたいんですけれども、どうすればいいんでしょうね。
(2011-04-24 12:05追記)
一寝したら、もうちょっと工夫できることに気付いた。
トップページではなくて、番組一覧で探す(http://www.jagrabb.net/contents_list.aspx)から取得したほうが簡単である。そういう観点で作り直したのが以下のスクリプト。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use DateTime::Format::HTTP;
use Encode;
use URI;
use Web::Scraper;
use XML::Feed;
use YAML;
my $link = 'http://www.jagrabb.net/contents_list.aspx' ;
my $base_url = 'http://www.jagrabb.net/' ;
my $uri = URI->new( $link );
my $scraper = scraper {
process '//table[@id="contents-list"]', 'items[]' => scraper {
process '//td[@class="c txt"]/a', url => '@href';
process '//span[@class="images"]/img', img => '@src';
process '//div[text()=~/公開日/]', date => [ 'TEXT',
sub {
tr/[公開日]//d; s{[^\d]}{-}g;
return DateTime::Format::HTTP->
parse_datetime($_)->
set_time_zone('Asia/Tokyo');
}
];
};
};
my $result = $scraper->scrape($uri);
my $list;
foreach my $item ( @{$result->{items}} ) {
my $uri = URI->new( $item->{url});
my $scraper = scraper {
process '//div[@id="naiyou"]//div[@class="txt"]', content => 'HTML', summary => 'TEXT';
process '//div[@id="propaty"]//div[text()=~/カテゴリ/]/../div[@class="detail"]/img', category => '@alt';
process '//h2', title => 'TEXT';
};
my $result = $scraper->scrape($uri);
push @$list, {%$item, %$result};
}
my $feed = XML::Feed->new( 'RSS', version => '1.0', encode_output => 0 );
$feed->title( 'ジャグラBB 動画コンテンツ' );
$feed->description( 'ジャグラBBの最新動画一覧' );
$feed->author('DTPWiki.jp');
$feed->language('ja');
$feed->copyright('社団法人日本グラフィックサービス工業会');
$feed->link( $base_url );
$feed->modified( $list->[0]->{date} );
foreach my $item ( @$list ) {
my $entry = XML::Feed::Entry->new( 'RSS' );
$entry->title ( $item->{title} );
$entry->link ( $item->{url} );
$entry->summary( $item->{summary} );
$entry->content( qq(<![CDATA[<p><img src="$item->{img}" /></p>$item->{content}]]>) );
$entry->issued ( $item->{date} );
$entry->category($item->{category});
$feed->add_entry( $entry );
}
if ($ENV{GATEWAY_INTERFACE}) {
print "Content-Type: text/xml; charset=UTF-8;\n\n";
}
print encode_utf8( $feed->as_xml);
exit;
__END__
んで、XML::Feedを使うと、RSSに画像を付けるとかちょっと凝ったことができないみたいなので、餅は餅屋、ということで、XML::RSSを使ったのが以下のスクリプト。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use DateTime::Format::HTTP;
use Encode;
use URI;
use Web::Scraper;
use XML::RSS;
use YAML;
my $link = 'http://www.jagrabb.net/contents_list.aspx' ;
my $base_url = 'http://www.jagrabb.net/' ;
my $uri = URI->new( $link );
my $scraper = scraper {
process '//table[@id="contents-list"]', 'items[]' => scraper {
process '//td[@class="c txt"]/a', url => '@href';
process '//span[@class="images"]/img', img => '@src';
process '//div[text()=~/公開日/]', date => [ 'TEXT',
sub {
tr/[公開日]//d; s{[^\d]}{-}g;
return DateTime::Format::HTTP->
parse_datetime($_)->
set_time_zone('Asia/Tokyo');
}
];
};
};
my $result = $scraper->scrape($uri);
my $list;
foreach my $item ( @{$result->{items}} ) {
my $uri = URI->new( $item->{url});
my $scraper = scraper {
process '//div[@id="naiyou"]//div[@class="txt"]', content => 'HTML', summary => 'TEXT';
process '//div[@id="propaty"]//div[text()=~/カテゴリ/]/../div[@class="detail"]/img', category => '@alt';
process '//h2', title => 'TEXT';
};
my $result = $scraper->scrape($uri);
push @$list, {%$item, %$result};
}
my $rss = XML::RSS->new(version => "1.0" ,encode_output => 0 );
$rss->add_module( prefix=>'content', uri=>'http://purl.org/rss/1.0/modules/content/',);
$rss->add_module( prefix=>'annotate', uri=>'http://purl.org/rss/1.0/modules/annotate/',);
$rss->channel(
title => 'ジャグラBB 動画コンテンツ',
link => $base_url,
description => 'ジャグラBBの最新動画一覧',
language => 'ja',
dc => {
publisher => '社団法人日本グラフィックサービス工業会',
contributor => 'DTPWiki.jp',
rights => '社団法人日本グラフィックサービス工業会',
creator => '社団法人日本グラフィックサービス工業会',
},
syn => {
updatePeriod => 'dairy',
updateFrequency => '1',
},
);
$rss->image(
title => 'ジャグラBB 動画コンテンツ',
url => 'http://www.jagrabb.net/img/logo-jagraBB.gif',
link => $base_url,
);
foreach my $item (@$list) {
$rss->add_item(
link => $item->{url},
title => $item->{title},
description => $item->{summary},
dc => {
date => $item->{date},
subject => $item->{category},
},
content => {
encoded => qq(<![CDATA[<p><img src="$item->{img}" /></p>$item->{content}]]>),
},
);
}
if ($ENV{GATEWAY_INTERFACE}) {
print "Content-Type: text/xml; charset=UTF-8;\n\n";
}
print encode_utf8( $rss->as_string() );
exit;
__END__
こっちを運用バージョンにしました。
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3566





![: Amazon.co.jp: プラスティック・メモリーズ 1【完全生産限定版】(イベントチケット優先販売申込券付) [Blu-ray]](/lists/_9/B00VWX66E8.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 2【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66K2.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 3【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6MV0.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 4【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66IO.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 5【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6Y0E.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 6【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX69D6.jpg)


コメントする