imgurpython.helpers.error.ImgurClientRateLimitError: Превышен предел скорости

У меня есть следующая ошибка:

/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/, оно должно быть бесплатным, но мне пришлось зарегистрировать свое приложение, чтобы получить материал, связанный с 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 ответ

Решение

Ограничение скорости относится к тому, как часто вы подключаетесь к API, а не к тому, сколько вызовов вам разрешено. Для предотвращения "забивания" у большинства API есть ограничение скорости (например, 30 запросов в минуту, 1 каждые 2 секунды). Ваш скрипт выполняет запросы максимально быстро, в сотни или даже тысячи раз быстрее, чем предел.

Чтобы ваш скрипт не работал, самое простое решение - ввести sleep на ваш цикл.

from time import sleep

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

Отрегулируйте время ожидания, чтобы оно было как минимум на одну секунду больше, чем то, что API определяет как ограничение скорости.

https://api.imgur.com/

Imgur API использует систему распределения кредитов для обеспечения справедливого распределения мощностей. Каждое приложение может разрешить приблизительно 1250 загрузок в день или приблизительно 12500 запросов в день. Если ежедневный лимит будет превышен пять раз в месяц, то приложение будет заблокировано до конца месяца. Оставшийся кредитный лимит будет отображаться с каждым ответом на запросы в X-RateLimit-ClientRemaining HTTP заголовок.

Таким образом, 12500 запросов / 24 часа - это 520 запросов в час или ~8 в минуту. Это значит, что ваш сон должен длиться около 8 секунд.

Другие вопросы по тегам