如何防止 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 out
和ProxyError('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 速率限制器 - 滑动窗口