【问题标题】:Google Geocoding API OVER_QUERY_LIMIT issue谷歌地理编码 API OVER_QUERY_LIMIT 问题
【发布时间】:2018-11-06 18:11:21
【问题描述】:

我正在尝试运行一个脚本来将地址(大约 1,000 个)更改为地理坐标,但由于某种原因,我在输入列表中的第 50 个地址后收到了 OVER_QUERY_LIMIT 响应。

为了避免查询限制,我已经在循环中添加了 time.sleep 命令,但由于某种原因,它说我再次超出限制。

有人可以帮忙吗? (仅供参考,我在笔记本电脑上运行它)

import pandas as pd
import requests
import logging
import time
logger = logging.getLogger("root")
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
logger.addHandler(ch)

API_KEY = my_key #using my API key
BACKOFF_TIME = 5
output_filename = 'result.csv'
input_filename = 'input.csv'
address_column_name = "Address"
RETURN_FULL_RESULTS = False

data = pd.read_csv(input_filename, encoding='utf8')
if address_column_name not in data.columns:
raise ValueError("Missing Address column in input data")
addresses = data[address_column_name].tolist()

def get_google_results(address, api_key=my_key, return_full_response=False):
geocode_url = "https://maps.googleapis.com/maps/api/geocode/json?address={}".format(address)
if api_key is not None:
    geocode_url = geocode_url + "&key={}".format(api_key)

results = requests.get(geocode_url)
results = results.json()

if len(results['results']) == 0:
    output = {
        "formatted_address" : None,
        "latitude": None,
        "longitude": None,
        "accuracy": None,
        "google_place_id": None,
        "type": None,
        "postcode": None
    }
else:
    answer = results['results'][0]
    output = {
        "formatted_address" : answer.get('formatted_address'),
        "latitude": answer.get('geometry').get('location').get('lat'),
        "longitude": answer.get('geometry').get('location').get('lng'),
        "accuracy": answer.get('geometry').get('location_type'),
        "google_place_id": answer.get("place_id"),
        "type": ",".join(answer.get('types')),
        "postcode": ",".join([x['long_name'] for x in answer.get('address_components')
                              if 'postal_code' in x.get('types')])
    }

output['input_string'] = address
output['number_of_results'] = len(results['results'])
output['status'] = results.get('status')
if return_full_response is True:
    output['response'] = results

return output

results = []
for address in addresses:
  geocoded = False
  while geocoded is not True:
      try:
        geocode_result = get_google_results(address, API_KEY, 
return_full_response=RETURN_FULL_RESULTS)
        time.sleep(5)
    except Exception as e:
        logger.exception(e)
        logger.error("Major error with {}".format(address))
        logger.error("Skipping!")
        geocoded = True
    if geocode_result['status'] == 'OVER_QUERY_LIMIT':
        logger.info("Hit Query Limit! Backing off for a bit.")
        time.sleep(BACKOFF_TIME * 60) # sleep
        geocoded = False
    else:
        if geocode_result['status'] != 'OK':
            logger.warning("Error geocoding {}: {}".format(address, geocode_result['status']))
        logger.debug("Geocoded: {}: {}".format(address, geocode_result['status']))
        results.append(geocode_result)
        geocoded = True

if len(results) % 100 == 0:
    logger.info("Completed {} of {} address".format(len(results), len(addresses)))

if len(results) % 50 == 0:
    pd.DataFrame(results).to_csv("{}_bak".format(output_filename))

logger.info("Finished geocoding all addresses")
pd.DataFrame(results).to_csv(output_filename, encoding='utf8')

【问题讨论】:

  • “运行大约 50 行后发出警告”是什么意思。你是怎么得出这个结论的。你是在逐行调试吗。如果是,那么代码的哪个确切部分引发了错误?您发送的请求总数是多少? Google 也有每日查询限制。
  • @shiva 对含糊的表达感到抱歉。一旦点击输入列表中的第 50 个地址,我就会从 API 获得 OVER_QUERY_LIMIT 响应。
  • 找到任何解决方案了吗?有几乎相同的问题
  • 嘿@SimonGIS。我使用 python 库(答案中的链接)来修改我的代码并且它有效!
  • @lacroixant 我不确定你可以在这里找到我的代码github.com/renauld94/Python/blob/master/Geocoding.py 有什么区别。所以基本上,我的请求必须从“googlemaps”库中完成。我的代码的结构方式是每 3 秒休眠一次……为什么我会超出查询限制?感谢您的帮助

标签: python google-maps google-api geocoding google-geocoder


【解决方案1】:

地理编码 API 具有每秒查询次数 (QPS) 限制。您不能发送超过 50 个 QPS。

此限制记录在

https://developers.google.com/maps/documentation/geocoding/usage-and-billing#other-usage-limits

虽然您不再受限于每天的最大请求数 (QPD),但 Geocoding API 仍然存在以下使用限制:

  • 每秒 50 个请求 (QPS),计算为客户端和服务器端查询的总和。

为了解决您的问题,我建议将 Python 客户端库用于 Google Maps API Web Services:

https://github.com/googlemaps/google-maps-services-python

此库在内部控制 QPS,因此您的请求将正确排队。

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多