【问题标题】:error (429) Too Many Requests while geocoding with geopy in Python错误 (429) 在 Python 中使用 geopy 进行地理编码时请求过多
【发布时间】:2018-09-13 09:03:33
【问题描述】:

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

我如何使用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()

提前致谢!

【问题讨论】:

标签: python pandas geocoding geopy


【解决方案1】:

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

【讨论】:

  • 如果我保留min_delay_seconds = 2,此解决方案对我有效。我没有使用 Nomatim 对象。我正在使用类似from geopy.geocoders import GoogleV3 nom = GoogleV3(scheme = "http")
【解决方案2】:

我想你会使用 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

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

【讨论】:

  • 显然我仍然遇到同样的错误,无论出于何种原因,即使使用 time.sleep(2000)
  • 呃,可能是这种情况:/ 他们会阻塞时间跨度还是永久阻塞?
  • @seizethedata 您可能需要检查operations.osmfoundation.org/policies/nominatim。 Nominatim 不适用于批量地理编码。可能允许小的一次性批量地理编码请求。绝对限制为每秒 1 个请求。您可能需要等待明天再试。
猜你喜欢
  • 1970-01-01
  • 2015-09-24
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
相关资源
最近更新 更多