首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >错误(429)在Python中使用geopy进行地理编码时请求太多

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

Stack Overflow用户
提问于 2018-04-04 06:49:33
回答 2查看 9.6K关注 0票数 10

我有一个大约有20k行的Pandas数据帧,我正在尝试按地址列将其地理编码为经纬度坐标。

如何使用time.sleep()或其他函数从我现在得到的Too Many Requests 429 error中停止OSM Nominatim?

下面是我使用的代码:

代码语言:javascript
复制
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()

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2018-07-29 01:18:49

从1.16.0开始,geopy包含一个RateLimiter类,它通过在查询之间添加延迟并重试失败的请求,提供了一种处理Too Many Requests 429 error的便捷方法。

代码语言:javascript
复制
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

票数 13
EN

Stack Overflow用户

发布于 2018-04-04 06:57:27

我可以想象您使用了for循环。在看不到数据的情况下,它看起来就像这样。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49640197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档