M.C.P.C.

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


| トップページ |

2007年12月21日 10:49

ga city 泉和人の世界の印刷ニュースのRSSを用意しました(野良feed)

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

http://blog.dtpwiki.jp/dtp/2007/12/post_7909.html#c16739440のコメントで要望があったga city [www.ga-city.com] の中のコンテンツ、泉和人の世界の印刷ニュース [www.ga-city.com] をRSSにしました。

http://dtpwiki.jp/rss/gacitynews.xml

今回のフィードの生成スクリプトはこちら。仕事でWeb::Scraper使ったのでその流れで使ってみました。

Filename: gacitynews.pl

#!/usr/bin/perl
 
use strict;
use warnings;
use Encode;
use LWP::UserAgent;
use utf8;
use URI;
use Web::Scraper;
binmode STDOUT => ':utf8';
 
 
# main routine
#
my $urls = get_urls();
my $entries;
foreach my $url ( @$urls ) {
  my $result = get_page($url);
  $result->{'link'} = $url;
  push @$entries, $result;
}
my $xml = make_rss($entries);
print $xml;
 
exit;
 
 
# get_url: ニューストップページから個別ニュースページへのURLを取得
# (cp932->utf8: via http://subtech.g.hatena.ne.jp/miyagawa/20070921/1190358092)
#
sub get_urls {
  my $uri = 'http://www.ga-city.com/showkazuto.php';
  my $scraper = scraper {
    process 'a.bluejtext',
      'entries_new[]' => {
        link       => '@href',
        description=> 'TEXT',
      };
    process 'a.pinktext',
      'entries_old[]' => {
        link       => '@href',
        description=> 'TEXT',
      };
    result 
      qw ( entries_new entries_old);
  };
  my $content = LWP::UserAgent->new->get($uri)->content;
  $content = decode('cp932', $content);
  my $items = $scraper->scrape(\$content, $uri);
  my $list;
  foreach my $item (@{$items->{'entries_new'}}) {
    push @$list, $item->{'link'};
  } 
  foreach my $item (@{$items->{'entries_old'}}) {
    push @$list, $item->{'link'};
  } 
  return $list;
}
 
 
# get_page: 個別ニュースページからFeed用データ取得
# (cp932->utf8: via http://subtech.g.hatena.ne.jp/miyagawa/20070921/1190358092)
# 平方メートル単位記号などが化けるので、ShiftJISではなくてcp932から変換した 
#
sub get_page {
  my $uri = shift;
  my $scraper = scraper {
    process 'tr>td.prepresstopbg1>span.whitebold', 
      'title' => 'TEXT';
    process 'tr>td.redtext',
      'date'  => sub{ 
                   dateconv($_->content_list())
                   # 時刻文字列変換
                 };
    process 'tr>td.graytext',
      'description' => 'TEXT',
      'content'     => 'RAW', # 表組などHTML組版生かすため
    ;
    result
      qw ( title date description content );
  };
  my $content = LWP::UserAgent->new->get($uri)->content;
  $content = decode('cp932', $content);
  my $items = $scraper->scrape(\$content, $uri);
  return $items;
}
 
 
# 日本語日付文字列(y年m月n日)からW3CDTF文字列に変換
# (via http://iandeth.dyndns.org/mt/ian/archives/000619.html)
#
sub dateconv {
  use DateTime::Format::Strptime;
  my $date = shift;
  my $strp = DateTime::Format::Strptime->new(
      pattern => '%Y年%m月%d日'# 文字列のパターンを指定
  );
  my $dt = $strp->parse_datetime($date);
  return "$dt";
}
 
 
# RSSを生成する
#
sub make_rss {
  use XML::RSS;
  my $entries = shift;
  my $rss = XML::RSS->new;
  $rss->add_module(
    prefix =>'content',
    uri    =>'http://purl.org/rss/1.0/modules/content/',
  );
  
  $rss->channel(
    title    => 'ga city:泉和人の世界の印刷ニュース',
    link     => 'http://www.ga-city.com/showkazuto.php',
    description => 'ga city:泉和人の世界の印刷ニュース 最新ニュース',
    language => 'ja',
    dc => {
      publisher    => 'ga city',
      contributor  => 'DTPWiki.jp',
    },
    syn => {
      updatePeriod    => 'monthly',
      updateFrequency => '2',
      updateBase      => '2007-12-01T17:00+09:00',
    },
  );
  
  foreach my $item (@$entries) {
    $rss->add_item(
      link  => $item->{'link'},
      title => $item->{'title'},
      description => $item->{'description'},
      dc => {
        date       => $item->{'date'},
        creator    => $item->{'creator'},
      },
      content => {
        encoded => "<![CDATA[$item->{'content'}]]>",
      },
    );
  }
  
  return $rss->as_string();
}

さて問題は、このスクリプトどの頻度で回転させるか、ということです。WatchDogもつくらなきゃいかんか。


(2008-9-20 13:21追記)

peacepact : 泉和人の世界の印刷ニュースの,泉和人氏が死去

ご冥福をお祈りします。
上記RSSの更新も停止いたします。

投稿 大野 義貴 [RSS] | |

トラックバック(0)

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

コメント(1)

ありがとうございます。
これで楽に巡回できますです;;

コメントする