如何防止 Geopy 出现此速率限制器错误?

Posted

技术标签:

【中文标题】如何防止 Geopy 出现此速率限制器错误?【英文标题】:How Do I Prevent This Rate Limiter Error on Geopy? 【发布时间】:2021-11-12 23:07:59 【问题描述】:

我有一个充满英国邮政编码的数据框。我有大约 400 行,想要获取这些邮政编码的地理编码,以便以后绘制它们。我使用了以下指南,因此也不确定是什么导致了错误:

https://practicaldatascience.co.uk/data-science/how-to-geocode-and-map-addresses-in-geopy

我有以下代码。我使用的数据框只是一个 1 列长的数据框,其中包含来自虚拟数据集的英国邮政编码。

import pandas as pd

import folium

import geopy
from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiter

geocoder = RateLimiter(Nominatim(user_agent='Get_Lat_Longs').geocode, min_delay_seconds=1)

df = pd.read_excel('Postcodes.xls', sheet_name='Addresses formatted')

df_copy = df.copy()

df_postcodes = df_copy['Postcode'].to_frame()
df_postcodes['Geocode'] = df_postcodes['Postcode'].apply(geocoder)

但是,我收到以下错误,我不太确定如何调试我所做的工作,我们将不胜感激。

RateLimiter caught an error, retrying (0/2 tries). Called with (*('N20 0PE',), **).
Traceback (most recent call last):
  File "c:\users\np\env\lib\site-packages\urllib3\connectionpool.py", line 696, in urlopen
    self._prepare_proxy(conn)
  File "c:\users\np\env\lib\site-packages\urllib3\connectionpool.py", line 964, in _prepare_proxy
    conn.connect()
  File "c:\users\np\env\lib\site-packages\urllib3\connection.py", line 364, in connect
    conn = self._connect_tls_proxy(hostname, conn)
  File "c:\users\np\env\lib\site-packages\urllib3\connection.py", line 507, in _connect_tls_proxy
    ssl_context=ssl_context,
  File "c:\users\np\env\lib\site-packages\urllib3\util\ssl_.py", line 453, in ssl_wrap_socket
    ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls)
  File "c:\users\np\env\lib\site-packages\urllib3\util\ssl_.py", line 495, in _ssl_wrap_socket_impl
    return ssl_context.wrap_socket(sock)
  File "C:\Program Files\Python37\lib\ssl.py", line 423, in wrap_socket
    session=session
  File "C:\Program Files\Python37\lib\ssl.py", line 870, in _create
    self.do_handshake()
  File "C:\Program Files\Python37\lib\ssl.py", line 1139, in do_handshake
    self._sslobj.do_handshake()
socket.timeout: _ssl.c:1074: The handshake operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\np\env\lib\site-packages\requests\adapters.py", line 449, in send
    timeout=timeout
  File "c:\users\np\env\lib\site-packages\urllib3\connectionpool.py", line 796, in urlopen
    **response_kw
  File "c:\users\np\env\lib\site-packages\urllib3\connectionpool.py", line 796, in urlopen
    **response_kw
  File "c:\users\np\env\lib\site-packages\urllib3\connectionpool.py", line 756, in urlopen
    method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
  File "c:\users\np\env\lib\site-packages\urllib3\util\retry.py", line 574, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='nominatim.openstreetmap.org', port=443): Max retries exceeded with url: /search?q=N20+0PE&format=json&limit=1 (Caused by ProxyError('Cannot connect to proxy.', timeout('_ssl.c:1074: The handshake operation timed out')))

【问题讨论】:

问题不是rate limit 而是The handshake operation timed outProxyError('Cannot connect to proxy. - 它无法与服务器连接,所以它一次又一次地尝试 - 但问题是连接错误。也许这只是服务器的临时问题,或者您必须更新OpenSSL,或者您使用代理服务器,您应该跳过它,因为它不起作用。 如果我运行geocoder('Buckingham Palace, London, SW1 1AA'),那么它可以正常工作,但会给出None。如果我运行geocoder('a'),那么我会得到error - 当数据没有意义时,服务器似乎有问题。我看到您的代码尝试搜索N20+0PE(在您的错误Max retries exceeded with url: /search?q=N20+0PE 中),也许这会导致所有问题。也许你应该在try/except 中运行它来捕获错误。 我尝试了除块之外的尝试,但仍然没有运气。我在虚拟机上运行它,这可能是问题吗?但是,它不应该给 None 应该吗?该示例表明它应该可以工作? 也许首先使用print() 看看它有什么价值。接下来直接在网页上尝试这个值,看看它是否可以给出结果。在虚拟机中,您也可以使用 Web 浏览器(如果您使用 GUI 运行它)来测试您是否与 Internet 连接,或者您可以尝试在控制台 ping www.somepage.com 中检查它是否可以连接到此页面。您还可以检查您是否获得了None for geocoder('Buckingham Palace, London, SW1 1AA') - 它可以确认它有连接。 所以用邮政编码,当我在网站上手动输入时,它能够找到位置就好了?这就是为什么我不确定这是否是问题所在。很奇怪 【参考方案1】:

问题是我试图在虚拟机中执行此操作。检查给定的 cmets 后,我能够确定在虚拟机内部,请求没有发送到网站,但是在我的本地计算机上,这不是问题,我能够获取所有内容的地理编码.

【讨论】:

以上是关于如何防止 Geopy 出现此速率限制器错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何限制/速率限制请求以防止 Axios 出现 429 错误

Angular - http 拦截器 - http 速率限制器 - 滑动窗口

在 Laravel 中禁用速率限制器?

如何在 laravel 8 中动态设置速率限制器

如何使用 Python 绕过速率限制 ..HTML 错误 1015

海缆弯曲限制器全性能测试体系