【问题标题】:Google's Geocoding API Closing Connection without Response谷歌的地理编码 API 关闭连接没有响应
【发布时间】:2020-05-25 20:01:46
【问题描述】:

我目前正在编写一个脚本来对地址列表进行地理编码,以便为分析和可视化做好准备。这是我第一次使用地理编码,所以我很挣扎,不确定我是否在这里遗漏了一些明显的东西。我正在使用 Google 的地理编码 API。

我的(未优化的)过程的大致轮廓是将包含地址的 DataFrame 中的列转换为列表。然后,我使用列表推导从该列表创建一个新列表,其中每个元素都是我返回的数据的子集。

key = ...
city = "Long Beach"
state = "CA"

addresses = df["Address"].values.tolist()
geocodes = [geocode(x,city,state,key) for x in addresses]

我用于地理编码的实际功能如下。它接受我的 API 密钥、地址和城市/州参数来提供完整的移动地址。然后,它只是进行调用并返回我在响应中寻找的三个元素的列表。

def geocode(address, city, state, key):
    time.sleep(.05)
    params = f"{address.lower()} {city}, {state}".replace(" ","+")
    request_url = "https://maps.googleapis.com/maps/api/geocode/json?address="+params+f"&key={key}"
    response = requests.get(request_url).json()
    neighborhood = response["results"][0]["address_components"][2]["long_name"]
    lat = response["results"][0]["geometry"]["location"]["lat"]
    lon = response["results"][0]["geometry"]["location"]["lng"]
    return [neighborhood, lat, lon]

当我运行它时,脚本会运行一段时间,然后失败。当它发生时,回溯给了我我在下面包含的异常。到目前为止,我还没有找到关于这个问题可能是什么或者我应该如何诊断谷歌地理编码 API 问题的信息。他们提供了有关如何解释请求状态的信息,但是当我检查失败前返回的状态时,它们都是'OK',并且它们都没有提供连接关闭原因的指示。

RemoteDisconnected: Remote end closed connection without response

During handling of the above exception, another exception occurred:

ProtocolError                             Traceback (most recent call last)
----------
ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

During handling of the above exception, another exception occurred:

ConnectionError                           Traceback (most recent call last)
----------
ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

现在,我已经玩弄了它并排除了几件事: 1. 我已经通过单次调用成功地尝试了这一点,并得到了我需要的东西。当我在列表上运行它时会出现问题。 2.我使用了TQDM并打印了状态(在不同的点),脚本确实成功地进行了调用,取回了数据,并在失败之​​前多次移动到下一个。 3. 我不认为这是一个速率限制问题。此 API 没有每日限制,只有每秒查询次数限制为 50。我函数中的粗略 time.sleep(.05) 应该将其保持在 20 QPS 左右,并让我低于该限制。

有人知道我的问题可能是什么吗?或者有人会解释我应该做哪些额外的诊断?再说一次,我是地理编码的新手,之前使用过的 API 没有遇到过这个问题,所以如果没有人能找到问题,即使帮助我理解正在发生的事情以便我自己解决问题,我也将不胜感激.

【问题讨论】:

    标签: python python-requests geocoding


    【解决方案1】:

    尝试使用官方的 googlemaps py 模块。它在引擎盖下也使用requests.Session,但我从来没有遇到过麻烦。您可能需要一些multithreading,但如果您没有“太多”地址,这应该可以解决问题:

    import time
    import logging
    import googlemaps
    
    
    key = '...'
    gmaps_client = googlemaps.Client(key=key)
    
    addresses = [
        ["8473 Manor Station Street", "Cartersville", "GA"],
        ["14 Edgewater Ave.", "Ottumwa", "IA"],
        ["42 Aspen Court", "San Diego", "CA"]
    ]
    
    
    def geocode(address, city, state):
        time.sleep(.05)
        params = f"{address.lower()} {city}, {state}".replace(" ", "+")
    
        try:
            response = gmaps_client.geocode(params)[0]
    
            neighborhood = response["address_components"][2]["long_name"]
            lat = response["geometry"]["location"]["lat"]
            lon = response["geometry"]["location"]["lng"]
    
            return [neighborhood, lat, lon]
        except Exception as e:
            logging.error(e)
            return [None, None, None]
    
    
    geocodes = [geocode(*group) for group in addresses]
    
    print(geocodes)
    
    

    【讨论】:

    • 嗯,稍后会检查,但请从评论中删除 api 密钥 - 它应该是私有的?
    • 谢谢。它再次失败,但我现在实际上看到了一个错误。我首先得到这个: ERROR:root:('Connection aborted.', OSError("(10060, 'WSAETIMEDOUT')")) 然后重复这个: ERROR:root:HTTPSConnectionPool(host='maps.googleapis.com' , 端口 = 443): 使用 url 超过最大重试次数: /maps/api/geocode/json?address=936%2Bcedar%2Bave%2BLong%2BBeach%2C%2BCA&key=... (由 NewConnectionError(':无法建立新连接:[Errno 11001] getaddrinfo failed')
    • 天哪,非常感谢您指出这一点。我不敢相信我做到了。
    • 没有问题。这是一个有点不同的错误...尝试谷歌搜索OSError("(10060, 'WSAETIMEDOUT')"))——不知道如何解决这个问题。
    • 让它工作。在我输入的速率限制之上添加一些额外的等待能够做到这一点。谢谢。
    猜你喜欢
    • 2023-03-19
    • 2013-07-29
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多