gethon在python中的服务错误

时间:2017-02-24 17:57:39

标签: proxy python-3.5 google-geocoder geopy

我遇到服务错误,因为我试图从geopy运行地理编码器以获取python中的位置坐标。我已经设置了我的代理配置,给它一个api_key。 我不知道为什么我会收到这个错误。从我对此所做的搜索来看,似乎这可能是一个代理问题,但我已经建立了这个问题。 这可能是什么问题?

这是我的代码:

from geopy import geocoders

proxies={'http': 'http://location:port', 'https': 'http://localhost:port'}
api_key = '.......'

g = geocoders.GoogleV3(api_key=api_key,proxies=proxies, timeout=10)

location = 'Mountain View, CA'
try:
    place, (lat, lng) = g.geocode(location)
except ValueError as error_message:
    print("Error: geocode failed on input %s with message %s" % (location, error_message))

这是我的错误输出:

Traceback (most recent call last):
  File "/Users/aqm1152/anaconda/lib/python3.5/urllib/request.py", line 1254, in do_open
    h.request(req.get_method(), req.selector, req.data, headers)
  File "/Users/aqm1152/anaconda/lib/python3.5/http/client.py", line 1106, in request
    self._send_request(method, url, body, headers)
  File "/Users/aqm1152/anaconda/lib/python3.5/http/client.py", line 1151, in _send_request
    self.endheaders(body)
  File "/Users/aqm1152/anaconda/lib/python3.5/http/client.py", line 1102, in endheaders
    self._send_output(message_body)
  File "/Users/aqm1152/anaconda/lib/python3.5/http/client.py", line 934, in _send_output
    self.send(msg)
  File "/Users/aqm1152/anaconda/lib/python3.5/http/client.py", line 877, in send
    self.connect()
  File "/Users/aqm1152/anaconda/lib/python3.5/http/client.py", line 1260, in connect
    server_hostname=server_hostname)
  File "/Users/aqm1152/anaconda/lib/python3.5/ssl.py", line 377, in wrap_socket
    _context=self)
  File "/Users/aqm1152/anaconda/lib/python3.5/ssl.py", line 752, in __init__
    self.do_handshake()
  File "/Users/aqm1152/anaconda/lib/python3.5/ssl.py", line 988, in do_handshake
    self._sslobj.do_handshake()
  File "/Users/aqm1152/anaconda/lib/python3.5/ssl.py", line 633, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:645)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/aqm1152/anaconda/lib/python3.5/site-packages/geopy/geocoders/base.py", line 143, in _call_geocoder
    page = requester(req, timeout=(timeout or self.timeout), **kwargs)
  File "/Users/aqm1152/anaconda/lib/python3.5/urllib/request.py", line 163, in urlopen
    return opener.open(url, data, timeout)
  File "/Users/aqm1152/anaconda/lib/python3.5/urllib/request.py", line 466, in open
    response = self._open(req, data)
  File "/Users/aqm1152/anaconda/lib/python3.5/urllib/request.py", line 484, in _open
    '_open', req)
  File "/Users/aqm1152/anaconda/lib/python3.5/urllib/request.py", line 444, in _call_chain
    result = func(*args)
  File "/Users/aqm1152/anaconda/lib/python3.5/urllib/request.py", line 1297, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "/Users/aqm1152/anaconda/lib/python3.5/urllib/request.py", line 1256, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error EOF occurred in violation of protocol (_ssl.c:645)>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/aqm1152/Documents/TestingCode/ACERT/test_1.py", line 12, in <module>
    place, (lat, lng) = g.geocode(location)
  File "/Users/aqm1152/anaconda/lib/python3.5/site-packages/geopy/geocoders/googlev3.py", line 217, in geocode
    self._call_geocoder(url, timeout=timeout), exactly_one
  File "/Users/aqm1152/anaconda/lib/python3.5/site-packages/geopy/geocoders/base.py", line 171, in _call_geocoder
    raise GeocoderServiceError(message)
geopy.exc.GeocoderServiceError: EOF occurred in violation of protocol (_ssl.c:645)

1 个答案:

答案 0 :(得分:0)

我修改了您的代码,因为我没有使用代理并应用API,而且它可以在我的机器上运行。

from geopy import geocoders

#proxies={'http': 'http://location:port', 'https': 'http://localhost:port'}
#api_key = '.......'

g = geocoders.GoogleV3()

location = 'Mountain View, CA'
try:
    place, (lat, lng) = g.geocode(location)
except ValueError as error_message:
    print("Error: geocode failed on input %s with message %s" % (location, error_message))

print (place, lat, lng)

结果如下。

Mountain View, CA, USA 37.3860517 -122.0838511

从引用中,它看起来所有错误都与SSL有关。您可以尝试在开头添加以下代码,以禁用SSL认证验证作为替代方案。

import ssl 

# Disable SSL certificate verification
try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

我在运行Python 3.6的env中运行Python 2.7的Anaconda遇到了类似的问题。在Anaconda中遇到的问题是rootroot在另一台机器上运行Python 2.7。

此外,使用env模块为geopy设置代理服务器的this SO post可能是很好的参考。

希望得到这个帮助。