我有一个包含约20k行的Pandas数据帧,我正在尝试按地址列将地理编码到lat/long坐标中。
我该如何使用time.sleep()或其他函数来阻止osm nominatim从Too Many Requests 429 error开始?
以下是我用于此的代码:

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

提前谢谢!

最佳答案

geopy自1.16.0以来包含一个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

08-17 10:52