1

APIにアクセスしてjsonを抽出していますが、1時間ごとのリクエスト制限内にとどまるようにしたいのですが、これを行うための最良の方法は何でしょうか?

これは私が要求をするところです:

# return the json
def returnJSONQuestion(id):
    url = 'http://someApi.com?index_id={0}&output=json'
    format_url = url.format(id)
    try:
        urlobject = urllib2.urlopen(format_url)
        jsondata = json.loads(urlobject.read().decode("utf-8"))
        print jsondata
        shortRandomSleep()
    except urllib2.URLError, e:
        print e.reason
    except(json.decoder.JSONDecodeError,ValueError):
        print 'Decode JSON has failed'
    return jsondata
4

2 に答える 2

1

次のようなトークンバケットアルゴリズムを使用できます:http: //code.activestate.com/recipes/511490/

APIでリクエストを行うことができるレートでトークンをバケットに追加し、リクエストを行うたびにバケットからトークンを取得します。

于 2012-09-12T23:18:32.457 に答える
1

私は通常、現在の時刻を確認してスクリプトを1分おきに実行する安価なハックを使用します。これは、関数の一般的な形式です。

def minuteMod(x, p=0):
    import datetime
    minute = datetime.datetime.now() + datetime.timedelta(seconds=15)
    minute = int(datetime.datetime.strftime(minute, "%M"))
    if minute % x == p:
        return True
    return False

pはここでの余りであり、デフォルト値はである0ため、2番目の引数を特に渡す必要はありません。

したがって、基本的に、スクリプトを1分おきにのみ実行する場合は、次のように使用します。

def returnJSONQuestion(id):

    if not minuteMod(2):
        return None or ''

    # rest of the code

これにより、現在の分が偶数でない場合にリクエストが停止します。これが最善の方法ではないことを考えると、この関数を使用して結果をキャッシュできます(これが許可されているかどうかによって異なります)。したがって、基本的には、次のようなことを行います。

def returnJSONQuestion(id):

    if minuteMod(3): # current minute is a factor of 3
        return jsonFromCache # open a file and output cached contents
    else:
        url = 'http://...'
        storeJSONToFile(url)
        return json
于 2012-09-12T23:58:07.167 に答える