高度に回収頻度を多くした回収型RSSは生成型RSSと見分けがつかない
スポンサードリンク
というわけで、InDesignの勉強部屋のRSS生成を1分ごとにしてみました。
ついでにソース
#!/usr/bin/perl
use strict;
use LWP::Simple;
use XML::RSS;
use HTML::Entities;
use utf8;
use Encode;
my $url = 'http://cgi.www5c.biglobe.ne.jp/%7ethats/study_bbs/study.cgi';
my $html = get($url);
my $length_current = length( $html );
my $length_before;
{
open my $fh, '<', 'indesign.bytes' or $length_before = 0;
if ( $length_before ne 0 ) {
$length_before = <$fh>;
close $fh;
}
}
exit 1 if $length_before eq $length_current;
{
open my $fh, '>', 'indesign.bytes';
print $fh $length_current;
close $fh;
}
$html = decode('Shift_JIS', $html);
$html =~tr|\x00-\x1f||d;
my $rss = XML::RSS->new;
$rss->add_module(
prefix => 'content',
uri => 'http://purl.org/rss/1.0/modules/content/'
);
$rss->channel(
title => 'InDesignの勉強部屋',
link => $url,
description => "InDesignの勉強部屋 最新RSS",
language => 'ja',
);
# HTML から要素抽出
(my $Regex = <<'REGEX') =~ tr/\n//d;
<td .+?><font color="#006400"><b>(.+?)</b></font> / (.+?)
<td.+?<blockquote>(.+?)</blockquote></font></td></tr>
</table>.+?<div align='right'>No\..+? (.+?)</div></td></tr></table>
REGEX
while ($html =~ m/$Regex/gs) {
my $title = $1;
my $name = $2;
my $description = $3;
my $date = $4;
my $temp = normalize(" $description");
my $dcdate = datecheck($date);
$rss->add_item(
link => encode_entities( $url . "#$dcdate" ),
title => normalize(" $title"),
description => normalize2(" $description"),
dc => {
date => $dcdate,
creator => normalize2($name),
},
content => {
encoded => "<![CDATA[$description]]>",
},
);
}
# 日付ソート
@{$rss->{'items'}} =
sort { $b->{dc}->{date} cmp
$a->{dc}->{date} } @{$rss->{'items'}};
# 表示or出力
if ( $ENV{GATEWAY_INTERFACE} ) {
require CGI;
print CGI::header('text/xml; charset=utf-8');
print encode('utf8', $rss->as_string() );
}
else {
# print encode('utf8', $rss->as_string() );
$rss->save('indesign.xml');
}
exit 0; #正常終了(RSS生成済み)
sub normalize {
local $_ = shift;
s/^ //g;
tr|\x00-\x1f||d;
return $_;
}
sub normalize2 {
local $_ = shift;
tr|\x00-\x1f ||d;
s/<(?:[^>'"]*|(['"]).*?\1)*>//gs;
return $_;
}
sub datecheck {
local $_ = shift;
tr#/#-#d;
s/\(.+\) /T/g;
s/$/+09:00/g;
return $_;
}
これを、cronで1分ごとに起動するシェルスクリプトから起動するようにしておき、戻り値で、公開サイトにアップロードしたりしなかったり分岐しています。
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2182





![: 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)


コメントする