1

我正在访问一个 api 并提取一个 json,但我想确保我保持在每小时请求限制内,最好的方法是什么?

这是我提出请求的地方:

# 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

我通常使用廉价的 hack,通过检查当前时间使脚本每隔一分钟运行一次。这是函数的一般形式:

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所以不需要特别传入第二个参数。

所以基本上,如果你希望你的脚本每隔一分钟运行一次,你可以像这样使用它:

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 回答
1

您可以使用令牌桶算法,如下所示:http ://code.activestate.com/recipes/511490/

以 API 允许您发出请求的速率将令牌添加到存储桶中,并在您每次发出请求时从存储桶中获取一个令牌。

于 2012-09-12T23:18:32.457 回答