新ジャグラ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
コメントする