Python GeocoderUnavailable:HTTPSConnectionPool错误,某些地址使用geopy和Namingm

Python GeocoderUnavailable:HTTPSConnectionPool错误,某些地址使用geopy和Namingm,python,urllib3,geopy,nominatim,Python,Urllib3,Geopy,Nominatim,当使用Namingm进行地理编码时,某些地址会出错。我真的不明白为什么一个地址会出现错误,而另一个地址不会,例如,简单地更改门牌号就可以产生差异 当我通过urllib3发出错误消息中提到的API请求时,它会工作,因此我假设错误是由geopy引起的,但我不确定 最小可重复示例 从geopy.geocoders导入提名 geolocator=提名者\代理=我的测试应用程序 地理定位程序。地理代码{'country':'DE','city':'Erlangen','postalcode':'91052

当使用Namingm进行地理编码时,某些地址会出错。我真的不明白为什么一个地址会出现错误,而另一个地址不会,例如,简单地更改门牌号就可以产生差异

当我通过urllib3发出错误消息中提到的API请求时,它会工作,因此我假设错误是由geopy引起的,但我不确定

最小可重复示例 从geopy.geocoders导入提名 geolocator=提名者\代理=我的测试应用程序 地理定位程序。地理代码{'country':'DE','city':'Erlangen','postalcode':'91052', “街道”:“纽伦堡大街6号”正在工作 >>>拜仁埃尔兰根塞巴杜西德隆纽伦堡大街,邮编:91052,德国,49.5772384,11.015895,0.0 地理定位程序。地理代码{'country':'DE','city':'Erlangen','postalcode':'91052', “street”:“Nürnberger Straße 7”错误 错误消息 -------------------------------------- 超时回溯上次最近的呼叫 C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\urllib3\connectionpool.py in\u make\u requestself,conn,method,url,timeout,chunked,**httplib\u request\u kw 425否则它看起来像是代码中的错误。 ->426.从我这里升起,没有 427除SocketTimeout、BASESSLEROR、SOCKETTERROR as e外: C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\urllib3\packages\six.py在raise\u fromvalue、from\u value中 C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\urllib3\connectionpool.py in\u make\u requestself,conn,method,url,timeout,chunked,**httplib\u request\u kw 请尝试: ->421 httplib_response=conn.getresponse 422基本例外情况除外,如e: getresponseself中的C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\http\client.py 1353尝试: ->1354响应。开始 1355除连接错误外: beginself中的C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\http\client.py 305虽然正确: ->306版本、状态、原因=自身状态 307如果状态!=继续: C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\http\client.py in\u read\u statusself 266定义读取状态自身: ->267行=strself.fp.readline_MAXLINE+1,iso-8859-1 268如果lenline>\u MAXLINE: C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\socket.py在readintoself中,b 588试试: ->589返回自我。接收到 590除超时外: C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\ssl.py in recv\u intoself、缓冲区、n字节、标志 1070自修班__ ->1071返回self.readn字节,缓冲区 1072其他: C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\ssl.py在readself、len、buffer中 928如果缓冲区不是无: ->929返回self.\u sslobj.readlen,缓冲区 930其他: 超时:读取操作超时 在处理上述异常期间,发生了另一个异常: ReadTimeoutError回溯最近一次呼叫last C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\urllib3\connectionpool.py在urlopenself中,方法,url,正文,标题,重试,重定向,断言相同的主机,超时,池超时,释放连接,分块,正文位置,**响应 676头=头, ->677分块=分块, 678 C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\urllib3\connectionpool.py in\u make\u requestself,conn,method,url,timeout,chunked,**httplib\u request\u kw 427除SocketTimeout、BASESSLEROR、SOCKETTERROR as e外: ->428 self.\u raise\u timeouterr=e,url=url,timeout\u value=read\u timeout 429提高 C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\urlib3\connectionpool.py in\u raise\u timeoutself,err,url,timeout\u value 335上升读取超时错误 ->336 self,url,读取超时。读取超时=%s%timeout\u值 337 ReadTimeoutError:HTTPSConnectionPoolhost='Namingm.openstreetmap.org',port=443:读取超时。读取超时=1 在处理上述异常期间,发生了另一个异常: MaxRetryError回溯上一次最近的呼叫 sendself中的C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\requests\adapters.py、请求、流、超时、验证、证书、代理 448次重试=自最大重试次数, ->449超时=超时 450 C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\urllib3\connectionpool.py在urlopenself中,方法,url,正文,标题,重试,重读 ct,断言相同主机,超时,池超时,释放连接,分块,主体位置,**响应 766阀体位置=阀体位置, ->767**响应功率(千瓦) 768 C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\urllib3\connectionpool.py在urlopenself中,方法,url,正文,标题,重试,重定向,断言相同的主机,超时,池超时,释放连接,分块,正文位置,**响应 766阀体位置=阀体位置, ->767**响应功率(千瓦) 768 C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\urllib3\connectionpool.py在urlopenself中,方法,url,正文,标题,重试,重定向,断言相同的主机,超时,池超时,释放连接,分块,正文位置,**响应 726次重试=重试次数增量 ->727方法,url,错误=e,_pool=self,_stacktrace=sys.exc_info[2] 728 C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\urlib3\util\retry.py in incrementself、方法、url、响应、错误、\u pool、\u stacktrace 445如果新的重试已用尽: ->446 raise MaxRetryError\u池、url、错误或响应错误原因 447 MaxRetryError:HTTPSConnectionPoolhost='Namingm.openstreetmap.org',port=443:url:/search?country=DE&city=Erlangen&postalcode=91052&street=N%C3%BCrnberger+Stra%C3%9Fe+7&format=json&limit=1导致的重试次数超过最大值,port=443:读取超时。读取超时=1 在处理上述异常期间,发生了另一个异常: ConnectionError回溯最近一次呼叫last C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\geopy\adapters.py in\u requestself、url、超时、标题 382试试: ->383 resp=self.session.geturl,timeout=timeout,headers=headers 384除异常作为错误外: C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\requests\sessions.py在getself中,url,**kwargs 554 kwargs.setdefault'allow_redirects',True ->555返回self。请求'GET',url,**kwargs 556 C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\requests\sessions.py in requestself、方法、url、参数、数据、标题、cookie、文件、身份验证、超时、允许重定向、代理、挂钩、流、验证、证书、json 541发送\u kwargs.updatesettings ->542 resp=self.sendprep,**发送 543 C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\requests\sessions.py在sendself中,request,**kwargs 654发送请求 ->655 r=adapter.sendrequest,**kwargs 656 sendself中的C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\requests\adapters.py、请求、流、超时、验证、证书、代理 515 ->516 raise ConnectionErrore,请求=请求 517 ConnectionError:HTTPSConnectionPoolhost='Namingm.openstreetmap.org',port=443:url:/search?country=DE&city=Erlangen&postalcode=91052&street=N%C3%BCrnberger+Stra%C3%9Fe+7&format=json&limit=1导致的重试次数超过最大值:/search?country=DE&city=Erlangen&postalcode=91052&street=N%C3%BCrnberger+Stra%C3%9Fe+7&format=json&limit=1,port=443。读取超时=1 在处理上述异常期间,发生了另一个异常: GeocoderUnavailable回溯最近一次呼叫last 在里面 -->1地理定位器。地理代码{'country':'DE','city':'Erlangen','postalcode':'91052','street':'Nürnberger Straße 7'} C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\geopy\geocoders\namitm.py在geocodeself中,查询,精确一个,超时,限制,地址详细信息,语言,几何体,外部标记,国家代码,视图框,有界,特征类型,名称详细信息 292记录器。调试%s。地理代码:%s,self.\u类\名称\ url 293 callback=partialself.\u parse\u json,justice\u one=justice\u one ->294返回self.\u调用\u geocoderurl,回调,超时=超时 295 296 def倒档 C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\geopy\geocoders\base.py in\u call\u geocoderself,url,callback,timeout,is\u json,headers 358试试: 359如果是json: ->360 result=self.adapter.get_jsonurl,timeout=timeout,headers=req_headers 361其他: 362结果=self.adapter.get\u texture,超时=超时,标头=请求标头 C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\geopy\adapters.py in get\u jsonself、url、超时、标题 371 372 def get_jsonself、url、*、超时、标题: ->373 resp=self.\u requesturl,timeout=timeout,headers=headers 374试试: 375返回resp.json C:\Users\USERNAME\Anaconda3\envs\crm\u templates\lib\site packages\geopy\adapters.py in\u requestself、url、超时、标题 393引发地理编码服务错误消息 394其他: ->395提高地理编码运行可用性消息 396 elif isinstanceerror,请求。超时: 397 raise GeocoderTimedOutService超时 GeocoderUnavailable:HTTPSConnectionPoolhost='Namingm.openstreetmap.org',port=443:url超过最大重试次数:/search?country=DE&city=Erlangen&postalcode=91052&street=N%C3%BCrnberger+Stra%C3%9Fe+7&format=json&limit=1,原因是ReadTimeoutErrorHTTPConnectionPoolHost='Namingm.openstreetmap.org',=443:读取超时。读取超时=1 使用urllib3的工作示例 导入urllib3 http=urllib3.PoolManager1,headers={'user-agent':'mytestapp'} url='1〕https://nominatim.openstreetmap.org/search?country=DE&city=Erlangen&postalcode=91052&street=N%C3%BCrnberger+Stra%C3%9Fe+7&format=json&limit=1' resp=http.request'GET',url json.loadsresp.data.decode >>>[{'place_id':17025708, >>>“许可证”:“数据©OpenStreetMap贡献者,ODbL 1.0。https://osm.org/copyright', >>>“osm_类型”:“节点”, >>>“osm_id”:1641967158, >>>“边界框”:[49.5924431”、“49.5925431”、“11.0043901”、“11.0044901]”, >>>“lat”:“49.5924931”, >>>“lon”:“11.0044401”, >>>“显示姓名”:“德国拜仁埃尔兰根阿姆安格尔纽伦堡大街7号邮政银行,邮编91052”, >>>“类”:“舒适性”, >>>“类型”:“银行”, >>>“重要性”:0.6309999999, >>>'图标':'https://nominatim.openstreetmap.org/ui/mapicons//money_bank2.p.20.png'}]
这些服务似乎托管在捐赠的服务器上。因此,提名建议避免广泛使用。我只能认为这是失败的原因——因为之前我提取了几百个,后来开始提取1000个位置

我求助于另一种解决方案来处理这个错误。解决这个错误变得非常困难。我在另一个解决方案中使用请求。在我的脚本中,我从Excel中读取latitude和Longitude,并触发反向RESTAPI的HTTP请求。能够在每次迭代中激发1000个请求。提取的信息将打印到Excel输出文件中。 这是我的代码片段-

import json

from geopy import Nominatim
from openpyxl import load_workbook
import time
from geopy.extra.rate_limiter import RateLimiter
import urllib3
import requests
import xml.etree.ElementTree as ET

filepath = "/xxx/100KV-BusLoc.xlsx"
wb = load_workbook(filepath)
sheet = wb["Envision"]
#wb["Elec_Sub"]
cell = sheet.cell(2,20)
for i1 in range(5999, 7000):
if (str(sheet.cell(row=i1, column=1).value) != "None"):
    print(i1)
    cell = sheet.cell(i1, 20)
    # print("All Sub - 345")
    latt = str(sheet.cell(row=i1, column=8).value)
    long = str(sheet.cell(row=i1, column=9).value)
    url = 'https://nominatim.openstreetmap.org/reverse?lat=' + latt + '&lon=' + long
    resp = requests.request("Get",url)
    if (resp.status_code != 404) :
        strRes = resp.text
        root = ET.fromstring(strRes)
        for child in root.findall('addressparts'):
            locDet = ""
            if child.find('road') != None:
                locDet = child.find('road').text
            if child.find('municipality') != None:
                locDet = locDet + '|' + child.find('municipality').text
            if child.find('county') != None :
                locDet = locDet + '|' + child.find('county').text
            if child.find('state') != None:
                locDet = locDet + '|' + child.find('state').text
            if child.find('postcode') != None :
                locDet = locDet + '|' + child.find('postcode').text
            if child.find('country') != None:
                locDet = locDet + '|' + child.find('country').text
            if locDet != "":
                print(locDet)
                cell.value = locDet
                wb.save(filepath)

这些服务似乎托管在捐赠的服务器上。因此,提名建议避免广泛使用。我只能认为这是失败的原因——因为之前我提取了几百个,后来开始提取1000个位置

我求助于另一种解决方案来处理这个错误。解决这个错误变得非常困难。我在另一个解决方案中使用请求。在我的脚本中,我从Excel中读取latitude和Longitude,并触发反向RESTAPI的HTTP请求。能够在每次迭代中激发1000个请求。提取的信息将打印到Excel输出文件中。 这是我的代码片段-

import json

from geopy import Nominatim
from openpyxl import load_workbook
import time
from geopy.extra.rate_limiter import RateLimiter
import urllib3
import requests
import xml.etree.ElementTree as ET

filepath = "/xxx/100KV-BusLoc.xlsx"
wb = load_workbook(filepath)
sheet = wb["Envision"]
#wb["Elec_Sub"]
cell = sheet.cell(2,20)
for i1 in range(5999, 7000):
if (str(sheet.cell(row=i1, column=1).value) != "None"):
    print(i1)
    cell = sheet.cell(i1, 20)
    # print("All Sub - 345")
    latt = str(sheet.cell(row=i1, column=8).value)
    long = str(sheet.cell(row=i1, column=9).value)
    url = 'https://nominatim.openstreetmap.org/reverse?lat=' + latt + '&lon=' + long
    resp = requests.request("Get",url)
    if (resp.status_code != 404) :
        strRes = resp.text
        root = ET.fromstring(strRes)
        for child in root.findall('addressparts'):
            locDet = ""
            if child.find('road') != None:
                locDet = child.find('road').text
            if child.find('municipality') != None:
                locDet = locDet + '|' + child.find('municipality').text
            if child.find('county') != None :
                locDet = locDet + '|' + child.find('county').text
            if child.find('state') != None:
                locDet = locDet + '|' + child.find('state').text
            if child.find('postcode') != None :
                locDet = locDet + '|' + child.find('postcode').text
            if child.find('country') != None:
                locDet = locDet + '|' + child.find('country').text
            if locDet != "":
                print(locDet)
                cell.value = locDet
                wb.save(filepath)

我的最小可再现示例不再调用错误,无论是在使用旧版本geopy 1.22的过时环境中,还是在使用最新版本geopy 2.1.0的环境中,因此我不确定更改了什么。

我的最小可再现示例不再调用错误,既不是在使用旧版本geopy 1.22的过时环境中,也不是在使用最新版本geopy 2.1.0的环境中,因此我不确定发生了什么变化。

所有代码、数据、错误消息等都必须以文本形式嵌入。图像中的文本不可复制粘贴或搜索。它也很难阅读,尤其是在移动设备上。请编辑您的答案,以避免被SO删除。此外,高质量的回答通常包括一个解释,以突出代码的关键元素&它们如何/为什么解决OP的问题。您可以在帮助部分阅读更多指南。大多数投票都是随着时间的推移,当未来的访问者从你的帖子中了解到一些可以应用于他们自己的问题时。谢谢你的建议。我们已经相应地修改了它。如果您看到任何进一步的更改,请随时通知我。所有代码、数据、错误消息等必须以文本形式嵌入。图像中的文本不可复制粘贴或搜索。它也很难阅读,尤其是在移动设备上。请编辑您的答案,以避免被SO删除。此外,高质量的回答通常包括一个解释,以突出代码的关键元素&它们如何/为什么解决OP的问题。您可以在帮助部分阅读更多指南。大多数投票都是随着时间的推移,当未来的访问者从你的帖子中了解到一些可以应用于他们自己的问题时。谢谢你的建议。我们已经相应地修改了它。如果您看到任何进一步的更改,请随时告诉我。它是否在一段时间后开始工作?那么,这是不是因为每个IP地址对Nagnatim服务器的使用有限?@VaradPimpalkhute:错误不是由Nagnatim速率限制引起的,问题是由特定地址引起的。但是我不能再复制它了,所以现在确定错误是推测性的。我明白了,我也有同样的错误,但在等待f之后得到了解决
或者5分钟。谢谢你的回复。过了一段时间它开始工作了吗?那么,这是不是因为每个IP地址对Nagnatim服务器的使用有限?@VaradPimpalkhute:错误不是由Nagnatim速率限制引起的,问题是由特定地址引起的。但是我不能再复制它了,所以现在确定错误是推测性的。我明白了,我也有同样的错误,但它在等待5分钟后得到了解决。谢谢你的回复。