MIZUNOTOMOAKI.COM
HACK - Perlとか

Blog::Parser - ブログのページを解析して様々な情報を得る

Perlモジュールです。
ブログのURIを渡すだけで、そのブログの内容を自動的に解析します。
ブログのタイトルやRSSの情報など、ブログの様々な情報を簡単に取得できます。
バージョンが1.02になりました(2007/10/30)。

ダウンロード

Blog_Parser.1.02.lzh

他に、以下のモジュールが必要です。

パッケージには以下が含まれています。
  • Parser.pm
  • blog_service_reg.txt

使い方

いちばん簡単な使い方。
use Blog::Parser;
my $blog = Blog::Parser->new('http://www.mizunotomoaki.com/')->parse();
if( $blog->is_error() ) {
    print $blog->errmsg(), "\n";
    return;
}
print 'ブログのタイトル: ', $blog->title(), "\n";
print 'ブログの概要: ', $blog->description(), "\n";
print '最終更新日: ', $blog->lastupdate(), "\n";
print 'RSSのURL: ', $blog->rssURI(), "\n";
print 'ブログサービス名: ', $blog->serviceName(), "\n";
print '最新記事のタイトル: ', $blog->latestTitle(), "\n";
print '最新記事のURL: ', $blog->latestURI(), "\n";

DEBUG用に、取得済の情報を一括表示するメソッドもあります。
use Blog::Parser;
my $blog = Blog::Parser->new('http://www.mizunotomoaki.com/')->parse();
print $blog->Dumper();

HTTP通信にキャッシュを利用するとリソースを節約できます。
use Blog::Parser;
my $blog = Blog::Parser->new('http://www.mizunotomoaki.com/');
$blog->useCache('/tmp/cache');
$blog->parse();
print $blog->Dumper();

パーマリンクを与えるとその記事のフィード情報もパースします。
use Blog::Parser;
my $blog = Blog::Parser->new('http://www.mizunotomoaki.com/2007/04/0001.html');
print '記事のタイトル: ', $blog->targetTitle(), "\n";
print '記事の概要: ', $blog->targetDescription(), "\n";

サンプル

Blog::Parserを使ったサンプル
ブログURLを入力すると、そのブログのタイトル、概要、最終更新日、RSSのURI、ブログサービス名を表示するCGIプログラム。

概要

ブログのURIを引数として渡すだけで、そのブログの様々な情報をプロパティとして取得できます。取得できる主な情報は以下です。
  • (RSS/Atomから取得した)ブログのタイトル、概要、最終更新日
  • 利用しているブログのサービス名
  • RSS/AtomのURI

RSS/AtomのURIは、HTMLをauto-discoveryして探します。
RSS/Atomの取得にはURI::Fetchを利用しているので、HTTP通信のリソースを無駄遣いしません。
RSS/Atomのフィードから取得した情報を、プロパティとして提供します。
モジュール内部でRSS/Atomのフォーマットの違いを吸収するため、利用の際はRSS/Atomのフォーマットの違いを意識させません。
さらに、HTMLを解析するので、RSS/Atomに記載されていない情報はHTMLから取得した情報で自動的に補完します。
返り値の文字コードはすべてUTF-8です。

このモジュールは、内部で下記のモジュールを利用しています。

メソッド/プロパティ

new() コンストラクタ
my $blog = Blog::Parser( 'http://example.jp/' );
または
my $blog = Blog::Parser(
    'http://example.jp/',
    BLOG_SERVICE_REG => 'blog_service_reg.txt',
    CACHE_ROOT => '/tmp/cache',
    RSSorAtom => 'rss',
);
第1引数のURIのみ必須です。
引数として以下の情報を指定できます。
下位ページのURIでも問題ありません。

BLOG_SERVICE_REG : ブログサービス一覧表ファイルのパス
CACHE_ROOT : HTTP通信用のキャッシュディレクトリ
RSSorAtom : 優先するRSSのタイプ(rss|atom)

HTTP通信でキャッシュを利用したい場合は、CACHE_ROOTを指定してください。
RSSorAtomを指定しない場合は、HTMLで最初に指定されているRSS/Atomの情報を利用します。

キャッシュ等は下記のように指定することもできます。
my $blog = Blog::Parser( 'http://example.jp/' );
$blog->useCache('/tmp/cache');
$blog->useBlogServiceReg('blog_service_reg.txt');
$blog->selectRSSorAtom('rss');
title() プロパティ
my $title = $blog->title();
ブログのタイトルを返します。
RSS/Atomが取得できた場合は、フィードの情報を返します。
RSS/Atomが指定されていないか取得できない場合は、HTMLの<title>タグの内容を返します。
description() プロパティ
my $description = $blog->description();
ブログの概要を返します。
RSS/Atomが取得できた場合は、フィードの情報を返します。
RSS/Atomが指定されていないか取得できない場合は、HTMLの<meta>タグの内容を返します。
lastupdate() プロパティ
my $lastupdate = $blog->lastupdate();
ブログの最終更新日時を返します。
RSS/Atomが取得できた場合は、フィードの情報を返します。
RSS/Atomが指定されていないか取得できない場合はundefを返します。
日時のフォーマットは、ISO(YYYY-MM-DD HH:MM:SS)形式のローカルタイムに自動的に変換します。
rssURI() プロパティ
my $rss_uri = $blog->rssURI();
ブログのRSSまたはAtomのURIを返します。
RSSとAtomのどちらを返すかは、new()コンストラクタの引数であらかじめ指定することができます。
指定しなかった場合は、HTMLで最初に指定されたRSS/AtomのURIを返します。
serviceName() プロパティ
my $service_name = $blog->serviceName();
ブログが利用しているサービス名(livedoorブログ、FC2ブログetc)を返します。
今のところ日本の主なサービスのみを対象としています。

URIルール→サービス名への変換表は自分で定義することもできます。
その場合はコンストラクタの引数で BLOG_SERVICE_REG を指定してください。
変換表のフォーマットは、このモジュールに同梱されている blog_service_reg.txt を参照してください。
topURI() プロパティ
my $top_uri = $blog->topURI();
ブログのトップページURIを返します。
ブログサービス系のブログであれば、ブログサービス名の変換表から算出したURIを返します。
RSSまたはAtomからURIを取得できた場合は、こちらの値を優先して返します。
latest*() プロパティ
my $latest_uri = $blog->latestURI();
my $latest_title = $blog->latestTitle();
my $latest_description = $blog->latestDescription();
my $latest_pubdate = $blog->latestPubdate();
my $latest_category = $blog->latestCategory();
my $latest_author = $blog->latestAuthor();
my $latest_guid = $blog->latestGUID();
my $latest_link = $blog->latestLink();
RSS/Atomのフィード情報から、最新のエントリの各情報を返します。
latestURI() ・・・ 最新エントリのパーマリンク
latestTitle() ・・・ 最新エントリのタイトル
latestPubdate() ・・・ 最新エントリの最終更新日時
latestCategory() ・・・ 最新エントリのカテゴリ
latestAuthor() ・・・ 最新エントリの著者
latestGUID() ・・・ 最新エントリのGUID
latestLink() ・・・ 最新エントリのパーマリンク(latestURI()と同値)
target*() プロパティ
my $target_uri = $blog->targetURI();
my $target_title = $blog->targetTitle();
my $target_description = $blog->targetDescription();
my $target_pubdate = $blog->targetPubdate();
my $target_category = $blog->targetCategory();
my $target_author = $blog->targetAuthor();
my $target_guid = $blog->targetGUID();
my $target_link = $blog->targetLink();
RSS/Atomのフィード情報から、引数で指定されたURLのエントリの各情報を返します。
targetURI() ・・・ 指定されたエントリのパーマリンク
targetTitle() ・・・ 指定されたエントリのタイトル
targetPubdate() ・・・ 指定されたエントリの最終更新日時
targetCategory() ・・・ 指定されたエントリのカテゴリ
targetAuthor() ・・・ 指定されたエントリの著者
targetGUID() ・・・ 指定されたエントリのGUID
targetLink() ・・・ 指定されたエントリのパーマリンク(latestURI()と同値)
feed()、latest()、target()プロパティ
my $feed = $blog->feed();
my $feed_title = $feed->title();
my $feed_description = $feed->description();
my $latest = $blog->latest();
my $latest_title = $latest->title();
my $latest_description = $latest->description();
my $target = $blog->target();
my $target_title = $target->title();
my $target_description = $target->description();
RSS/Atomのフィード情報を返します。
feed() ・・・ RSS/Atomのフィード情報
latest() ・・・ RSS/Atomのフィード情報から、最新のエントリの情報を返します。
target() ・・・ RSS/Atomのフィード情報から、指定されたエントリの情報を返します。
いずれも返り値はXML::FeedPPのインスタンスです。
XML::FeedPPの詳細は http://www.kawa.net/ を参照してください。
parse() メソッド
$blog->parse();
print 'ブログのタイトル: ', $blog->title(), "\n";
print 'ブログの概要: ', $blog->description(), "\n";
print '最終更新日: ', $blog->lastupdate(), "\n";
print 'RSSのURL: ', $blog->rssURI(), "\n";
print 'ブログサービス名: ', $blog->serviceName(), "\n";
print '最新記事のタイトル: ', $blog->latestTitle(), "\n";
print '最新記事のURL: ', $blog->latestURI(), "\n";
全ての情報を一括で取得します。
parse()メソッドを実行する前にtitle()等のプロパティを参照しても問題はありません。
※バージョン0.92までは”getAll()”という名称でしたが、バージョン1.00からは”parse()”に変更しました。なお、バージョン1.00以降もgetAll()メソッドは利用できます。
is_error() プロパティ
my $blog = Blog::Parser->new('http://www.mizunotomoaki.com/')->parse();
if( $blog->is_error() ) {
    print $blog->errmsg(), "\n";
    return;
}
引数として渡すURLが不正な場合や、URI::Fetchに失敗した場合に、このプロパティは真を返します。
エラー内容は errmsg() プロパティで取得できます。
errmsg() プロパティ
エラーが発生した場合のエラーメッセージを返します。
Dumper() メソッド
print $blog->Dumper();
print $blog->Dumper('HTML');
$blogオブジェクトの現時点での内容をテキスト形式にダンプします。
第1引数で'HTML'を指定した場合は、HTML形式で出力されます。

処理途中で取得した値が$blog->{KEY}のHASHに格納されていることが確認できます。

その他

現在のバージョンは 1.01 です。
バージョン0.9xを経て、現在、実環境で稼動させた結果を順次フィードバックしています。
バグはまだあるかも?

利用について

商用・非商用に関わらず自由にお使いください。
商用の場合はいろいろとお手伝いもできますのでご一報いただければ幸いです。
連絡先 →info@mizunotomoaki.com

更新履歴

  • 2006/12/06 - ver 0.90 最初のバージョン
  • 2007/01/16 - ver 0.91 title()プロパティ、description()プロパティの不具合修正、is_error()プロパティ、errmsg()プロパティ追加
  • 2007/01/17 - ver 0.92 lastupdate()プロパティの不具合修正
  • 2007/04/09 - ver 1.00 バグFIX、内部処理の方式を変更
  • 2007/04/12 - ver 1.01 パーマリンクを与えた場合はその記事のフィードもパースする
  • 2007/10/30 - ver 1.02 RSSにエントリが何もない場合にもエラーを出さない

コメント

コメントはこちらからどうぞ!
  • テストさん ・・・ 2007/03/25 20:31:05
    テストテスト
    こんにちは
  • singoさん ・・・ 2007/04/05 23:24:39
    はじめまして、自分はまだ初心者なんですが、このモジュールでAtomURLをとるにはどうすればいいでしょうか、よろしくお願い致します。
  • singoさん ・・・ 2007/04/05 23:29:07
    たびたびすみません、自己解決しました。いまはまだ自分でサーバーを建ってて、Blogやいろいろのサービスを勉強中なので、よろしくお願い致します。
  • ミズノさん ・・・ 2007/04/09 16:05:04
    singoさんこんにちは。細かいバグを修正したバージョン1.00をアップしました。今度ともよろしくお願いします。
  • こりさんさん ・・・ 2008/07/14 08:56:49
    お世話になっています。
    使わせていただいているのですが、次のプログラムでエラーが出ます。
    たいていのブログでは問題ないのですが。。

    #!/usr/local/bin/perl

    use Jcode;
    use Blog::Parser;
    my $url = "http://ameblo.jp/sunsuntaiyo/";
    my $blog = Blog::Parser->new($url)->parse();

    if( $blog->is_error() ) {
    $ermsg = $blog->errmsg();
    }

    exit;
  • ミズノさん ・・・ 2008/07/15 03:32:17
    こんにちは!杉浦太陽 !

    具体的にはどういったエラーがでますでしょうか?
    このページの「サンプル」の項目にあるサンプルページでは、特に問題なく情報を取得できているようです。

トラックバック

トラックバックURL: http://www.mizunotomoaki.com/tb.cgi/hack/blog_parser.html

目次

ブログのページを解析して様々な情報を取得できるPerlモジュールです。 (2007/04/09)
ウィキペディアから抽出した「今日は何の日」情報のXMLを提供するAPIです。 (2006/10/24)
「今日は何の日」APIを使ったブログパーツです。 (2007/05/20)
JavaScriptでFlashPlayerのバージョンを取得するサンプルです。 (2007/11/01)