Yahoo-APIを無制限に叩くためのモジュール書いた
ふと気づくとYahooの「ウェブ検索API」の利用制限が変わっていて、今までは同一IPからの利用は5万回/24時間でしたが、10月13日から同一appidからの利用が5万回/24時間となっていました。
http://developer.yahoo.co.jp/newslist/1#64
つまりappidを複数用意して数珠つなぎに使って行けば、同一IPからの利用が事実上無制限となるんだよね!?ということで、久しぶりにPerl Module書きました。
WebService::APIKeys::AutoChanger
github: http://github.com/miki/WebService-APIKeys-AutoChanger
CPAN : http://search.cpan.org/~miki/WebService-APIKeys-AutoChanger
まだCPANにあがってないけど、そのうちこのURL↑で反映されると思います。
利用制限(回数と時間)を管理しながら、上限まで達したら次のappidにチェンジ、という処理を自動的にこなしてくれるモジュールです。
きっかけはYahoo-APIでしたが、汎用的に作ったつもりなので、同じような利用制限を設けているweb-APIであれば、たぶんどこででも使えると思います。
使い方
こんな感じで、WebService::Simpleとかと併用するといいよ。
use WebService::Simple; use WebService::APIKeys::AutoChanger; my $changer = WebService::APIKeys::AutoChanger->new; $changer->set( api_keys => [ 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz', ], ); my $yahooJapan = WebService::Simple->new( base_url => 'http://search.yahooapis.jp/WebSearchService/V1/webSearch', ); my @query = qw( foo bar baz ... ); for my $query(@query){ # 自動的に今現在有効なappidを返してくれます my $available_key = $changer->get_available; # あとはそれを使うだけ my $response = $yahooJapan->get( { appid => $available_key, query => $query } ); do_something($response); }
内部のしくみ
YahooAPIは24時間で5万回の制限ですが、このような回数制限部分の制御にはThrottler系のモジュールを使ってます。とくに何も指定しなければデフォルトでData::Valveをロードし、max_items 50000, interval 86400で動きます。(YahooAPIにあわせちゃった)
ちなみにData::ValveはMooseを使ってますが、環境/ポリシーによってはMooseを使えない/使わない場合もあるので、そういう時はData::Throttlerを使ってください。こんな感じ。
my $changer = WebService::APIKeys::AutoChanger->new; $changer->set( api_keys => [ 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz', ], throttler_class => 'Data::Throttler', throttler_config => { max_items => ..., interval => ..., } );
でも速度を求めるならData::Valve の方がおすすめです。Mooseの起動コストを考慮してもこっちの方が断然速いです。XSだし。
ちなみにYahoo-APIでは1アカウントでappidを10個まで取得できるみたいです。
なので10個をAutoChangerに設定しておけば、1日に50万クエリまでY-APIを使えてしまいます。
これで安心してがんがんY-APIを叩けるね!やったね!
というわけで、Yahoo様には足を向けては眠れない今日この頃です。