imgurpython.helpers.error.ImgurClientRateLimitError:超出了速率限制

时间:2016-10-18 18:22:20

标签: python api http imgur rate-limiting

我有以下错误:

/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
Traceback (most recent call last):
  File "download.py", line 22, in <module>
    search = imgur_client.gallery_search('cat', window='all', sort='time', page=p)
  File "/usr/local/lib/python2.7/dist-packages/imgurpython/client.py", line 531, in gallery_search
    response = self.make_request('GET', 'gallery/search/%s/%s/%s' % (sort, window, page), data)
  File "/usr/local/lib/python2.7/dist-packages/imgurpython/client.py", line 153, in make_request
    raise ImgurClientRateLimitError()
imgurpython.helpers.error.ImgurClientRateLimitError: Rate-limit exceeded!

代码:

  1 from imgurpython import ImgurClient
  2 import inspect
  3 import random
  4 import urllib2
  5 import requests
  6 from imgurpython.helpers.error import ImgurClientError
  7 
  8 client_id = "ABC"
  9 client_secret = "ABC"
 10 access_token = "ABC"
 11 refresh_token = "ABC"
 12 
 13 
 14 
 15 image_type = ['jpg', 'jpeg']
 16 
 17 imgur_client = ImgurClient(client_id, client_secret, access_token, refresh_token)
 18 
 19 item_count = 0
 20 for p in range(1, 10000):
 21     try:
 22         search = imgur_client.gallery_search('cat', window='all', sort='time', page=p)
 23         for i in range(0,https://gist.github.com/monajalal/e02792e9a5cbced301a8691b7a62836f len(search)):
 24             item_count +=1
 25             print(search[i].comment_count)
 26             if search[i].comment_count > 10 and not search[i].is_album:
 27                 print(search[i].type)
 28                 if search[i].type[6:] in image_type:
 29                     count = 0
 30                     try:
 31                         image_file = urllib2.urlopen(search[i].link, timeout = 5)
 32                         image_file_name = 'images/'+ search[i].id+'.'+search[i].type[6:]
 33                         output_image = open(image_file_name, 'wb')
 34                         output_image.write(image_file.read())
 35                         for post in imgur_client.gallery_item_comments(search[i].id, sort='best'):
 36                             if count <= 10:
 37                                 count += 1
 38                         output_image.close()
 39                     except urllib2.URLError as e:
 40                         print(e)
 41                         continue
 42                     except socket.timeout as e:
 43                         print(e)
 44                         continue
 45                     except socket.error as e:
 46                         print(e)
 47                         continue
 48     except ImgurClientError as e:
 49         print(e)
 50         continue
 51 
 52 print item_count

我也经常看到这条线:

/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning

如何修复错误? Imgur中的速率限制错误是否有任何解决方法?所以我创建这个应用程序用于学术研究而不是商业用途,根据https://api.imgur.com/#limits它应该是免费的,但我必须注册我的应用程序以获取client_id相关的东西。如何将我的应用程序设置为非商业应用程序,以便我不会收到此速率限制错误,或者如果所有类型的应用程序都出现此错误,我应该如何处理它?我应该如何设置我的代码,以便每小时只发出1250个请求?

此处还有我的信用信息:

User Limit: 500
User Remaining: 500
User Reset: 2016-10-18 14:32:41
User Client Limit: 12500
User Client Remaining: 9570

更新:根据答案中建议的睡眠(8),我最终会继续这样做。对于不同的搜索查询,这发生在不同的页面。如何修复代码,以便在发生这种情况时停止执行?以下是更新的相关代码:https://gist.github.com/monajalal/e02792e9a5cbced301a8691b7a62836f

page number is: 157
0
image/jpeg
page number is: 157
0
page number is: 157
0
page number is: 157
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning

1 个答案:

答案 0 :(得分:1)

费率限制是指您访问API的频率,而不是您允许的通话次数。为防止锤击,大多数API都有速率限制(例如:每分钟30个请求,每2秒1个)。您的脚本尽可能快地发出请求,比限制快几百甚至几千倍。

为了防止您的脚本被敲定,最简单的解决方案是在您的for循环中引入sleep

from time import sleep

for i in range(10000):
    print i
    sleep(2) # seconds

将睡眠时间调整为比API定义的速率限制至少大一秒。

https://api.imgur.com/#limits

  

Imgur API使用信用分配系统来确保容量的公平分配。每个应用程序可以允许每天大约1,250次上传或每天大约12,500次请求。如果每月限额达到五次,则该应用程序将在该月的剩余时间内被阻止。剩余的信用额度将与X-RateLimit-ClientRemaining HTTP标头中的每个请求响应一起显示。

因此12500个请求/ 24小时是每小时520个请求或每分钟大约8个请求。这意味着你的睡眠时间应该是8秒左右。