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)
我目前正在编写一个脚本来对地址列表进行地理编码,以便为分析和可视化做好准备。这是我第一次使用地理编码,所以我很挣扎,不确定这里是否缺少明显的东西。我正在使用 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)