Jan 13, 2005

MSN Search RSS Feeds

宮川さんのところ(MSN Search Results as RSS: blog.bulknews.net)で知りましたが、MSN Search betaがRSSを生成するようになっていました。

RSS Feeds for Search Results

早速、Ogawa::Buzz: mt-search.cgiを捨てて簡単メタサーチにしてみようでやっていた、サイト内検索にGoogle Web APIsを使う方法を放棄しました(待てど暮らせどうちのサイトにはGoogleがクロールに来てくれないので役に立たないのデス)。で、こっちに乗り換えました。

どういうことかと言うと、例えば、「小川」をサイト内(as-is.net内)検索したい場合、

http://beta.search.msn.co.jp/results.aspx?q=%E5%B0%8F%E5%B7%9D+site:as-is.net&format=rss

というURLで検索結果のRSSが得られます(「%E5%B0%8F%E5%B7%9D」は「小川」をUTF-8に変換してURLエンコーディングしたもの)。したがって、このRSSをMagie RSS(Magpie RSS - PHP RSS Parser)などを使って読み込んで表示するだけで、真っ当なサイト内検索として機能してくれるというわけです。

ざっくり書くとこんな感じ。

<?php
define('CHARSET', '<$MTPublishCharset$>');
define('BLOG_HOST', '<$MTBlogHost$>');
define('BLOG_SITE_PATH', '<$MTBlogSitePath$>');

$search = isset($_GET['search']) ? htmlspecialchars(trim($_GET['search'])) : "";

echo <<<EOD
<form method="get" action="{$_SERVER['PHP_SELF']}">
<h3>サイト内の検索</h3>
<p><input name="search" size="30" value="{$search}" /><input type="submit" value="Search" /></p>
</form>

EOD;

if ($search) {
  $qstring = urlencode(mb_convert_encoding($search, 'utf-8', CHARSET));
  $cond_site = urlencode("site:" . BLOG_HOST);

  echo "<h2>MSN Search betaのサイト内検索結果:</h2>\n\n";

  require_once BLOG_SITE_PATH . 'rss_fetch.inc';
  define('MAGPIE_CACHE_DIR', BLOG_SITE_PATH . 'cache');
  define('MAGPIE_OUTPUT_ENCODING', CHARSET);
  $url = "http://beta.search.msn.co.jp/results.aspx?q={$qstring}+{$cond_site}&format=rss";
  $rss = fetch_rss($url);
  if ($cnt = count($rss->items)) {
    echo "<p>{$cnt}件見つかりました。</p>\n\n";
    echo "<ul>\n";
    foreach ($rss->items as $item) {
      $title = htmlspecialchars($item['title']);
      $url = htmlspecialchars($item['link']);
      $snippet = htmlspecialchars($item['description']);
      echo "<li><a href=\"$url\">$title</a>\n<div class=\"note\">$snippet</div></li>\n\n";
    }
    echo "</ul>\n";
  } else {
    echo "<p>見つかりませんでした。</p>\n\n";
  }
  echo "<p><small>[Powered by <a href=\"http://blogs.msdn.com/msnsearch/archive/2005/01/11/351064.aspx\">RSS Feeds for MSN Search Results</a>]</small></p>\n\n";
}
?>

上のコードはMovable Typeのテンプレートに張り込むことを考慮して、一部MTタグを使って書かれていますが、先頭で定義しているCHARSET、BLOG_HOST、BLOG_SITE_PATHという三つの定数を適当に変更するだけで、大抵のサイトで利用できます。

Feed2jsやprocfeedのように貼り付け用のJavascriptを生成してくれるサービスを利用してもよいのですが、こうしたサービスは総じて負荷が集中しやすく動作速度も遅いため、ページ全体のレスポンスを悪化させるので、私は使っていません。

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com