错误(429)在Python中使用geopy进行地理编码时,请求过多

sei*_*ata 5 python geocoding geopy pandas

我有一个Pandas约有2万行的数据框,并且正在尝试按地址列将其地理编码为经纬度坐标。

我该如何使用time.sleep()OSM Nominatim或其他功能来阻止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()
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Kos*_*kov 5

从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()
Run Code Online (Sandbox Code Playgroud)

文件:https//geopy.readthedocs.io/en/1.16.0/#usage-with-pandas


Mar*_*bak 0

我想象你使用 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
Run Code Online (Sandbox Code Playgroud)

这就是您如何实现 sleep 以便在再次运行循环之前等待 2 秒。此外,如果地理定位器无法找到纬度和经度,它将通过,而不是退出循环并让您重新开始。

  • @seizethedata 您可能需要检查 https://operations.osmfoundation.org/policies/nominatim/。Nominatim 不适用于批量地理编码。可以允许小规模的一次性批量地理编码请求。绝对限制为每秒 1 个请求。您可能需要等待明天再试。 (2认同)