M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2011年4月24日 02:38

新ジャグラBBの動画コンテンツの野良RSS

このエントリーをはてなブックマークに追加 mixiチェック

(旧ジャグラ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__

こっちを運用バージョンにしました。

投稿 大野 義貴 [RSS] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3566

コメントする