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 для своей проблемы, я пошел дальше и только создал таблицу, в которой я кэширую свои результаты. Вот суть моего кода.