Passer au contenu

Surmonter la limite de l'API Google Places de 120 Places : guide de l'expert

En tant que gourou du web scraping avec plus de 5 ans d'expérience dans l'extraction de données à partir de Google Maps, j'ai appris une ou deux choses sur la façon de dépasser les limites. Vous souhaitez donc extraire plus de 100,000 XNUMX lieux de l'API Google Places ? Eh bien, vous êtes au bon endroit !

Dans ce guide complet de plus de 2,000 XNUMX mots, je partagerai plusieurs méthodes éprouvées pour extraire autant de données Google Places que votre cœur le désire.

Ces techniques avancées vont bien au-delà de l'API de base, exploitant des scripts personnalisés, des sources de données non officielles, des proxys, etc.

Je vous guiderai également à travers des exemples concrets et des exemples de code afin que vous puissiez intégrer ces stratégies dans vos propres projets.

À la fin, vous serez un pro pour contourner les limites de Google et libérer toute la puissance des données Places pour répondre à vos besoins.

Allons-y !

La douleur de n'obtenir que 120 places

Comme vous le savez probablement, l'API Google Places vous limite à seulement 120 lieux par requête. Pour la plupart des projets, 120 places ne suffisent tout simplement pas.

Pensez-y juste…

  • Il existe plus de 8,000 120 établissements Starbucks rien qu’aux États-Unis. Bonne chance pour les récupérer tous à XNUMX par appel.

  • La ville de Los Angeles compte plus de 15,000 120 restaurants. À 125 par requête, vous devrez effectuer XNUMX requêtes API pour toutes les obtenir.

  • Si vous vouliez créer un annuaire de tous les centres commerciaux d’Amérique (plus de 1,000 XNUMX), vous atteindrez très rapidement la limite.

Et si vous pensez que 120 par requête semble faible, sachez qu'il n'y avait que 20 places avant que Google n'augmente la limite en 2019. Ils reconnaissent donc essentiellement qu'encore plus de résultats sont souvent nécessaires.

Pourquoi Google limite-t-il les lieux si strictement ?

Google souhaite éviter les requêtes trop volumineuses qui pourraient surcharger ses serveurs. Ils ont donc limité le nombre de places à une taille raisonnable pour les cas d’utilisation typiques.

Mais pour les utilisateurs expérimentés comme nous, 120 places ne suffisent tout simplement pas.

Heureusement, avec les bons outils et techniques, nous pouvons accéder à des millions de lieux depuis Google si nous en avons besoin.

Voyons comment.

Méthode 1 : utiliser plusieurs requêtes avec des requêtes paginées

Le moyen officiellement pris en charge pour dépasser la limite de 120 places consiste à utiliser des requêtes paginées. Voici comment cela fonctionne…

Tout d'abord, réglez le pagetoken paramètre null pour obtenir les 60 premiers résultats :

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

La réponse comprend un next_page_token champ comme "CpQCBAAA...". Passez ceci comme le pagetoken dans votre prochaine demande :

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

Cela renvoie les 60 prochains. Continuez à transmettre la dernière next_page_token pour paginer progressivement tous les résultats.

Idéalement, combinez cela avec plusieurs clés API pour effectuer des requêtes paginées simultanées. Cet adaptateur que j'ai construit interroge 3 clés simultanément pour accélérer la pagination :

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

}

Cela me permet de paginer les résultats 3 fois plus rapidement en répartissant simultanément les requêtes sur plusieurs clés API.

Avec cette stratégie, vous pouvez récupérer jusqu'à 360 places par appel (120*3 touches). Pour en obtenir plus, continuez simplement à paginer avec les demandes ultérieures.

Astuce Pro: Mettez en cache chaque page de résultats localement afin de ne pas répéter les appels d'API si des erreurs se produisent.

Limites de la pagination

L'inconvénient est que vous devez gérer vous-même toute la logique de pagination. Et même si vous pouvez l'accélérer avec des requêtes simultanées, cela reste généralement plus lent qu'une seule requête groupée.

La pagination fonctionne mieux si vous n'avez besoin que de quelques milliers de places supplémentaires au-delà de la limite. Mais une fois qu’on arrive à des dizaines ou des centaines de milliers de lieux, d’autres approches deviennent plus efficaces…

Méthode 2 : diviser la zone de recherche en grilles plus petites

Pour les gros volumes, j’ai trouvé que diviser la zone de recherche en « grilles » donne les meilleurs résultats.

Les étapes sont les suivantes:

  1. Divisez votre emplacement cible en plusieurs zones de recherche plus petites.

  2. Interrogez chaque zone indépendamment pour récupérer l’intégralité des 120 places par section.

  3. Combinez les résultats de chaque zone dans votre ensemble de données complet.

Passons en revue un exemple de flux de travail…

Imaginez que j'avais besoin de trouver tous les restaurants de Manhattan. Cela représente plus de 15,000 120 places, bien au-delà de la limite de XNUMX.

Voici comment je les extrairais tous :

  1. Divisez Manhattan en grilles. Je le diviserais en différents quartiers ou codes postaux. Par exemple:

    10021
    10022
    10023
    10075

    Et ainsi de suite pour tous les codes postaux de Manhattan…

  2. Interroger chaque grille. Pour chaque code postal, je ferais une recherche textuelle comme :

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

    Cela renvoie les 120 premiers restaurants de ce ZIP.

  3. Combiner tous les résultats. Je lancerais la recherche de chaque code postal, puis combinerais tous les lieux en une grande liste de plus de 15,000 XNUMX restaurants !

Vous voyez comment ça marche ? En divisant les zones en segments plus petits, vous pouvez récupérer 120 lieux par section. Cela s’adapte à n’importe quel nombre total de places.

Et encore une fois, il est utile d’effectuer ces recherches de grille en parallèle pour une plus grande vitesse. J'aime utiliser Node.js pour les scripts.

Création de grilles optimales

Il existe plusieurs manières de diviser les cartes en grilles :

  • Par quartier ou district
  • Utilisation des codes postaux/postaux
  • Avec des limites spécifiques de latitude/longueur
  • Espacement égal de 0.1 degrés de latitude et de longueur

Réduisez vos grilles suffisamment petites pour maximiser les résultats par requête. Mais pas trop petit pour que vous frappiez les mêmes endroits à plusieurs reprises.

Le compromis optimal dépend de la superficie totale de la carte et de la densité du lieu. Mais pour la plupart des villes, les grilles de 0.5 à 1 mile carré fonctionnent bien.

Expérimentez avec différentes granularités pour voir ce qui renvoie les endroits les plus uniques.

Le principal inconvénient de la recherche par grille est la complexité supplémentaire du codage pour diviser les zones et combiner les résultats. Les requêtes paginées sont plus simples à mettre en œuvre.

Mais les gains de performances en valent la peine. J'ai utilisé cette méthode pour extraire avec succès jusqu'à 300,000 120 adresses de Google, bien au-delà de la limite de XNUMX.

Examinons maintenant une option encore plus puissante (mais capricieuse)…

Méthode 3 : gratter les résultats de recherche Google Maps

La recherche Google Maps renvoie beaucoup plus de résultats que ne le permettent leurs API. Nous pouvons en tirer parti directement en grattant leur site Web.

Voici les étapes de base:

  1. Recherchez une catégorie de lieu sur Google Maps, comme "pizza à Chicago".

  2. Utilisez un grattoir Web pour extraire les données des résultats rendus.

  3. Parcourez les vues de la carte et les niveaux de zoom pour déclencher davantage de lieux.

  4. Combinez toutes les données récupérées dans votre ensemble de données.

Cela vous donne accès à l'index complet des lieux de Google. Le problème est que leur site utilise un rendu et une pagination JavaScript complexes.

Passons en revue un exemple d'architecture de scraper…

Tout d’abord, je géocode l’emplacement de recherche pour obtenir le point central optimal de la carte :

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

Ensuite, j'ouvre le navigateur et j'accède à l'URL de Google Maps :

// 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); 

Ensuite, j'extrait les lieux des résultats rendus et je les pagine selon les besoins :

// 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"]‘);

Je gratte continuellement des pages supplémentaires et des niveaux de zoom jusqu'à ce que j'aie tous les résultats.

Comme vous pouvez le constater, cela nécessite une rétro-ingénierie méticuleuse du code front-end. Mais la récompense est l'accès à la base de données complète des lieux de Google.

J'ai pu extraire plus de 500,000 XNUMX lieux à travers la Californie en utilisant ce type de grattoir personnalisé. Cela demande du travail, mais peut fournir d’énormes ensembles de données.

Gratter les pièges

Voici quelques conseils lors du scraping de Google Maps :

  • Utilisez Puppeteer dans Node ou Selenium en Python pour l'automatisation du navigateur.

  • Implémentez des délais aléatoires entre les actions pour paraître « humain ».

  • Faites pivoter les proxys et les en-têtes usurpés pour éviter la détection des robots.

  • Grattez progressivement et conservez l'état pour reprendre.

  • Parallélisez tous les navigateurs pour des résultats plus rapides.

Le web scraping peut débloquer d’énormes ensembles de données, mais comporte également de grands défis. L'utilisation des API est généralement plus propre… ce qui nous amène à notre quatrième stratégie.

Méthode 4 : exploiter les API Places tierces

De nombreuses entreprises proposent des bases de données de lieux alternatives avec une couverture plus étendue que celle de Google.

Par exemple :

  • Les faits dispose de données sur plus de 100 millions de POI mondiaux provenant de divers fournisseurs, dont Google.

  • Foursquare a plus de 105 millions de places dans son API de développeur.

  • Yelp dispose de données sur des millions d'entreprises locales via leur API Fusion.

  • GeoNames dispose d'une base de données ouverte avec plus de 25 millions d'entités géographiques.

Ceux-ci peuvent tous compléter Google Places en fournissant des ensembles de données plus volumineux.

J'ai récemment intégré Factual dans un projet visant à extraire en masse des points d'intérêt dans tout le Japon – plus de 5 millions de lieux ! Bien au-delà des limites de Google.

L’inconvénient est de coder et de payer pour un autre service. Mais pour certains cas d’utilisation, les données tierces peuvent constituer votre meilleure option pour un grand nombre de lieux.

Quelle méthode vous convient le mieux ?

Alors, quelle approche devriez-vous utiliser pour extraire des millions de lieux de Google ? Ça dépend!

Voici mes règles empiriques :

  • Pagination – Jusqu’à quelques milliers de places supplémentaires.

  • Recherche de grille – Jusqu’à des centaines de milliers de lieux.

  • Web Scraping – Des millions de places mais techniquement difficiles.

  • API externes – Des dizaines de millions de places mais des coûts supplémentaires.

Tenez également compte de l’urgence avec laquelle vous avez besoin des données et des attributs de lieu spécifiques dont vous avez besoin.

Je trouve que la plupart des projets s'intègrent bien dans la recherche de grille pour des performances optimales par rapport à la simplicité. Mais explorez toutes les options – vous avez beaucoup de choix !

Et la combinaison des approches est souvent la plus puissante, comme les grilles + le scraping ou l'API factuelle + Google Places.

Les limites ne sont pas à la hauteur de vos ambitions gourmandes en données.

Principaux plats à emporter et prochaines étapes

Récapitulons ce que nous avons appris :

  • L'API Google Places vous limite à 120 lieux par requête… mais de nombreuses applications ont besoin de beaucoup plus de données.

  • Des techniques telles que la pagination, la recherche sur grille et le web scraping peuvent récupérer des millions de lieux sur Google.

  • Les API de lieux tiers fournissent également des données plus complètes.

  • Pensez à mélanger différentes méthodes comme les grilles + le grattage pour des résultats optimaux.

Vous disposez désormais d’un guide d’expert pour surmonter les limites de Google. Le monde des données de lieux est à vous d’explorer.

Ensuite, prenez le temps de choisir l’approche qui correspond le mieux à votre cas d’utilisation et commencez à mettre en œuvre une solution.

N'hésitez pas à nous contacter si vous avez d'autres questions ! Je suis toujours heureux d'aider d'autres fanatiques de géodonnées.

Libérez maintenant tout le potentiel des données de lieux pour alimenter votre prochain projet de cartographie !

Prendre part à la conversation

Votre adresse email n'apparaitra pas. Les champs obligatoires sont marqués *