2016-10-11 3 views
0

Я использовал API Google Vision для выполнения задач OCR в некоторых документах с использованием Python.Как избежать кода ошибки Http 429 от API Google Vision?

Он начинает работать отлично, пока я не получу код ошибки Http 429, что означает, что я делаю слишком много запросов за короткий промежуток времени. Затем я решил поспать между каждым запросом, время которого увеличивается по мере увеличения количества Http Error Code 429. Однако через некоторое время сообщение об ошибке продолжает поступать. Поскольку сообщения продолжают поступать, время сна продолжает расти, пока оно не достигнет точки, в которой он спит так долго, что я теряю связь.

Самое странное, что если я получаю такое сообщение об ошибке много раз подряд и немедленно завершаю процесс и запускаю его снова, запросы начинают работать снова с первой попытки.

Другими словами, кажется, что, независимо от времени сна, я начинаю получать такие сообщения в какой-то момент, и единственный способ вернуть его снова - это перезапустить процесс (который вообще не вызывает чувства).

Как избежать такого сообщения об ошибке без перезапуска процесса? Может кто-нибудь мне помочь?

Большое спасибо!

EDIT:

Это код запроса (часть его).

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

Есть ли заголовок 'Retry-After', так что вы знаете, когда нужно сделать следующий запрос? – jonrsharpe

+0

@jonrsharpe спасибо за ваш быстрый ответ. я попытался получить информацию заголовка, но кажется, что запрос сделан полностью внутри метода из API, который я использую.Поэтому у меня нет доступа к любому ответу и заголовку, когда он приходит с ошибкой. API просто бросает исключение (в данном случае HttpError). К сожалению, я не мог найти ничего в сообщении об исключении, которое могло бы помочь. Это вызов: request = self.vision.images(). Annotate (body = {'requests': batch_request}) –

+0

Какую библиотеку вы используете? Иногда ошибка будет иметь больше информации, если вы поймаете и осмотрите ее: 'urlib2'' HttpError', например, содержит 'info',' message', 'reason' и т. Д. –

ответ

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" 

Вам не нужно увеличить время сна с каждым запросом, просто увеличить его, если запрос не удается при использовании любого из вышеуказанных подходов. ищите алгоритм экспоненциального отклика в документах.

+0

Использование ключа учетной записи службы - это то, что исправила мою проблему. Благодарю. – Cheesegraterr

Смежные вопросы