如何从Google Vision API中避免使用Http Error Code 429?

时间:2016-10-11 16:52:15

标签: python ocr http-error google-cloud-vision http-status-code-429

我一直在使用Google Vision API在某些使用Python的文档中执行OCR任务。

它开始完美运行,直到我开始接收Http错误代码429,这意味着我在很短的时间内做了太多的请求。然后,我决定在每个请求之间进行休眠,随着Http错误代码429的数量增加,该时间会增加。但是,一段时间后,错误消息不断出现。由于消息一直到达,因此睡眠时间不断增加,直到它达到睡眠时间太久以至于失去连接的程度。

最奇怪的是,如果我连续多次收到此类错误消息,并立即完成该过程并再次启动,请求会在第一次尝试时再次开始工作。

换句话说,似乎无论我把睡眠时间放在哪里,我都会在某个时刻开始接收这样的消息,并且让它再次起作用的唯一方法就是重新开始这个过程(这根本就没有任何意义)。

如何在不重启过程的情况下避免出现此类错误消息?任何人都可以帮助我吗?

非常感谢!

编辑:

这是请求的代码(部分内容)。

    from apiclient import discovery
    from oauth2client.client import GoogleCredentials
    # The other imports are omitted

    DISCOVERY_URL = 'https://{api}.googleapis.com/$discovery/rest?version={apiVersion}'  # noqa
    credentials = GoogleCredentials.get_application_default()
    self.vision = discovery.build(
        'vision', 'v1', credentials=credentials,
        discoveryServiceUrl=DISCOVERY_URL)

    batch_request = []

    for image in images:
        batch_request.append({
            'image': {
                'content': base64.b64encode(image).decode('UTF-8')
            },
            'features': [{
                'type': 'TEXT_DETECTION',
            }]
        })

    request = self.vision.images().annotate(
        body={'requests': batch_request})

1 个答案:

答案 0 :(得分:0)

您已使用过应用程序默认凭据

credentials = GoogleCredentials.get_application_default()

也许它无法找到凭据并用于请求,因此向API发出匿名请求,即在您的情况下不允许超过2或3个请求,我也遇到了同样的问题并找到了工作围绕着:

(注意:如果您尚未设置API密钥或服务帐户密钥,请参阅此doc以创建一个。)

用于开发:使用API​​密钥

你可以像以下一样使用它:

self.vision = discovery.build(
    'vision', 'v1', credentials=credentials,
    discoveryServiceUrl=DISCOVERY_URL, developerKey='your_api_key'

用于生产:使用服务帐户密钥

from oauth2client.service_account import ServiceAccountCredentials
scopes = ['https://www.googleapis.com/auth/sqlservice.admin']
credentials = ServiceAccountCredentials.from_json_keyfile_name(
    '/path/to/keyfile.json', scopes=scopes)

您可以找到要使用的范围列表here

此外,您需要设置此环境变量:

GOOGLE_APPLICATION_CREDENTIALS="/path/to/secret-key-file"

您不需要为每个请求增加睡眠时间,只需在使用上述任何方法时请求失败时增加睡眠时间。在docs中寻找指数退避算法。