使用 Google Places API 获得 20 多个结果

Posted

技术标签:

【中文标题】使用 Google Places API 获得 20 多个结果【英文标题】:Obtaining more than 20 results with Google Places API 【发布时间】:2011-10-21 09:43:48 【问题描述】:

我想开发一个地图应用程序,它会显示给定地点附近的银行。

我使用 Places 库进行搜索,每次它只返回 20 个结果。如果我想要更多结果该怎么办?

【问题讨论】:

【参考方案1】:

更新:由于我最初编写了此答案,因此 API 得到了增强,使此答案过时(或至少不完整)。请参阅How to get 20+ result from Google Places API? 了解更多信息。

原始答案

documentation 表示 Places API 最多返回 20 个结果。它并不表示有任何方法可以更改该限制。所以,简短的回答似乎是:你不能。

当然,您可以通过对多个位置进行查询,然后对结果进行合并/重复数据删除来伪装它。不过,这是一种廉价的黑客攻击,可能效果不佳。我会先检查以确保它不违反服务条款。

【讨论】:

感谢您的回答。我也想到了那个 hack :) 我再次检查文档,但找不到更改该限制的参数。我只是想知道是否有更好的来源来获得结果? @Trott,您好 Trott,我也面临同样的问题。如何获取更多数据?如果您看过 Google 的 Places 应用程序,它将在 Listview 滚动结束时获取数据。那么它是否再次触发查询?如果您有任何建议,请帮助... @Scorpion,您可以尝试类似,而 radius 【参考方案2】:

现在可能有超过 20 个结果(但最多 60 个),API 中添加了一个参数 page_token。

从先前运行的搜索中返回接下来的 20 个结果。设置 page_token 参数将使用之前使用的相同参数执行搜索——除了 page_token 之外的所有参数都将被忽略。

您也可以参考accessing additional results 部分以查看有关如何进行分页的示例。

【讨论】:

值得补充的是,根据***.com/a/9627664/1565279,使用此方法的最大结果数为60。 @HischT,是的,我知道这个限制,对我来说很遗憾,但是当我发布答案时我忘记写了。已编辑,谢谢! :)【参考方案3】:

作为对 Eduardo 的回应,Google 现在确实添加了这一点,但 Places 文档还指出:

最多可以返回60个结果。

所以它仍然有一个上限。同样仅供参考,正如 Google 所说,“next_page_token”何时生效会有延迟:

从发出 next_page_token 到它生效之间有短暂的延迟。

这是官方 Places API 文档:

https://developers.google.com/places/documentation/

【讨论】:

【参考方案4】:

这里是寻找其他结果的代码示例

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Web.Script.Serialization;


namespace ConsoleApplication1

    class Program
    
        static void Main(string[] args)
        
            var url = $"https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=args[0]&radius=args[1]&type=restaurant&keyword=args[2]&key=args[3]";

            dynamic res = null;
            var places = new List<PlacesAPIRestaurants>();
            using (var client = new HttpClient())
            
                while (res == null || HasProperty(res, "next_page_token"))
                
                    if (res != null && HasProperty(res, "next_page_token"))
                    
                        if (url.Contains("pagetoken"))
                            url = url.Split(new string[]  "&pagetoken=" , StringSplitOptions.None)[0];
                        url += "&pagetoken=" + res["next_page_token"];

                    
                    var response = client.GetStringAsync(url).Result;
                    javascriptSerializer json = new JavaScriptSerializer();
                    res = json.Deserialize<dynamic>(response);
                    if (res["status"] == "OK")
                    
                        foreach (var place in res["results"])
                        
                            var name = place["name"];
                            var rating = HasProperty(place,"rating") ? place["rating"] : null;
                            var address = place["vicinity"];
                            places.Add(new PlacesAPIRestaurants
                            
                                Address = address,
                                Name = name,
                                Rating = rating
                            );
                        
                    
                    else if (res["status"] == "OVER_QUERY_LIMIT")
                    
                        return;
                    
                
            
        

        public static bool HasProperty(dynamic obj, string name)
        
            try
            
                var value = obj[name];
                return true;
            
            catch (KeyNotFoundException)
            
                return false;
            
        
    

希望这可以为您节省一些时间。

【讨论】:

【参考方案5】:

不确定你能得到更多。

Places API 最多返回 20 个建立结果。

http://code.google.com/apis/maps/documentation/places/#PlaceSearchResponses

【讨论】:

@andi 现在你可以了。但是当我两年多前做出回应时,你不能。如果你投票给我...非常不酷。但我明白;-)【参考方案6】:

如果问题是并非所有存在于搜索范围内的银行都可能不会被返回,我建议限制搜索范围而不是发出多个自动查询。

将半径设置为不可能获得超过 20 (60) 个银行的某个值。然后让用户轻松(以 GUI 方式)手动敲定更多查询 - 有点像绘制查询。

返回更大区域内的数千家银行可能需要您依赖自己的银行数据库 - 如果您系统地处理它,这是可以实现的。

【讨论】:

【参考方案7】:

您可以抓取 Google 地方信息结果并按照分页获取特定位置的 200-300 个地方(搜索结果的 10 到 15 页不等)。

或者,您可以使用 SerpApi 访问从 Google 地方信息中提取的数据。它有免费试用版。

Full example

# Package: https://pypi.org/project/google-search-results

from serpapi import GoogleSearch
import os

params = 
    "api_key": os.getenv("API_KEY"),
    "engine": "google",
    "q": "restaurants",
    "location": "United States",
    "tbm": "lcl",
    "start": 0


search = GoogleSearch(params)
data = search.get_dict()

for local_result in data['local_results']:
    print(
        f"Position: local_result['position']\nTitle: local_result['title']\n"
    )

while ('next' in data['serpapi_pagination']):
    search.params_dict["start"] += len(data['local_results'])
    data = search.get_dict()

    print(f"Current page: data['serpapi_pagination']['current']\n")

    for local_result in data['local_results']:
        print(
            f"Position: local_result['position']\nTitle: local_result['title']\n"
        )

输出

Current page: 11

Position: 1
Title: Carbone

Position: 2
Title: Elmer's Restaurant (Palm Springs, CA)

Position: 3
Title: The Table Vegetarian Restaurant

...

免责声明:我在 SerpApi 工作。

【讨论】:

以上是关于使用 Google Places API 获得 20 多个结果的主要内容,如果未能解决你的问题,请参考以下文章

Google Places API配额超过[重复]

无法获得有关Google Places API的其他详细信息,例如'opening_hours'

Google Places Api,放置自动完成入站查询

如何从 Google Places API 获取地点描述

Google Maps Places API - 如何获取地名? [复制]

google.maps.places.Autocomplete 语言输出