Yahoo Site ExplorerのインデックスとYahoo Web Searchのキャッシュでアル厨の過去ログを作ってみる

Yahoo!USにインデックスされているページ一覧を取得できるYahoo Site Explorerでアル厨はどんな感じでインデックスされてるか見てみました。んー、これって過去ログに使えそうだな(アル厨自体は2週間分しかサーバーにログを残していない)と思い、Yahoo Site Explorer APIの実験をしてみました。

まずYahoo!USのアカウントを取得し(さすがに登録ユーザが多いらしくなかなか思い通りのアカウントが取れませんでした)、Index取得仕様のページを読む。アプリ毎にユニークなApplication IDってのも登録しないと駄目なんですね。ここではとりあえず実験用ApplicationIDを登録してみました。
次に、とりあえずこのリクエストで帰ってくる実際のXMLデータを見てみました。リクエストは以下のようなものです。

http://api.search.yahoo.com/SiteExplorerService/V1/pageData?appid=(ここに登録したAppliationID)&query=http%3A%2F%2Fqouop.dyndns.org%2Falchu%2F&results=50

仕様書のページにも書いてあるんですが、帰ってくるXMLデータ中のUrl,ClickUrl共にブラウザ上でYSEアクセスしたときに現れるキャッシュURLではないようです。ということでキャッシュ取得のためにYahoo Web Search APIもたたく必要がありそうです。仕様書見ると、ありますねCacheパラメータ。

というわけでとりあえずソートだけする以下のような手抜きコードを書いてみました。結果はこちら。20050907のログが取得できなかった原因はよくわかりません。print Dumper(@cache)したらtotalResultsAvailable,totalResultsReturned,firstResultPositionが軒並み0になってました。YSEが内部で使ってるデータとYWSで外部公開してるデータがずれてるんですかね。Yahoo! Indexに登録したいURLはYahoo! Submit Pageに登録するとYahoo! crawlerが見回りに来て登録URL以下のページもリンクたどってくれるみたいです。

ポイントはキャッシュ取得用のYWSのquery値(URL)の頭にここに書いてある通りurl:をつけてYWS検索してることくらいです。キャッシュデータが多くなってきたらカレンダー表示して見ようかな。過去ログを外に置けるのって結構便利かも。

use strict;
use warnings;

use LWP;
use XML::Simple;

my $yse_url = "http://api.search.yahoo.com/SiteExplorerService/V1/pageData?appid=(ここにアプリケーションID)&query=http%3A%2F%2Fqouop.dyndns.org%2Falchu%2F&results=50";
my $yws_url = "http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=(ここにアプリケーションID)&results=1&query=url:";

my $browser = LWP::UserAgent->new;
my $response = $browser->get( $yse_url );
if (!$response->is_success) {
    die "Can't access to $yse_url.";
}

my $content = $response->content;
my @archive;
my $parser = XML::Simple->new;
my $data = $parser->XMLin( $content, ForceArray => 1);
for my $result (@{$data->{Result}})
{
    my $cache_access_url = $yws_url.$result->{Url}->[0];
    $response = $browser->get( $cache_access_url );
    if (!$response->is_success) {
	die "Can't access to $cache_access_url";
    }
    $content = $response->content;
    my @cache = $parser->XMLin( $content, ForceArray => 1 );

    my $cache_url = "";
    my $return_code = "";
    if ($cache[0]->{totalResultsReturned} == 0)
    {
	$cache_url = "";
	$return_code = "Cache not found.";
    }
    else {
	$cache_url = $cache[0]->{Result}->[0]->{Cache}->[0]->{Url}->[0];
	$return_code = "Success.";
    }

    push @archive, {
	title     => $result->{Title}->[0],
	url       => $result->{Url}->[0],
	cache_url => $cache_url,
	rtcd      => $return_code,
    };
}

my @sorted_archive = sort { $a->{url} cmp $b->{url} } @archive;

for my $item (@sorted_archive)
{
    print "Title      : $item->{title}\n";
    print "URL        : $item->{url}\n";
    print "Cached URL : $item->{cache_url}\n";
    print "rtcd       : $item->{rtcd}\n";
    print "\n";
}