0

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

它开始正常工作,直到我开始收到 Http 错误代码 429,这意味着我在短时间内执行了太多请求。然后,我决定在每个请求之间放置一个睡眠,随着 Http Error Code 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})
4

1 回答 1

1

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

credentials = GoogleCredentials.get_application_default()

也许它无法找到凭据并用于请求,因此向 API 发出匿名请求,这在您的情况下不允许超过 2 或 3 个请求,我也面临同样的问题,并找到了解决方法:

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

用于开发:使用 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)

您可以在此处找到要使用的范围列表。

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

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

您无需为每个请求增加睡眠时间,只需在使用上述任何方法时请求失败时增加睡眠时间即可。在文档中查找指数退避算法。

于 2017-01-12T16:52:55.980 回答