特定の場所の近くの銀行を表示するマップアプリケーションを開発したいと思います。
Placesライブラリを使用して検索すると、毎回20件の結果が返されます。より多くの結果が必要な場合はどうすればよいですか?
特定の場所の近くの銀行を表示するマップアプリケーションを開発したいと思います。
Placesライブラリを使用して検索すると、毎回20件の結果が返されます。より多くの結果が必要な場合はどうすればよいですか?
更新:私が最初にこの回答を書いたので、APIが拡張され、この回答が古くなった(または少なくとも不完全になった)。GooglePlacesAPIから20以上の結果を取得する方法をご覧ください。詳細については。
元の回答:
ドキュメントによると、PlacesAPIは最大20件の結果を返します。その制限を変更する方法があることを示すものではありません。だから、簡単な答えは次のように思われます:あなたはできません。
もちろん、いくつかの場所に対してクエリを実行し、結果をマージ/重複排除することで、偽物を並べ替えることができる場合があります。ただし、これは一種の安価なハックであり、うまく機能しない可能性があります。そして、最初に利用規約に違反していないことを確認します。
20を超える(ただし最大60の)結果を得ることができるようになり、パラメーターpage_tokenがAPIに追加されました。
以前に実行された検索からの次の20件の結果を返します。page_tokenパラメーターを設定すると、以前に使用したものと同じパラメーターで検索が実行されます—page_token以外のすべてのパラメーターは無視されます。
また、追加の結果へのアクセスのセクションを参照して、ページネーションを行う方法の例を確認することもできます。
Eduardoに応えて、Googleは今それを追加しましたが、Placesのドキュメントにも次のように記載されています。
返される結果の最大数は60です。
まだキャップがあります。また、参考までに、Googleが述べているように、「next_page_token」が有効になるまでに遅延があります。
next_page_tokenが発行されてから有効になるまで、少し時間がかかります。
公式のPlacesAPIドキュメントは次のとおりです。
追加の結果を探すコードサンプルは次のとおりです
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;
}
}
}
}
これで時間を節約できれば幸いです。
あなたがもっと得ることができるかどうかわからない。
Places APIは、最大20の確立結果を返します。
http://code.google.com/apis/maps/documentation/places/#PlaceSearchResponses
検索範囲内に存在するすべての銀行が返されない可能性があるという問題がある場合は、複数の自動クエリを発行するのではなく、検索範囲を制限することをお勧めします。
半径を、20(60)を超えるバンクを取得できない値に設定します。次に、ユーザーがより多くのクエリを手動で簡単に(GUIで)実行できるようにします。クエリをペイントするようなものです。
より広い地域で数千の銀行を返品するには、銀行の独自のデータベースに依存する必要があります。これは、体系的に作業する場合に達成できる可能性があります。
Googleプレイスの結果をスクレイプし、ページ付けに従って、特定の場所(10〜15ページの検索結果)に対して200〜300の場所を取得できます。
または、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で働いています。