Blog::Parser - ブログのページを解析して様々な情報を得る
ブログのURIを渡すだけで、そのブログの内容を自動的に解析します。
ブログのタイトルやRSSの情報など、ブログの様々な情報を簡単に取得できます。
本文や画像が取得できるようになって、バージョンが1.03になりました(2008/09/27)。
ダウンロード
Blog_Parser.1.03.lzh
他に、以下のモジュールが必要です。
パッケージには以下が含まれています。
他に、以下のモジュールが必要です。
- HTML::TagParser(c.f. http://www.kawa.net/)
- XML::FeedPP(c.f. http://www.kawa.net/)
- XML::TreePP(c.f. http://www.kawa.net/)
- URI
- URI::Fetch
- HTTP::Date
- Text::Diff
パッケージには以下が含まれています。
- Parser.pm
- blog_service_reg.txt
- exclude_image.txt
使い方
いちばん簡単な使い方。
DEBUG用に、取得済の情報を一括表示するメソッドもあります。
HTTP通信にキャッシュを利用するとリソースを節約できます。
パーマリンクを与えるとその記事のフィード情報もパースします。
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";
print '最新記事の概要: ', $blog->latestDescription(), "\n";
print '最新記事の本文: ', $blog->latestContents(), "\n";
print '最新記事の画像URL: ', $blog->latestImage(), "\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";
print '記事の本文: ', $blog->targetContents(), "\n";
print '記事の画像URL: ', $blog->targetImage(), "\n";
サンプル
概要
ブログのURIを引数として渡すだけで、そのブログの様々な情報をプロパティとして取得できます。取得できる主な情報は以下です。
RSS/AtomのURIは、HTMLをauto-discoveryして探します。
通信にはURI::Fetchを利用しているので、HTTP通信のリソースを無駄遣いしません。
RSS/AtomフィードやHTMLそのものから取得した情報を、プロパティとして提供します。
モジュール内部でRSS/Atomのフォーマットの違いを吸収するため、利用の際はRSS/Atomのフォーマットの違いを意識させません。
さらに、HTMLそのものを解析するので、RSS/Atomに記載されていない情報はHTMLから取得した情報で自動的に補完します。
返り値の文字コードはすべてUTF-8です。
このモジュールは、内部で下記のモジュールを利用しています。
- (RSS/Atomから取得した)ブログのタイトル、概要、最終更新日
- (HTMLから取得した)記事の本文、画像
- 利用しているブログのサービス名
- RSS/AtomのURI
RSS/AtomのURIは、HTMLをauto-discoveryして探します。
通信にはURI::Fetchを利用しているので、HTTP通信のリソースを無駄遣いしません。
RSS/AtomフィードやHTMLそのものから取得した情報を、プロパティとして提供します。
モジュール内部でRSS/Atomのフォーマットの違いを吸収するため、利用の際はRSS/Atomのフォーマットの違いを意識させません。
さらに、HTMLそのものを解析するので、RSS/Atomに記載されていない情報はHTMLから取得した情報で自動的に補完します。
返り値の文字コードはすべてUTF-8です。
このモジュールは、内部で下記のモジュールを利用しています。
- HTML::TagParser(c.f. http://www.kawa.net/)
- XML::FeedPP(c.f. http://www.kawa.net/)
- XML::TreePP(c.f. http://www.kawa.net/)
- URI
- URI::Fetch
- HTTP::Date
- Text::Diff
メソッド/プロパティ
new() コンストラクタ
引数として以下の情報を指定できます。
下位ページのURIでも問題ありません。
BLOG_SERVICE_REG : ブログサービス一覧表ファイルのパス
EXCLUDE_IMAGE : 除外画像URL一覧表ファイルのパス
CACHE_ROOT : HTTP通信用のキャッシュディレクトリ
RSSorAtom : 優先するRSSのタイプ(rss|atom)
USER_AGENT : 通信時に利用するUserAgent名
HTTP通信でキャッシュを利用したい場合は、CACHE_ROOTを指定してください。
RSSorAtomを指定しない場合は、HTMLで最初に指定されているRSS/Atomの情報を利用します。
これらの設定は下記のように指定することもできます。
my $blog = Blog::Parser( 'http://example.jp/' );または
my $blog = Blog::Parser(
'http://example.jp/',
BLOG_SERVICE_REG => 'blog_service_reg.txt',
EXCLUDE_IMAGE => 'exclude_image.txt',
CACHE_ROOT => '/tmp/cache',
CACHE_ROOT => '/tmp/cache',
USER_AGENT => 'Blog-Parser/1.03',
);
第1引数のURIのみ必須です。引数として以下の情報を指定できます。
下位ページのURIでも問題ありません。
BLOG_SERVICE_REG : ブログサービス一覧表ファイルのパス
EXCLUDE_IMAGE : 除外画像URL一覧表ファイルのパス
CACHE_ROOT : HTTP通信用のキャッシュディレクトリ
RSSorAtom : 優先するRSSのタイプ(rss|atom)
USER_AGENT : 通信時に利用するUserAgent名
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->useExcludeImage('exclude_image.txt');
$blog->selectRSSorAtom('rss');
$blog->setUserAgent('Blog-Parser/1.03');
title() プロパティ
RSS/Atomが取得できた場合は、フィードの情報を返します。
RSS/Atomが指定されていないか取得できない場合は、HTMLの<title>タグの内容を返します。
my $title = $blog->title();ブログのタイトルを返します。
RSS/Atomが取得できた場合は、フィードの情報を返します。
RSS/Atomが指定されていないか取得できない場合は、HTMLの<title>タグの内容を返します。
description() プロパティ
RSS/Atomが取得できた場合は、フィードの情報を返します。
RSS/Atomが指定されていないか取得できない場合は、HTMLの<meta>タグの内容を返します。
my $description = $blog->description();ブログの概要を返します。
RSS/Atomが取得できた場合は、フィードの情報を返します。
RSS/Atomが指定されていないか取得できない場合は、HTMLの<meta>タグの内容を返します。
lastupdate() プロパティ
RSS/Atomが取得できた場合は、フィードの情報を返します。
RSS/Atomが指定されていないか取得できない場合はundefを返します。
日時のフォーマットは、ISO(YYYY-MM-DD HH:MM:SS)形式のローカルタイムに自動的に変換します。
my $lastupdate = $blog->lastupdate();ブログの最終更新日時を返します。
RSS/Atomが取得できた場合は、フィードの情報を返します。
RSS/Atomが指定されていないか取得できない場合はundefを返します。
日時のフォーマットは、ISO(YYYY-MM-DD HH:MM:SS)形式のローカルタイムに自動的に変換します。
rssURI() プロパティ
RSSとAtomのどちらを返すかは、new()コンストラクタの引数であらかじめ指定することができます。
指定しなかった場合は、HTMLで最初に指定されたRSS/AtomのURIを返します。
my $rss_uri = $blog->rssURI();ブログのRSSまたはAtomのURIを返します。
RSSとAtomのどちらを返すかは、new()コンストラクタの引数であらかじめ指定することができます。
指定しなかった場合は、HTMLで最初に指定されたRSS/AtomのURIを返します。
serviceName() プロパティ
今のところ日本の主なサービスのみを対象としています。
URIルール→サービス名への変換表は自分で定義することもできます。
その場合はコンストラクタの引数で BLOG_SERVICE_REG を指定してください。
変換表のフォーマットは、このモジュールに同梱されている blog_service_reg.txt を参照してください。
my $service_name = $blog->serviceName();ブログが利用しているサービス名(livedoorブログ、FC2ブログetc)を返します。
今のところ日本の主なサービスのみを対象としています。
URIルール→サービス名への変換表は自分で定義することもできます。
その場合はコンストラクタの引数で BLOG_SERVICE_REG を指定してください。
変換表のフォーマットは、このモジュールに同梱されている blog_service_reg.txt を参照してください。
topURI() プロパティ
ブログサービス系のブログであれば、ブログサービス名の変換表から算出したURIを返します。
RSSまたはAtomからURIを取得できた場合は、こちらの値を優先して返します。
my $top_uri = $blog->topURI();ブログのトップページURIを返します。
ブログサービス系のブログであれば、ブログサービス名の変換表から算出したURIを返します。
RSSまたはAtomからURIを取得できた場合は、こちらの値を優先して返します。
latest*() プロパティ
latestURI() ・・・ 最新エントリのパーマリンク
latestTitle() ・・・ 最新エントリのタイトル
latestPubdate() ・・・ 最新エントリの最終更新日時
latestCategory() ・・・ 最新エントリのカテゴリ
latestAuthor() ・・・ 最新エントリの著者
latestGUID() ・・・ 最新エントリのGUID
latestLink() ・・・ 最新エントリのパーマリンク(latestURI()と同値)
latestContents() ・・・ 最新エントリの本文(*)
latestImage() ・・・ 最新エントリの画像URL(*)
* 本文は推測を含んでいます。必ずしもきれいに取得できるとは限りません!
* 画像は本文中のタグから取得しています
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(); my $latest_contents = $blog->latestContents(); my $latest_image = $blog->latestImage();RSS/Atomのフィード情報から、最新のエントリの各情報を返します。
latestURI() ・・・ 最新エントリのパーマリンク
latestTitle() ・・・ 最新エントリのタイトル
latestPubdate() ・・・ 最新エントリの最終更新日時
latestCategory() ・・・ 最新エントリのカテゴリ
latestAuthor() ・・・ 最新エントリの著者
latestGUID() ・・・ 最新エントリのGUID
latestLink() ・・・ 最新エントリのパーマリンク(latestURI()と同値)
latestContents() ・・・ 最新エントリの本文(*)
latestImage() ・・・ 最新エントリの画像URL(*)
* 本文は推測を含んでいます。必ずしもきれいに取得できるとは限りません!
* 画像は本文中のタグから取得しています
target*() プロパティ
targetURI() ・・・ 指定されたエントリのパーマリンク
targetTitle() ・・・ 指定されたエントリのタイトル
targetPubdate() ・・・ 指定されたエントリの最終更新日時
targetCategory() ・・・ 指定されたエントリのカテゴリ
targetAuthor() ・・・ 指定されたエントリの著者
targetGUID() ・・・ 指定されたエントリのGUID
targetLink() ・・・ 指定されたエントリのパーマリンク(latestURI()と同値)
targetContents() ・・・ 指定されたエントリの本文(*)
targetImage() ・・・ 指定されたエントリの画像URL(*)
* 本文は推測を含んでいます。必ずしもきれいに取得できるとは限りません!
* 画像は本文中のタグから取得しています
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(); my $target_contents = $blog->targetContents(); my $target_image = $blog->targetImage();RSS/Atomのフィード情報から、引数で指定されたURLのエントリの各情報を返します。
targetURI() ・・・ 指定されたエントリのパーマリンク
targetTitle() ・・・ 指定されたエントリのタイトル
targetPubdate() ・・・ 指定されたエントリの最終更新日時
targetCategory() ・・・ 指定されたエントリのカテゴリ
targetAuthor() ・・・ 指定されたエントリの著者
targetGUID() ・・・ 指定されたエントリのGUID
targetLink() ・・・ 指定されたエントリのパーマリンク(latestURI()と同値)
targetContents() ・・・ 指定されたエントリの本文(*)
targetImage() ・・・ 指定されたエントリの画像URL(*)
* 本文は推測を含んでいます。必ずしもきれいに取得できるとは限りません!
* 画像は本文中のタグから取得しています
feed()、latest()、target()プロパティ
feed() ・・・ RSS/Atomのフィード情報
latest() ・・・ RSS/Atomのフィード情報から、最新のエントリの情報を返します。
target() ・・・ RSS/Atomのフィード情報から、指定されたエントリの情報を返します。
いずれも返り値はXML::FeedPPのインスタンスです。
XML::FeedPPの詳細は http://www.kawa.net/ を参照してください。
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() メソッド
parse()メソッドを実行する前にtitle()等のプロパティを参照しても問題はありません。
※バージョン0.92までは”getAll()”という名称でしたが、バージョン1.00からは”parse()”に変更しました。なお、バージョン1.00以降もgetAll()メソッドは利用できます。
$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"; print '最新記事の本文: ', $blog->latestContents(), "\n"; print '最新記事の画像URL: ', $blog->latestImage(), "\n";全ての情報を一括で取得します。
parse()メソッドを実行する前にtitle()等のプロパティを参照しても問題はありません。
※バージョン0.92までは”getAll()”という名称でしたが、バージョン1.00からは”parse()”に変更しました。なお、バージョン1.00以降もgetAll()メソッドは利用できます。
is_error() プロパティ
エラー内容は errmsg() プロパティで取得できます。
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() メソッド
第1引数で'HTML'を指定した場合は、HTML形式で出力されます。
処理途中で取得した値が$blog->{KEY}のHASHに格納されていることが確認できます。
print $blog->Dumper();
print $blog->Dumper('HTML');
$blogオブジェクトの現時点での内容をテキスト形式にダンプします。第1引数で'HTML'を指定した場合は、HTML形式で出力されます。
処理途中で取得した値が$blog->{KEY}のHASHに格納されていることが確認できます。
その他
現在のバージョンは 1.03 です。
バージョン0.9xを経て、現在、実環境で稼動させた結果を順次フィードバックしています。
バグはまだあるかも?
バージョン0.9xを経て、現在、実環境で稼動させた結果を順次フィードバックしています。
バグはまだあるかも?
Thanks to
利用について
商用・非商用に関わらず自由にお使いください。
商用の場合はいろいろとお手伝いもできますのでご一報いただければ幸いです。
連絡先 →info@mizunotomoaki.com
商用の場合はいろいろとお手伝いもできますのでご一報いただければ幸いです。
連絡先 →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にエントリが何もない場合にもエラーを出さない
- 2008/09/27 - ver 1.03 UserAgentの指定、本文の取得、画像の取得対応
コメント
コメントはこちらからどうぞ!
- テストさん ・・・ 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
こんにちは!杉浦太陽 !
具体的にはどういったエラーがでますでしょうか?
このページの「サンプル」の項目にあるサンプルページでは、特に問題なく情報を取得できているようです。 - waterさん ・・・ 2009/11/07 18:42:37
パーマリンクの場合も情報を取得できるようなんですが、実際パーマリンクを指定しても、現在の最新の情報しか取れてきません。
なにかまちがっていますでしょうか。
my $url2 = 'http://hogehoge.livedoor.jp/archive/182910.html';
my $blog = Blog::Parser->new($url);
print '記事の本文: ', $blog->targetContents(), "\n"; - ノブさん ・・・ 2011/05/27 18:11:52
すごく便利ですね。
使わせていただきと思っていますが、ページが取得できないときにエラーがでてしまいます。
Can't call method "is_error" on an undefined value at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/Blog/Parser.pm line 726.
これはサーバーの問題でしょうか?
トラックバック
トラックバックURL:
http://www.mizunotomoaki.com/tb.cgi/hack/blog_parser.html
- BBS-plagger/5
Googleブックマークを元にしたRSSフィードのメール配信きっかけRSSフィードのメール配信で情報を収集しているが使い勝手がよくない。::yamlファイルへのRSSフィードへのURIを追記が面倒:::特に仕事時間帯に見つけた有用な情報の場合、自宅サーバーにリモートログインした上...www.nachide.org・・・ 2008/12/13 14:21:09
目次
ブログのページを解析して様々な情報を取得できるPerlモジュールです。
(2008/09/27)
ウィキペディアから抽出した「今日は何の日」情報のXMLを提供するAPIです。
(2006/10/24)
「今日は何の日」APIを使ったブログパーツです。
(2007/05/20)
JavaScriptでFlashPlayerのバージョンを取得するサンプルです。
(2007/11/01)