Geopy: ошибка таймаута catch
Я использую геофизику для геокодирования некоторых адресов, и я хочу поймать ошибки таймаута и распечатать их, чтобы я мог выполнить некоторый контроль качества на входе. Я помещаю запрос геокода в try/catch, но он не работает. Любые идеи о том, что мне нужно делать?
Вот мой код:
try:
location = geolocator.geocode(my_address)
except ValueError as error_message:
print("Error: geocode failed on input %s with message %s"%(a, error_message))
Я получаю следующее исключение:
File "/usr/local/lib/python2.7/site-packages/geopy/geocoders/base.py", line 158, in _call_geocoder
raise GeocoderTimedOut('Service timed out')
geopy.exc.GeocoderTimedOut: Service timed out
Заранее благодарю вас!
Ответы
Ответ 1
Попробуйте следующее:
from geopy.geocoders import Nominatim
from geopy.exc import GeocoderTimedOut
my_address = '1600 Pennsylvania Avenue NW Washington, DC 20500'
geolocator = Nominatim()
try:
location = geolocator.geocode(my_address)
print location.latitude, location.longitude
except GeocoderTimedOut as e:
print("Error: geocode failed on input %s with message %s"%(my_address, e.msg))
Вы также можете рассмотреть возможность увеличения тайм-аута при вызове геокода, который вы делаете, в свой геолокатор. В моем примере это будет примерно так:
location = geolocator.geocode(my_address, timeout=10)
или
location = geolocator.geocode(my_address, timeout=None)
Ответ 2
У вас может возникнуть эта проблема, потому что вы пытались запросить этот адрес несколько раз, и они временно заблокировали вас или замедлили вас из-за их политики использования. В нем больше нет запросов, чем один раз в секунду, и что вы должны кэшировать свои результаты. Я столкнулся с этой проблемой, и у вас есть несколько решений. Если вы не хотите сильно менять свой код, вы можете получить ключ API Google, который можно использовать для чего-то вроде 2500 запросов/дней бесплатно, или вы можете кэшировать свои результаты. Поскольку я уже использовал DynamoDB на AWS для своей проблемы, я пошел дальше и только создал таблицу, в которой я кэширую свои результаты. Вот суть моего кода.