【发布时间】: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