【Python/楽天API】
{\'error_description': 'number of allowed requests has been exceeded for this API. please try again soon.', 'error': 'too_many_requests'}が返ってきた時の解決方法
楽天APIをfor文で使用したらエラーになった話
投稿日 2022/02/24 更新日 2022/02/24
こんにちは。当サイトの管理者「元木皇天」です。
先日、Pythonを使って楽天市場商品検索APIを連打する処理を書いたところ、以下のようなエラーが返ってきました。。。
{'error_description': 'number of allowed requests has been exceeded for this API. please try again soon.', 'error': 'too_many_requests'}
というわけで、同じ目に遭っている人向けに、このエラーの解決方法について解説したいと思います。
環境
OS:MacOS Big Sur
Python:Ver 3.8.3
PyCharm:Ver 2020.2(Community Edition)
楽天商品検索API:Ver 2017-07-06
やりたいこと
{'error_description': 'number of allowed requests has been exceeded for this API. please try again soon.', 'error': 'too_many_requests'}
を解決する
参考文献
・入門 Python 3 第2版
・楽天商品検索API ドキュメント エラー
・Python ドキュメント モジュール time
エラーの内容
まずはとりあえずエラーの内容を確認してみましょう。
エラーは以下の内容です。
{'error_description': 'number of allowed requests has been exceeded for this API. please try again soon.', 'error': 'too_many_requests'}
英語でよくわからないのでGoogle翻訳にぶち込んでみましょう。
{'error_description': 'このAPIで許可されているリクエストの数を超えました。しばらくしてからもう一度お試しください。 '、'エラー ':' too_many_requests '}
要するに「リクエスト数が多すぎる」というわけですね。。
ちなみに、楽天商品検索APIのページにも同様の記載があります。
では、次の項で解決方法について解説したいと思います。
エラーの解決方法
そもそも今回のエラーである、{'error_description': 'number of allowed requests has been exceeded for this API. please try again soon.', 'error': 'too_many_requests'} は一定時間の間に大量のリクエストを行なっていることが原因です。
つまり、一定時間内に送るリクエスト数を減らすことができれば問題ないということです。
なので、一定時間内に送るリクエスト数を減らす対応としてtimeモジュールのsleep()を使用することで、このエラーを解決できます(sleep()は実行したスレッドの処理を、指定した時間停止させることができるメソッドです。)。
そのため、これを実行することで一定の時間内に送るリクエスト数を減らすことができます。
以下は実際の使用例です(実際は以下のように同じ内容を100回問い合わせるようなことはしませんが、わかりやすい例として挙げています)。
import time
import requests
# 楽天商品検索API (BooksGenre/Search/)のURL
url = "https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706"
# URLのパラメータ
param = {
"applicationId" : "XXXXXXXXXXXXX",
"keyword" : "Python",
"format" : "json"
}
# APIを100回実行する
for i in range(100):
time.sleep(1)
requests.get(url, param)
ポイントとしては、sleep()を繰り返し処理の中に入れていることです。
ちなみに今回は例として引数に「1」を設定しましたが、エラーにならなければどんな値でも大丈夫です。
1を引数に設定することで、処理実行時間を1秒停止させることができ、当初の目標だった「一定時間内のリクエスト数を減らす」が達成されます。
以下は実際に私がPyCharmで実行した画像です。実行してもエラーが出ないことが確認できます。
まとめ
{'error_description': 'number of allowed requests has been exceeded for this API. please try again soon.', 'error': 'too_many_requests'}のエラーが出た時は
sleep()を使用して、一定時間内のリクエスト数を減らしましょう。