"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的处理方法
HTTP 429 表示 RateLimitExceeded,这意味着您每秒或每分钟进行的 API 调用过多。
当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) 始终等待当前操作成功,等待时间呈指数增长
在尝试 运行 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的处理方法
HTTP 429 表示 RateLimitExceeded,这意味着您每秒或每分钟进行的 API 调用过多。
当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) 始终等待当前操作成功,等待时间呈指数增长