我想开发一个地图应用程序,它将显示给定地点附近的银行。
我使用Places库进行搜索,每次只返回20个结果。如果我想要更多结果,我该怎么办?
答案 0 :(得分:16)
更新:由于我最初写了这个答案,API得到了增强,使得这个答案过时了(或者至少是不完整的)。有关详细信息,请参阅How to get 20+ result from Google Places API?。
原始回答:
documentation表示Places API最多可返回20个结果。它并不表示有任何方法可以更改该限制。所以,简短的回答似乎是:你做不到。
当然,您可以通过对多个位置进行查询,然后合并/重复删除结果来伪装它。然而,这是一种廉价的黑客攻击,并且可能效果不佳。我先检查一下,确保它不违反服务条款。
答案 1 :(得分:13)
现在可能有超过20个结果(但最多60个),参数page_token已添加到API中。
返回先前运行的搜索的下20个结果。设置page_token参数将使用先前使用的相同参数执行搜索 - 将忽略除page_token之外的所有参数。
另外,您可以参考accessing additional results部分查看有关如何进行分页的示例。
答案 2 :(得分:7)
Google api在一个页面中获取20个结果,假设您要使用下一页20结果,那么我们将使用google first pag xml结果中的next_page_token。
1) https://maps.googleapis.com/maps/api/place/search/xml?location=Enter latitude,Enter Longitude&radius=10000&types=store&hasNextPage=true&nextPage()=true&sensor=false&key=Enter Google_Map_key
在第二步中使用第一页的next_Page_token数据
2)https://maps.googleapis.com/maps/api/place/search/xml?location=Enter Latitude,Enter Longitude&radius=10000&types=store&hasNextPage=true&nextPage()=true&sensor=false&key=enter google_map_key &pagetoken="Enter the first page token Value"
答案 3 :(得分:3)
为了回应Eduardo,谷歌现在确实添加了这个,但Places文档还指出:
可以返回的最大结果数为60.
所以它还有一个上限。另外,也就是说,当“next_page_token”生效时,会有延迟,因为Google声明:
发出next_page_token和有效时间之间会有短暂的延迟。
以下是官方Places API文档:
答案 4 :(得分: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;
}
}
}
}
希望这可以节省你一些时间。
答案 5 :(得分:0)
不确定你能得到更多。
Places API最多可返回20个建立结果。
http://code.google.com/apis/maps/documentation/places/#PlaceSearchResponses
答案 6 :(得分:0)
如果问题是并非所有存在于搜索范围内的银行都可能不会被返回,我建议限制搜索半径而不是发出多个自动查询。
将半径设置为某个值,在该值中无法获得超过20(60)个库。然后让用户轻松(以GUI为单位)手动敲出更多查询 - 有点绘制查询。
在更大的地区返回数以千计的银行可能需要您依赖自己的银行数据库 - 如果您系统地开展工作,这可能是可以实现的。
答案 7 :(得分:0)
您可以抓取 Google 地方信息结果并按照分页获取特定位置的 200-300 个位置(搜索结果的 10 到 15 页)。
或者,您可以使用 SerpApi 访问从 Google 地方信息中提取的数据。它有一个免费试用版。
# 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 工作。