« JavaScriptで記事の検索 | トップページ | ココログ記事検索の仕組み Part 2 »

2006年6月24日 (土)

ココログ記事検索の仕組み

コメントをいただいたので、先日設置した記事検索の仕組みについて書きたいと思います。
まず、ブログの場合、サーバーサイドのプログラムでデータベースなどにアクセスできないので、 ブログシステムが生成するHTMLファイルをJavaScriptを使って力技で強引に検索するしかありません。
つまり、最初に、記事が書かれているHTMLファイルのURLをどうにかして取り出す必要があるわけです。
色々見てみると、ココログの場合はブログのルートディレクトリにあるarchives.htmlというファイルからそのURLをたどれそうです。
左のサイドバーにある「バックナンバー」というリンクがそのファイルを指していて、 そのファイルを開くと月別に記事をまとめたHTMLファイルへのURLが書かれています。
具体的には以下のような形式になっています。
<div id="archive-datebased">
.......
<a href="http://wildcat.cocolog-nifty.com/web/2006/06/index.html">2006年6月</a>
.......
<div class="archive-category">
.......
つまり、<div id="archive-datebased">から<div class="archive-category">の間にあるaタグのhref属性を取り出せばOKということですよね。
そこで、まずXMLHttpRequestを使ってarchives.htmlのHTML文字列を取り出します。
今回は楽をするためにPrototype.jsを利用していますので、コードは以下のようなものになります。
var BLOG_URL = "http://wildcat.cocolog-nifty.com/web/";
........
var url = BLOG_URL + "archives.html";
new Ajax.Request(url, {method:'GET',onComplete:archivePageLoaded});
Prototype.jsについてはあらためて書こうと思っていますが、ご存知ない方は、1つ目の引数は取得したいURL、2つ目の引数は見慣れない形式かもしれませんが、 リクエストのmethodはGETで、読み込みが完了したらarchivePageLoadedという関数が呼ばれるように指定していると解釈してください。
そして、読み込み完了時に呼ばれるarchivePageLoaded関数内で<div id="archive-datebased">から<div class="archive-category">の間にあるaタグのhref属性を 取り出しています。
その関数のコードは以下のようになっています。
var archiveUrls = [];
........
function archivePageLoaded(r)
{
    var text = r.responseText;
    text = text.replace(/[\r\n]/g, "");
    var pattern = '<div id="archive-datebased">(.*?)<div class="archive-category">';
    var re1 = new RegExp(pattern, "i");
    text.match(re1);
    var dataRange = RegExp.$1;
    var re2 = new RegExp(BLOG_URL+"[0-9]{4}/[0-9]{2}/index.html", "gi");
    archiveUrls = dataRange.match(re2);
}
まず、引数のrは、XMLHttpRequestオブジェクトです。
そのresponseTextプロパティによって、取得したHTMLソースを取得します。
次に、2行目で改行を削除しています。 この後も正規表現が度々出てきますが、色々なサイトで詳しく解説されていますので、ご存知ない方は検索してみていただきたいのですが、簡単に言えば 指定したパターンにマッチした文字列を取り出すことが出来る便利なものです。 3行目では正規表現パターンを定義しています。<div id="archive-datebased">と<div class="archive-category">の間の文字列を後で取り出すために( )でグループ化しています。
そして、4行目・5行目でHTML文字列から正規表現パターンのマッチングを行い、6行目のRegExp.$1でマッチした中の1つ目のグループの文字列(3行目の正規表現パターンの( )内の文字列)を取り出しています。
これで、ようやく<div id="archive-datebased">と<div class="archive-category">の間のHTML部分を取り出せました。
この取り出したHTMLに目的のURLが
http://wildcat.cocolog-nifty.com/web/yyyy/mm/index.html
というパターンで記述されていますので、7行目のように
http://wildcat.cocolog-nifty.com/web/数字4文字/数字2文字/index.html
というパターンでマッチングを行い、あらかじめ定義してあったarchiveUrlsという配列に結果を格納しています。

これで、めでたく月別にアーカイブされた記事のURLを取得することが出来ました。
明日は、このURLを使って各月の記事が書かれたHTMLを取得し記事を検索する仕組みを書きたいと思います。

|

« JavaScriptで記事の検索 | トップページ | ココログ記事検索の仕組み Part 2 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/12438/10654469

この記事へのトラックバック一覧です: ココログ記事検索の仕組み:

« JavaScriptで記事の検索 | トップページ | ココログ記事検索の仕組み Part 2 »