首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反向gecoding - geopy.Nominatim模块抛出urlopen错误[SSL:未知协议]

反向gecoding - geopy.Nominatim模块抛出urlopen错误[SSL:未知协议]
EN

Stack Overflow用户
提问于 2021-04-07 11:06:22
回答 1查看 71关注 0票数 0

我正在尝试使用geopy.Nominatim模块从纬度和经度获取地址详细信息。我收到"<'urlopen error SSL: UNKNOWN_PROTOCOL未知协议(_ssl.c:727)>“错误。

代码语言:javascript
复制
Version Details :
Python version : 2.7
geopy version : 1.23.0
geographiclib : 1.50  (Dependency with geopy)
requests : 2.25.1
chardet : 3.0.4 (Dependency with requests)
urllib3 : 1.25.10 (Dependency with requests)
idna : 2.10 (Dependency with requests)
certifi : 2020.6.20 (Dependency with requests)
代码语言:javascript
复制
Code:
=====
from geopy.geocoders.osm import Nominatim
from geopy.exc import GeocoderServiceError
 

def reverse(lat,long):

    app = Nominatim(user_agent='reverse-geocoding')
    coordinates = "{},{}".format(lat,long) # not giving the actual co-ordinates
    try:
        address_details = app.reverse(coordinates,language="en").raw
        return address_details
    except GeocoderServiceError as e1:
        print (str(e1))

result = reverse(lat,long)
print(result)

=我使用了下面的解决方法,在相同的script.Am上得到了"<'urlopen error SSL: UNKNOWN_PROTOCOL未知协议(_ssl.c:727)>“错误

解决方法1:使用请求库使用的CA包:

代码语言:javascript
复制
from geopy.geocoders.osm import Nominatim
from geopy.geocoders import options
from geopy.exc import GeocoderServiceError
import ssl
import certifi

def reverse(lat,long):
    ctx = ssl.create_default_context(cafile=certifi.where())
    options.default_ssl_context = ctx
    app = Nominatim(user_agent='reverse-geocoding')
    coordinates = "{},{}".format(lat,long) # not giving the actual co-ordinates
    try:
        address_details = app.reverse(coordinates,language="en").raw
        return address_details
    except GeocoderServiceError as e1:
        print (str(e1))

result = reverse(lat,long)
print(result)

解决方法2:完全禁用TLS证书验证:

代码语言:javascript
复制
from geopy.geocoders.osm import Nominatim
from geopy.geocoders import options
from geopy.exc import GeocoderServiceError
import ssl


def reverse(lat,long):
    ctx = ssl.create_default_context()
    ctx.check_hostname = False
    ctx.verify_mode = ssl.CERT_NONE
    options.default_ssl_context = ctx
    app = Nominatim(user_agent='reverse-geocoding')
    coordinates = "{},{}".format(lat,long) # not giving the actual co-ordinates
    try:
        address_details = app.reverse(coordinates,language="en").raw
        return address_details
    except GeocoderServiceError as e1:
        print (str(e1))

result = reverse(lat,long)
print(result)

有人能帮我找到解决这个问题的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-03 16:03:57

由于您的请求是通过代理发送的,因此出现错误UNKNOWN PROTOCOL的可能性很大。

我研究了你在Workaround 2中提到的代码。请在您的代码中明确提到代理。尝试使用以下代码行:

代码语言:javascript
复制
ctx = ssl.create_default.context()
ctx.check_hostname = True
ctx.verify_mode = ssl.CERT_REQUIRED
options.default_ssl_context = ctx
proxies = {'https':'https://your-proxy-server.com:port'}
app = Nominatim(user_agent="your-agent", proxies=proxies, timeout=10)

这也将帮助您不会完全忽略SSL验证。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66979039

复制
相关文章

相似问题

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