コンテンツにスキップ

Google Places API の 120 プレイス制限を克服する: 専門家ガイド

Google マップからデータを抽出する 5 年以上の経験を持つ Web スクレイピングの第一人者として、私は制限を克服することについて 100,000 つまたは XNUMX つ学びました。 Google Places API から XNUMX を超える場所を取得したいと考えていますか?さて、あなたは正しい場所に来ました!

この 2,000 語を超える包括的なガイドでは、Google プレイスのデータを必要なだけ抽出するための実証済みの方法をいくつか紹介します。

これらの高度なテクニックは、カスタム スクリプト、非公式データ ソース、プロキシなどを活用して、基本的な API をはるかに超えています。

また、これらの戦略を独自のプロジェクトに統合できるように、実際の例とサンプル コードについても説明します。

最終的には、Google の制限を回避し、ニーズに合わせてプレイス データを最大限に活用できるようになります。

飛び込んでみましょう!

120枠しか取れない苦しみ

ご存知かと思いますが、Google Places API では、クエリごとに 120 か所のみに制限されています。ほとんどのプロジェクトでは、120 か所では不十分です。

考えてみてください…

  • スターバックスの店舗は米国だけでも 8,000 店舗以上あります。 120 回の呼び出しにつき XNUMX ですべてを取得できれば幸いです。

  • ロサンゼルス市には 15,000 を超えるレストランがあります。クエリあたり 120 の場合、すべてを取得するには 125 の API リクエストを行う必要があります。

  • アメリカのすべてのショッピング モール (1,000 を超える) のディレクトリを作成しようとすると、すぐに制限に達してしまいます。

また、リクエストあたり 120 件が少ないと思われる場合は、Google が 20 年に制限を引き上げるまでは、それが 2019 件しかなかったということを知っておいてください。したがって、Google は基本的に、さらに多くの結果が必要になることが多いと認識しています。

なぜ Google は場所をこれほど厳しく制限するのでしょうか?

Google は、サーバーに過負荷がかかる可能性のある大きすぎるリクエストを回避したいと考えています。そのため、一般的なユースケースに適したサイズで場所の数に上限を設けました。

しかし、私たちのようなパワーユーザーにとっては、120 か所では十分ではありません。

ありがたいことに、適切なツールと技術があれば、必要に応じて Google から何百万もの場所にアクセスできます。

その方法を見てみましょう。

方法 1: ページ分割されたリクエストで複数のクエリを使用する

120 桁の制限を超える方法として公式にサポートされているのは、ページ分割されたリクエストを使用することです。仕組みは次のとおりです…

まず、 pagetoken パラメータを null 最初の 60 つの結果を取得するには:

https://maps.googleapis.com/maps/api/place/textsearch/json?query=restaurants+in+LA&pagetoken=null

応答には次の内容が含まれます next_page_token フィールドのような "CpQCBAAA..."。これを pagetoken 次のリクエストで:

https://maps.googleapis.com/maps/api/place/textsearch/json?query=restaurants+in+LA&pagetoken=CpQCBAAA...

これは次の 60 を返します。最新のものを渡し続けます。 next_page_token すべての結果を徐々にページ送りしていきます。

理想的には、これを複数の API キーと組み合わせて、ページ分割されたクエリを同時に実行します。私が構築したこのアダプターは、ページネーションを高速化するために 3 つのキーを同時にクエリします。

// Paginate requests concurrently with multiple API keys

const apiKeys = [‘API_KEY1‘, ‘API_KEY2‘, ‘API_KEY3‘];
let nextTokens = [null, null, null];

function paginateResults(query) {

  let promise1 = placesApi.textSearch({query, pagetoken: nextTokens[0]});
  let promise2 = placesApi.textSearch({query, pagetoken: nextTokens[1]}); 
  let promise3 = placesApi.textSearch({query, pagetoken: nextTokens[2]});

  Promise.all([promise1, promise2, promise3])
    .then(responses => {
      // Extract places from responses

      // Save nextTokens
      nextTokens[0] = responses[0].next_page_token; 
      nextTokens[1] = responses[1].next_page_token;
      nextTokens[2] = responses[2].next_page_token;

      paginateResults(query); // Call again to keep paginating      
    });

}

これにより、複数の API キーに同時にリクエストを展開することで、結果のページングが 3 倍速くなりました。

この戦略では、呼び出しごとに最大 360 の場所 (120 * 3 キー) を取得できます。さらに取得するには、後続のリクエストでページングを続けるだけです。

Proのヒント: 結果の各ページをローカルにキャッシュして、エラーが発生した場合に API 呼び出しを繰り返さないようにします。

ページネーションの制限

欠点は、すべてのページネーション ロジックを自分で処理する必要があることです。また、同時リクエストを使用すると高速化できますが、通常は単一の一括クエリよりも遅くなります。

ページネーションは、制限を超えて数千桁の追加のみが必要な場合に最適に機能します。しかし、何万、何十万もの場所にアクセスすると、他のアプローチの方が効率的になります...

方法 2: 検索エリアをより小さなグリッドに分割する

大量の場合は、検索領域を「グリッド」に分割すると最良の結果が得られることがわかりました。

手順は次のとおりです。

  1. ターゲットの場所を複数の小さな検索エリアに分割します。

  2. 各エリアを個別にクエリして、セクションごとに 120 か所すべてを取得します。

  3. 各領域の結果を完全なデータセットに結合します。

サンプルワークフローを見てみましょう…

マンハッタンのすべてのレストランを取得する必要があると想像してください。これは 15,000 か所を超え、120 の制限をはるかに超えています。

それらをすべて抽出する方法は次のとおりです。

  1. マンハッタンをグリッドに分割します。 さまざまな地域または郵便番号に分割します。例えば:

    10021
    10022
    10023
    10075

    マンハッタンのすべての郵便番号についても同様です...

  2. 各グリッドをクエリする。郵便番号ごとに、次のようなテキスト検索を実行します。

    https://maps.googleapis.com/maps/api/place/textsearch/json?query=restaurants+in+10021

    これにより、その ZIP 内の最初の 120 軒のレストランが返されます。

  3. すべての結果を結合する。すべての郵便番号で検索を実行し、すべての場所を 15,000 以上のレストランの XNUMX つの大きなリストに結合します。

それがどのように機能するかわかりますか?エリアを小さなセグメントに分割すると、セクションごとに 120 個の場所を取得できます。これは、任意の合計場所数までスケールアップします。

繰り返しますが、これらのグリッド検索を並行して実行すると、速度が向上します。私はスクリプト作成に Node.js を使用するのが好きです。

最適なグリッドの作成

マップをグリッドに分割するには、いくつかの方法があります。

  • 近隣または地区ごと
  • 郵便番号の使用
  • 特定の緯度/経度の境界あり
  • 緯度/経度 0.1 度の等間隔

グリッドを十分小さくして、クエリごとの結果を最大化します。ただし、同じ場所を繰り返し叩くほど小さいわけではありません。

最適なトレードオフは、マップの総面積と場所の密度によって異なります。しかし、ほとんどの都市では、0.5 ~ 1 平方マイルのグリッドが適切に機能します。

さまざまな粒度を試して、最もユニークな場所を返すものを確認してください。

グリッド検索の主な欠点は、領域を分割して結果を結合するためにコーディングが複雑になることです。ページ分割されたリクエストは実装が簡単です。

しかし、パフォーマンスの向上により、グリッドにはそれだけの価値があります。私はこの方法を使用して、Google から最大 300,000 の場所を抽出することに成功しました。これは 120 の制限をはるかに超えています。

次に、さらに強力な (ただし扱いにくい) オプションを見てみましょう。

方法 3: Google マップの検索結果をスクレイピング

Google マップの検索では、API で許可されているよりも多くの結果が返されます。ウェブサイトをスクレイピングすることで、これを直接活用できます。

基本的な手順は次のとおりです。

  1. Google マップで「シカゴのピザ」などの場所のカテゴリを検索します。

  2. Web スクレイパーを使用して、レンダリングされた結果からデータを抽出します。

  3. マップ ビューとズーム レベルを繰り返して、さらに多くの場所をトリガーします。

  4. スクレイピングしたすべてのデータをデータセットに結合します。

これにより、Google の場所の完全なインデックスにアクセスできるようになります。問題は、サイトが複雑な JavaScript レンダリングとページネーションを使用していることです。

サンプル スクレイパー アーキテクチャを見てみましょう…

まず、検索位置をジオコーディングして、最適な地図の中心点を取得します。

// Geocode city to get centerpoint lat/lng

let response = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?address=Chicago+IL`);
let geo = await response.json();

let centerpoint = geo.results[0].geometry.location; 

次に、ブラウザを開いて Google マップの URL に移動します。

// Search Google Maps for place category

let url = `https://www.google.com/maps/search/pizza+in+Chicago/@${centerpoint.lat},${centerpoint.lng}`;

await page.goto(url); 

次に、レンダリングされた結果から場所を抽出し、必要に応じてページ分割します。

// Extract place data

let places = await page.evaluate(() => {

  let results = [];

  // Logic to parse DOM and extract place data

  return results; 

});

// Click "Next" to paginate
await page.click(‘button[aria-label="Next page"]‘);

すべての結果が得られるまで、追加のページとズーム レベルを継続的にスクレイピングします。

ご覧のとおり、これにはフロントエンド コードを注意深くリバース エンジニアリングする必要があります。しかし、その特典は、Google の完全な場所データベースにアクセスできることです。

この種のカスタム スクレイパーを使用して、カリフォルニア全土の 500,000 か所以上の場所を抽出することができました。手間はかかりますが、巨大なデータセットを提供できます。

落とし穴のスクレイピング

Google マップをスクレイピングする際のヒントをいくつか紹介します。

  • ブラウザーの自動化には、Node の Puppeteer または Python の Selenium を使用します。

  • 「人間らしく」見えるようにアクション間にランダムな遅延を実装します。

  • プロキシとスプーフィング ヘッダーをローテーションして、ボットの検出を回避します。

  • 段階的にスクレイピングし、状態を永続化して再開します。

  • ブラウザ間で並列処理して結果を高速化します。

Web スクレイピングは巨大な場所のデータセットを解放できますが、大きな課題も伴います。 API の使用法は一般にクリーンです…これが 4 番目の戦略につながります。

方法 4: サードパーティのプレイス API を活用する

多くの企業が、Google よりも広範囲をカバーする代替場所データベースを提供しています。

例:

  • 事実上 には、Google を含むさまざまなプロバイダーから取得した 100 億を超える世界の POI に関するデータがあります。

  • フォースクエア 開発者 API には 105 億 XNUMX 万以上の場所があります。

  • 悲鳴 は、Fusion API を介して何百万もの地元企業に関するデータを持っています。

  • ジオネームズ には、25 万を超える地理的特徴を含むオープン データベースがあります。

これらはすべて、より大きなデータセットを提供することで Google プレイスを補完できます。

私は最近、日本全国の 5 万か所以上の名所を一括抽出するプロジェクトに Factual を統合しました。 Google の限界をはるかに超えています。

欠点は、コーディングと別のサービスの料金の支払いです。ただし、特定のユースケースでは、大量の場所を扱う場合はサードパーティ データが最良の選択肢となる場合があります。

どの方法があなたにとって最適ですか?

では、Google から何百万もの場所を抽出するには、どのアプローチを使用すればよいでしょうか?場合によります!

私の経験則は次のとおりです。

  • ページネーション – 最大数千の追加場所用。

  • グリッド検索 – 最大数十万箇所。

  • Webスクレイピング – 何百万もの場所がありますが、技術的には困難です。

  • 外部API – 何千万か所に設置できるが、追加コストがかかる。

また、どの程度緊急にデータが必要なのか、どのような特定の場所の属性が必要なのかも考慮してください。

ほとんどのプロジェクトは、最適なパフォーマンスとシンプルさの点でグリッド検索にうまく適合していることがわかります。ただし、すべてのオプションを検討してください。選択肢はたくさんあります。

そして、多くの場合、グリッド + スクレイピングや Factual API + Google Places など、アプローチを組み合わせることが最も強力です。

この制限は、データを大量に消費するあなたの野心に匹敵しません。

重要なポイントと次のステップ

学んだことを要約しましょう。

  • Google Places API では、クエリごとに 120 か所に制限されています…しかし、多くのアプリはさらに多くのデータを必要とします。

  • ページネーション、グリッド検索、Web スクレイピングなどの技術を使用すると、Google から何百万もの場所を取得できます。

  • サードパーティのプレイス API も、より広範なデータを提供します。

  • 最適な結果を得るには、グリッド + スクレイピングなどのさまざまな方法をブレンドすることを検討してください。

これで、Google の制限を克服するための専門家によるガイドが手に入りました。場所データの世界を探索してみましょう。

次に、時間をかけてユースケースに最適なアプローチを選択し、ソリューションの実装を開始します。

他にご質問がございましたら、お気軽にお問い合わせください。私は地理データ愛好家の仲間をいつでも喜んでお手伝いします。

場所データの可能性を最大限に引き出して、次のマッピング プロジェクトを強化しましょう。

参加する

あなたのメールアドレスは公開されません。 必須フィールドは、マークされています *