Ошибка обхода TooManyRequests

Я использую overpy для запросов к Overpass API, и природа данных такова, что мне нужно выполнить много запросов. Я столкнулся с исключением 429 OverpassTooManyRequests и пытаюсь играть по правилам. Я пытался ввести методы time.sleep для разделения запросов, но у меня нет оснований для того, как долго программа должна ждать, прежде чем продолжить.

Я нашел эту ссылку, в которой упоминается заголовок «Повторить попытку»:
Как избежать ошибки HTTP 429 (слишком много запросов) python

Есть ли способ получить доступ к этому заголовку в ответе overpy? Я просмотрел документы и исходный код, но ничего не выделилось, что позволило бы мне получить доступ к этому заголовку, чтобы я мог приостановить запросы, пока не будет приемлемо сделать это снова.

Я использую Python 3.6 и overpy 0.4.


person Chris M.    schedule 26.04.2017    source источник
comment
Вместо того, чтобы распределять запросы, почему бы просто не поймать исключение OverpassTooManyRequests, подождать 10 секунд и повторить попытку? Если слишком рано, то он просто подождет еще 10 секунд.   -  person Peter    schedule 26.04.2017
comment
Вам необходимо оценить результаты вызова /api/status. Кстати: сколько стоит много запросов? Вы знаете об ограничениях использования? Это 10 000 запросов для всех ваших пользователей в день. На данный момент забудьте о заголовке Retry-after, он еще не реализован, см. github.com /drolbr/Overpass-API/issues/351   -  person mmd    schedule 26.04.2017
comment
@mmd около 450 запросов, однако это не скрипт, который будет повторять все эти запросы повторно. Запросы выполняются один раз, результаты добавляются в файл карты HTML, и файл карты становится общим. В идеале вы должны делать запросы один раз для заданного набора данных и больше никогда не делать этого. Так что единственный пользователь, делающий запросы, это я. И я знаю о лимите в 10 000 в день.   -  person Chris M.    schedule 26.04.2017
comment
450 запросов не слишком много, если только они не очень дорогие. Другие библиотеки уже реализуют логику для оценки /api/status, вот пример для R, если вы не возражаете: github.com/hrbrmstr/overpass/blob/master/R/overpass_query.r   -  person mmd    schedule 26.04.2017
comment
@mmd Я не знаком с R (я знаю, что это такое, но никогда им не пользовался). Есть ли способ оценить /api/status в Python или OverPy?   -  person Chris M.    schedule 26.04.2017
comment
Почему бы тогда не поднять вопрос об OverPy?   -  person mmd    schedule 26.04.2017
comment
Вы меня извините, я не привык предлагать... улучшения? к модулю. Я просто предлагаю им добавить способ оценки /api/status в их репозиторий Github?   -  person Chris M.    schedule 26.04.2017
comment
Конечно, почему бы и нет? :)   -  person mmd    schedule 26.04.2017


Ответы (3)


Возможно, это не совсем тот ответ, который вы ищете, но я столкнулся с той же проблемой и исправил ее, просто разместив свой собственный сервер базы данных OSM с помощью докера. Просто клонируйте репо и следуйте инструкциям:

https://github.com/mediasuitenz/docker-overpass-api

person B.abba    schedule 03.12.2018

из http://overpass-api.de/command_line.html убедитесь, что вы не есть один «неуправляемый» запрос, который занимает все ресурсы.

person Rene    schedule 26.04.2017
comment
Когда я нажимаю ссылку на overpass-api.de/api/kill_my_queries, я получаю пустое страница. Это нормально? - person Chris M.; 26.04.2017
comment
Да, это означает, что ни один запрос не был убит. - person mmd; 26.04.2017

Убедившись, что у меня нет неуправляемых запросов, я последовал совету Питера и добавил уловку для исключения TooManyRequests, которое ждет 30 секунд и пытается снова. Кажется, это работает как немедленное решение.

Я также подниму вопрос с создателями OverPy, чтобы предложить улучшение, позволяющее оценивать /api/status в соответствии с советом mmd.

person Chris M.    schedule 26.04.2017
comment
Как только вы поднимете вопрос с OverPy, не могли бы вы также опубликовать ссылку на него здесь. Спасибо. - person mmd; 28.04.2017