古い記事
ランダムジャンプ
新しい記事
今回の 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