Google 的地理编码 API 正在关闭无响应连接

Google's Geocoding API Closing Connection without Response

我目前正在编写一个脚本来对地址列表进行地理编码,以便为分析和可视化做好准备。这是我第一次使用地理编码,所以我很挣扎,不确定这里是否缺少明显的东西。我正在使用 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 键、地址和 city/state 参数来给出移动的完整地址。然后,它只是进行调用,returns 是我在响应中寻找的三个元素的列表。

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]

当我运行它时,脚本会运行一段时间,然后失败。当它发生时,追溯会给我包含在下面的例外情况。到目前为止,我无法找到有关此问题可能是什么或我应该如何诊断 Google 的地理编码 API 问题的信息。它们提供了有关如何解释请求状态的信息,但是当我检查失败前返回的状态时,它们都是 'OK' 并且 none 提供了为什么连接正在关闭。

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 左右并且让我低于该限制。

有谁知道我的问题是什么?或者有人会解释我应该做什么额外的诊断吗?同样,我是地理编码的新手,之前没有遇到过这个问题 APIs 我有经验,所以即使帮助理解发生了什么,以便我自己解决它,如果没有,我将不胜感激可以找到问题。

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

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)