40

I want to develop a map application which will display the banks near a given place.

I use the Places library to search and everytime it just return 20 results. What should I do if I want more results?

4

7 回答 7

23

更新:由于我最初编写了这个答案,API 得到了增强,使这个答案过时(或者至少不完整)。请参阅如何从 Google Places API 获得 20 多个结果?了解更多信息。

原始答案

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

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

于 2011-08-07T00:24:44.760 回答
19

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

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

您还可以参考访问附加结果部分以查看有关如何进行分页的示例。

于 2012-06-28T09:16:07.487 回答
6

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

可以返回的最大结果数为 60。

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

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

这是官方 Places API 文档:

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

于 2012-07-27T12:43:15.793 回答
2

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

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;
            }
        }
    }
}

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

于 2017-04-04T08:07:36.637 回答
1

不确定你能得到更多。

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

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

于 2011-08-07T00:24:26.590 回答
0

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

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

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

于 2013-09-25T21:14:23.137 回答
0

您可以抓取 Google Places 结果并按照分页获取特定位置的 200-300 个位置(从 10 到 15 页的搜索结果)。

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

完整示例

# 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 工作。

于 2021-01-25T13:10:23.940 回答