错误(429)在Python

时间:2018-04-03 22:49:33

标签: python pandas geocoding geopy

我有一个行数约为20k的Pandas数据帧,我正在尝试按地址列对lat / long坐标进行地理编码。

如何使用time.sleep()或其他功能阻止我现在获得的Too Many Requests 429 error OSM Nominatim?

这是我用于此的代码:

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

提前致谢!

2 个答案:

答案 0 :(得分:2)

自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

答案 1 :(得分: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

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