0

次のように GoogleV3 geolocator を呼び出そうとしています:

geolocator = GoogleV3(proxies={"http": "http://user:password@ip:port"})
address, (latitude, longitude) = geolocator.geocode('address to geocode')

そしてそれは発生します:

AttributeError: OpenerDirector instance has no __call__ method

私は何を間違っていますか?修正方法は?

4

1 に答える 1

0

GoogleV3 の現在の実装では、ユーザー変数とパスワード変数を直接 urllib2.opener に渡すことはできません (GoogleV3 は裏で urllib2 を使用します)。

urllib2.opener を呼び出す方法の例を次に示します。

proxy_handler = urllib2.ProxyHandler({'http': 'http://www.example.com:3128/'})
proxy_auth_handler = urllib2.ProxyBasicAuthHandler()
proxy_auth_handler.add_password('realm', 'host', 'username', 'password')

opener = urllib2.build_opener(proxy_handler, proxy_auth_handler)
# This time, rather than install the OpenerDirector, we use it directly:
opener.open('http://www.example.com/login.html')

残念ながら、現在の GoogleV3 実装では urllib2.ProxyBasicAuthHandler を使用していません。

したがって、ソースを変更して拡張する必要があります: https://github.com/geopy/geopy/blob/master/geopy/geocoders/base.py 上部に以下を追加します:

urlparse から urlparse をインポート

次に、「if self.proxies is None:」コードを見つけて、次のように置き換えます。

    if self.proxies is None:
        self.urlopen = urllib_urlopen
    else:
        params = urlparse(proxies[1])
        host = params.get('hostname')
        username = params.get('username')
        password = params.get('password')
        if host and username and password:
            proxy_auth_handler = urllib2.ProxyBasicAuthHandler()
            proxy_auth_handler.add_password(None, host, username, password)
            self.urlopen = build_opener(
               ProxyHandler(self.proxies, proxy_auth_handler),
            )
于 2013-10-30T13:26:12.343 に答える