web-dev-qa-db-ja.com

エラー(429)Python)でgeopyを使用してジオコーディング中にリクエストが多すぎます

約2万行のPandasデータフレームがあり、住所列ごとに緯度/経度の座標にジオコーディングしようとしています。

time.sleep()または他の関数を使用して、現在取得しているToo Many Requests 429 errorからOSMNominatimを停止するにはどうすればよいですか?

これに使用するコードは次のとおりです。

from geopy.geocoders import Nominatim
from geopy.distance import vincenty

geolocator = Nominatim()
df['coord'] = df['address'].apply(geolocator.geocode).apply(lambda x: (x.latitude, x.longitude))
df.head()

前もって感謝します!

6
seizethedata

1.16.0以降のgeopyにはRateLimiterクラスが含まれており、クエリ間に遅延を追加して失敗したリクエストを再試行することで、Too Many Requests 429 errorを処理する便利な方法を提供します。

from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="specify_your_app_name_here")

from geopy.extra.rate_limiter import RateLimiter
geocode = RateLimiter(geolocator.geocode, min_delay_seconds=1)

df['coord'] = df['address'].apply(geocode).apply(lambda location: (location.latitude, location.longitude))
df.head()

ドキュメント: https://geopy.readthedocs.io/en/1.16.0/#usage-with-pandas

6
KostyaEsmukov

Forループを使用すると思います。データが表示されない場合は、次のようになります。

x = df['address'].tolist()
names = []

for item in x:
    d={}
    a = geolocator.geocode(item, exactly_one=True, timeout=60)
    try:
        d["Latitude"] = a.latitude
    except:
        pass
    try:
        d["Longitude"] = a.longitude
    except:
        pass
    time.sleep(2)
    names.append(d)

d

これは、ループを再度実行する前に2秒間待機するスリープを実装する方法です。また、ジオロケーターが緯度と経度を見つけられない場合は、ループを終了して最初からやり直すのではなく、通過します。

0
Martin Bobak