"HTTPError: 429 Client Error: Too Many Requests for url" in Python [w/ Azure developer account]

"HTTPError: 429 Client Error: Too Many Requests for url" in Python [w/ Azure developer account]

在尝试 运行 Python 对包含 5-20 张图像的小示例目录进行编码时不断出现异常。

我在 Microsoft 有一个开发者帐户(截至今天上午),并已咨询过 Azure 支持,但仅通过聊天无法解决此问题。他们指示我在此处 post,所以如果它让其他人眼花缭乱,我很抱歉!

这个网络范围内的文档很少。也许这会对其他人有所帮助,因为对于像我这样拥有大量杂乱无章的图像的图形和媒体人员来说,这可能会改变游戏规则。

请注意,此代码昨晚确实有效!但只有一次。不知道哪里出了问题!

# API reference :

# https://westus.dev.cognitive.microsoft.com/docs/services/5adf991815e1060e6355ad44/operations/56f91f2e778daf14a499e1fa

# 参考 : https://ledge.ai/microsoft-computer-vision-api/

# 機能概要 : img フォルダ中の画像をAI解析し、ファイルのリネームを行います。

# 使い方 : python3 cv_demo.py

# 注意 : サブスクリプションキーは変更してください


import requests

import glob

import os

import time

import urllib



subscription_key = "i do have a real subscription key don't worry"

assert subscription_key



vision_base_url = "https://westcentralus.api.cognitive.microsoft.com/vision/v2.0/"

analyze_url = vision_base_url + "analyze"



# ファイル名を変更

def file_rename(list_1, list_2):

    for i in range(len(list_1)):

        os.rename(list_1[i], './img/' + list_2[i] + '.jpg')



def ms_computer_vision_api(filepath):

    headers = {'Ocp-Apim-Subscription-Key': subscription_key,'Content-Type': 'application/octet-stream'}

    params = urllib.parse.urlencode({
    # Request parameters
   'visualFeatures': 'Categories,Tags,Description,Faces'
   })





    img = open(filepath, 'rb')

    img_byte = img.read()



    response = requests.post(analyze_url, data=img_byte, headers=headers, params=params)

    response.raise_for_status()



    return response.json()



if __name__ == "__main__":

    # 画像ファイルを配列に格納

    image_file = glob.glob('./img/*')



    vision_file_name = []



    start = time.time()



    # Computer Vision APIにリクエストして結果を取得

    for i in range(len(image_file)):

        json_data = ms_computer_vision_api(image_file[i])



        # 生成された文章を取得

        file_name = json_data['description']['captions'][0]['text']

        vision_file_name.append(file_name)



    # 文章の空白をファイル名用にアンダーバーに修正

    for i in range(len(vision_file_name)):

        vision_file_name[i] = vision_file_name[i].replace(' ', '_')



    file_rename(image_file,vision_file_name)



    # 経過時間を出力

    print("elapsed_time:{0}".format(time.time() - start) + "[sec]")
 File "C:\Users\MyName\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\requests\models.py", line 940, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 429 Client Error: Too Many Requests for url: https://renameimages.cognitiveservices.azure.com/vision/v2.0/analyze?visualFeatures=Description

根据您的代码,此错误来自请求认知 API 的循环。

实际上每个认知服务都有TPS(Transaction Per Second)的限制,超过TPS就会报429错误。即使特定的认知服务有更高的 TPS,比如 50 TPS,也许你仍然有 429 错误。您应该始终使用以下策略以避免将来出现 429。

下面是429的解释和429的处理方法

  1. HTTP 429 表示 RateLimitExceeded,这意味着您每秒或每分钟进行的 API 调用过多。

  2. 当HTTP 429发生时,您必须等待一段时间再调用API,否则下一次调用API将被拒绝。通常我们使用类似指数退避重试策略的方法重试操作来处理 429 错误:

2.1) 您需要检查代码中的 HTTP 响应代码。

2.2) 当HTTP响应码为429时,则在N秒后重试此操作,如10秒可自行定义...

例如,下面是429的响应。您可以将等待时间设置为(26 + n)秒。 (PS:这里可以自己定义n,比如n = 5...)

{
    "error":{
       "statusCode": 429,
        "message": "Rate limit is exceeded. Try again in 26 seconds." 
    }
}

2.3) 如果第2步成功,继续下一步操作。

2.4) 如果步骤 2 也以 429 失败,请在 N*N 秒后重试此操作(您也可以自己定义)这是一种指数退避重试策略..

2.5) 如果步骤 4 也以 429 失败,请在 NNN 秒后重试此操作…

2.6) 始终等待当前操作成功,等待时间呈指数增长