たつをの ChangeLog : 2006-09-11

今回の YahooHacks は、あるサイトに含まれるページ数を知る方法です。
http://d.hatena.ne.jp に含まれるページ数」ではなく、
http://d.hatena.ne.jp/yto に含まれるページ数」が知りたいというの
が動機です。ホスト指定でなく、URL指定。
とはいえ、当然のことながらインデックスされているページ数しかわかりませんよ。

あと、いまいち inurl の使い方が分かっていないところがあるので、内容は不正確です。何か情報ありましたら、お願いします。

それではどうぞ:

使用している Web API の提供が終了となったため、現在動作しません。ご了承ください。



■■■あるサイトに含まれるページ数を知る

あるサイトに含まれるページ数を知るにはどうしたらよいでしょう。
そのサイトに含まれるページ数=ヤフーにインデックスされている URL 数、
とみなして検索 API を用いて解決する方法を紹介します。
もちろん正確な数字は出ませんが、参考数値として有意義かと思います。

■パラメータ site とクエリー構文 inurl

リクエストパラメータ site で検索するドメイン(例えば
www.yahoo.co.jp)を指定できます。
しかし何かしら query を指定しないと検索結果がエラーになります。

http://search.yahooapis.jp/WebSearchService/V1/webSearch?
appid=YahooDemo&site=yahoo.co.jp


ダミーとして指定する文字列(例えば「0」や「Copyright」など)を
考える必要があり、またそれがきちんと機能するかはサイト依存なので、
いろいろと面倒です。

そこで、inurl というクエリー構文を使用します。inurl により、指定し
た文字列を URL に含むサイトのみを対象とした検索ができます。
例えば URL に yahoo.co.jp を含むサイトのうち「YDN」を含むWebページ
検索する場合は、query として「YDN inurl:yahoo.co.jp」という文字列
を指定します。また「inurl:yahoo.co.jp」のみで検索すると、
yahoo.co.jp を URL に含むサイトが検索結果として出てきます。
そこから検索結果数を取り出せば「あるサイトに含まれるページ数を知る」
ことができます。

http://search.yahooapis.jp/WebSearchService/V1/webSearch?
appid=YahooDemo&query=inurl:yahoo.co.jp


しかし、inurl のみでは、プロキシやソーシャルブックマークサービスな
どの URL にもマッチしてしまいます(例えば下記のような URL にも)。

http://b.hatena.ne.jp/entry/http://streaming.yahoo.co.jp/

というわけで、きちんと「あるサイトに含まれるページ数を知る」には、
下記のように inurl と site を両方指定するのがよいでしょう。

http://search.yahooapis.jp/WebSearchService/V1/webSearch?
appid=YahooDemo&query=inurl:yahoo.co.jp&site=yahoo.co.jp


■コード

前述のやり方で、URL を指定するとそのサイトに含まれるページ数を教え
てくれるスクリプトを書いてみました。
内部で inurl と site を指定して Yahoo! API を呼び出しています。
ただし URL に &, ?, %, # の文字が入っていると処理を行いません。

#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
use URI;

my $target = shift @ARGV;
exit if ($target =~ /[&?%\#]/);

my $uri = URI->new($target);
my $h = $uri->host;
my $p = $uri->path;

my $url = "http://search.yahooapis.jp/WebSearchService/V1/".
        "webSearch?appid=YahooDemo&query=inurl:$h$p&site=$h";
my $num = get_num($url) || 0;
print "$num\n";

sub get_num {
    my ($url) = @_;
    my $yahoo_response = get($url);
    my ($num) = ($yahoo_response =~ /totalResultsAvailable="(\d+)"/);
    return $num;
}

■Hack の実行

% ./hack_num.pl http://nais.to/~yto/ukulele
8
% ./hack_num.pl http://d.hatena.ne.jp/yto  
4560

■注意点

現在の仕様では、inurl で指定した文字列中のストップワードは無視され
るようなので注意が必要です。例えば「inurl:nais.to/~yto/」の場合、
「to」は英語のストップワードとして無視されるようです。



参考ページ:
- Yahoo!デベロッパーネットワーク (YDN)
  http://developer.yahoo.co.jp/

関連書籍:
Yahoo! Hacks

- 圧縮フォルダを使わないようにするとエクスプローラがキビキビ動く
  http://hail2u.net/blog/software/turn-off-zip-folder.html

コマンドプロンプトで以下を実行。
regsvr32 /u zipfldr.dll
regsvr32 /u cabview.dll

戻すときは以下を実行。
regsvr32 zipfldr.dll
regsvr32 cabview.dll

自己責任で。

速くなるのですが、その代わり今までと違って、圧縮ファイル
(*.zip)の中身は解凍しないとのぞけなくなります。

Last Action Hero: Music From The Original Motion Picture

某氏からもらった CD。
映画はアレな感じだそうだが、サントラはヘビメタコンピとしても
悪くない、と。盛りだくさんでお腹がいっぱい。
この記事に言及しているこのブログ内の記事

Marc Moulin / Top Secret

某氏からもらった CD。
オシャレ系ジャズ、なのかな。
ミュートなトランペットがよいな。
この記事に言及しているこのブログ内の記事

ライヒ!Reich!

2006-09-11-5 [Music]
ライヒ:リミックス

某氏からもらった CD。
ライヒ好きな私ではありますが、
うーん、リミックスせずに普通に聴いた方が良いかな。
とはいえ、カッコイイ曲もあり。

私はライヒの作品の中では
「18人の音楽家のための音楽 (Music for 18 Musicians)」
が大好きです。つか、傑作。
Steve Reich: Music for 18 Musicians


参考:
- [を] ミニマルとかアンビエンとか[2003-02-28-1]
この記事に言及しているこのブログ内の記事

たつをの ChangeLog
Powered by chalow