2015-01-13 27 views
11

Bazı adresleri coğrafi olarak kodlamak için geopy kullanıyorum ve zaman aşımı hatalarını yakalamak ve yazdırmak istiyorum, böylece girişimde bazı kalite kontrollerini yapabilirim. Geocode isteğini bir try/catch'a koydum ama çalışmıyor. Ne yapmam gerektiğine dair bir fikrin var mı?Geopy: zaman aşımı hatası yakala

İşte benim kodudur:

try: 
    location = geolocator.geocode(my_address)    
except ValueError as error_message: 
    print("Error: geocode failed on input %s with message %s"%(a, error_message)) 

Aşağıdaki özel durum almak:

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 

şimdiden teşekkür ederiz!

+1

Yanlış bir istisna yakalamaktasınız; yakalamanız gereken istisna "GeocoderTimedOut". –

cevap

15

bu deneyin:

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)) 

Ayrıca size geolocator için yapıyoruz diyoruz coğrafi kod üzerinde zaman aşımı artırmayı düşünebilirsiniz. Benim örnekte bunun gibi bir şey olurdu:

location = geolocator.geocode(my_address, timeout=10) 

veya

location = geolocator.geocode(my_address, timeout=None) 
+2

Sadece bir not, GeocoderTimedOut hatası içinde 'e' içindeki mesaj' .msg' –

+0

yerine şimdi .message 'gibi görünüyor. –

1
Bu adresini birden çok kez talep etmek çalıştı ve onlar geçici olarak sizi engelledi ya aşağı yavaşladı çünkü bu sorunu yaşıyor olabilirsiniz

yüzünden kendi usage policy. Saniyede birinden daha fazla istek olmadığını ve sonuçlarınızı önbelleğe almanız gerektiğini belirtir. Bu soruna rastladım ve bir çift çözümün var. Kodunuzu değiştirmek istemiyorsanız, 2500 istek/gün gibi bir şey için kullanabileceğiniz bir Google API anahtarı alabilir veya sonuçlarınızı önbelleğe alabilirsiniz. Sorunum için AWS üzerinde DynamoDB'yi kullandığım için, devam ettim ve sonuçların önbelleğini aldığım bir tablo oluşturdum. Here is the gist of my code.