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 определяет как ограничение скорости.
Imgur API использует систему распределения кредитов для обеспечения справедливого распределения мощностей. Каждое приложение может разрешить приблизительно 1250 загрузок в день или приблизительно 12500 запросов в день. Если ежедневный лимит будет превышен пять раз в месяц, то приложение будет заблокировано до конца месяца. Оставшийся кредитный лимит будет отображаться с каждым ответом на запросы в
X-RateLimit-ClientRemaining
HTTP заголовок.
Таким образом, 12500 запросов / 24 часа - это 520 запросов в час или ~8 в минуту. Это значит, что ваш сон должен длиться около 8 секунд.