首页 > 解决方案 > Python,谷歌地方API

问题描述

我正在尝试使用对 Google Places API 的 python 请求在给定半径内的某个位置获取所有类型的餐厅。这是我的简单代码:

import requests
import json

APIKEY = "AIzaSyBFx8hqftDOlrSWRTiOSowjwfeS1OQtBpw"

def findPlaces(loc=("51.1079","17.0385"),radius=3000, pagetoken = None):
   lat, lng = loc
   type = "restaurant"
   url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location={lat},{lng}&radius={radius}&type={type}&key={APIKEY}{pagetoken}".format(lat = lat, lng = lng, radius = radius, type = type,APIKEY = APIKEY, pagetoken = "&pagetoken="+pagetoken if pagetoken else "")
   print(url)
   response = requests.get(url)
   res = json.loads(response.text)
   print(res)
   for result in res["results"]:
      info = ";".join(map(str,[result["name"],result["geometry"]["location"]["lat"],result["geometry"]["location"]["lng"],result.get("rating",0),result["place_id"]]))
      print(info)
   pagetoken = res.get("next_page_token",None)
   return pagetoken


pagetoken = None
while True:
     pagetoken = findPlaces(pagetoken=pagetoken)
     if not pagetoken:
         break

然而,即使认为它在结果的第一页上运行良好,它在没有明显原因的情况下无法进入第二页(它只是从 API 返回 INVALID REQUEST)。此外,有趣的是,由于我将我的 url 打印到控制台,我只需单击它就可以跟踪这个非常具体的 url,当我这样做时,它运行良好,API 返回所需的餐馆列表。

我认为这是 url 编码字符串的问题,我用 python 的 urlencode 替换了格式,但是 - 结果保持不变。由于我没有想法,我在问:有人与这样的问题有关吗?

提前感谢您的帮助。

标签: pythonrequestgoogle-places-api

解决方案


我用新的纬度和经度对其进行了测试,每 20 页得到 3 页,正如谷歌文档所说,总计 60 页。

https://developers.google.com/places/web-service/search

next_page_token 包含一个可用于返回最多 20 个附加结果的令牌。如果没有要显示的其他结果,则不会返回 next_page_token。可以返回的最大结果数为 60。在发出 next_page_token 和它变为有效之间有短暂的延迟。

import requests
import json

APIKEY = "AIzaSyBFx8hqftDOlrSWRTiOSowjwfeS1OQtBpw"

def findPlaces(loc=("35.701474","51.405288"),radius=4000, pagetoken = None):
   lat, lng = loc
   type = "restaurant"
   url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location={lat},{lng}&radius={radius}&type={type}&key={APIKEY}{pagetoken}".format(lat = lat, lng = lng, radius = radius, type = type,APIKEY = APIKEY, pagetoken = "&pagetoken="+pagetoken if pagetoken else "")
   print(url)
   response = requests.get(url)
   res = json.loads(response.text)
   # print(res)
   print("here results ---->>> ", len(res["results"]))

   for result in res["results"]:
      info = ";".join(map(str,[result["name"],result["geometry"]["location"]["lat"],result["geometry"]["location"]["lng"],result.get("rating",0),result["place_id"]]))
      print(info)
   pagetoken = res.get("next_page_token",None)

   print("here -->> ", pagetoken)

   return pagetoken

# pagetoken = "CpQFhwIAADQWOcVI1wll-B869Z24El48rXw18gKoab_keD65V18zFEvPjKIfrS79Pc_vXJcZQtOuF0RObQG20ph-GE3ssP3k1fu8zsYbw5g3UPbSjAvQLdXkdD1qAWztXj7hc5Kxc4pYRyGM1_ljVOHg3Py_zSlYscnoNjCvRua2MDQgusCsEquNqGREFdvhjDkbeMhEFYxHucTnIn96OxIJEpamePTHsBooYyPBaa_ejGZ_C99QeDjpSkSKBgEe3aL1uWKlYhsGKh7biQUR5rKsKPodwccLIrW8Gr5tag3NH0sLPExHHvqzlpkj--KIuydTVjPH7u2zHxmPByServ2S5xjXYUBRr-ly3e1xPsVMhZZH9TxfttCIHLscBvpvCswIfaGYdl3bEzsrFISfpp0rpKtlp9gWGY7Tbk2n6s3etCHQEHn2qmM8bsJwkZV81pUWN0j9C9RX-ywOyIKY2yp1w_Iq1mRwOwY4mckbicOoooHiV6JER4xe7Kizw9hbXOnezn_NMk15TLwRoXlfL1s73uwogo-VWE8c-V1HqRpWQSyudRhLwhOEclrICXIdxICOgTgYO1z57xCEerw3QUL_7MPDrlbbh_AlX8I6Jfe8IhQ1Fkqu_njatm6aBTjkp2CSqlvZJpI_Lrv330VcyFEqBkGn7NJew3I9xofSrBaXFa8ABi6DXQm6-yC32OEyf7GHNXINjT1IB0yh6KR6c0qzaqiqOzKcuuai9XqEMQNNKyi6EuhzH5TP9YA56N3JhnXRFhs2aWHZhLlieVI6_uqzpZSgYjUem8aQrMTlmHw0kIYU8I-Ca041C4Zm2gMezwygRrhzsOoAmbmu96nft0KuIWTB3A_xGVKYQ2qjb2KRM7nsglnSEhDoNs8EhvuIm0FQs30YSCp5GhRO3b3Tn5rsLuwiWgu8hwEGhL0S1A"
pagetoken = None

while True:
     pagetoken = findPlaces(pagetoken=pagetoken)
     import time
     time.sleep(5)

     if not pagetoken:
         break

推荐阅读