Meteen naar de inhoud

De Google Places API-limiet van 120 plaatsen overwinnen: een gids voor experts

Als webscraping-goeroe met meer dan vijf jaar ervaring met het extraheren van gegevens uit Google Maps, heb ik het een en ander geleerd over het overwinnen van grenzen. Dus je wilt meer dan 5 plaatsen uit de Google Places API halen? Dan ben je hier aan het juiste adres!

In deze uitgebreide gids van meer dan 2,000 woorden deel ik verschillende beproefde methoden om zoveel Google Places-gegevens te extraheren als je hartje begeert.

Deze geavanceerde technieken gaan veel verder dan de basis-API en maken gebruik van aangepaste scripts, niet-officiële gegevensbronnen, proxy's en meer.

Ik begeleid u ook door praktijkvoorbeelden en voorbeeldcode, zodat u deze strategieën in uw eigen projecten kunt integreren.

Uiteindelijk zult u een professional zijn in het omzeilen van de limieten van Google en het benutten van de volledige kracht van Places-gegevens voor uw behoeften.

Laten we erin duiken!

De pijn van slechts 120 plaatsen

Zoals u waarschijnlijk weet, beperkt de Google Places API u tot slechts 120 plaatsen per zoekopdracht. Voor de meeste projecten zijn 120 plaatsen gewoon niet voldoende.

Denk er gewoon over na…

  • Alleen al in de VS zijn er ruim 8,000 Starbucks-locaties. Veel succes met het ophalen van ze allemaal voor 120 per oproep.

  • De stad Los Angeles heeft meer dan 15,000 restaurants. Bij 120 per query moet u 125 API-verzoeken indienen om ze allemaal te krijgen.

  • Als je een directory van elk winkelcentrum in Amerika (meer dan 1,000) zou willen maken, zou je heel snel de limiet bereiken.

En als u denkt dat 120 per verzoek weinig lijkt, weet dan dat dit slechts 20 plaatsen waren voordat Google de limiet in 2019 verhoogde. Ze erkennen dus in wezen dat er vaak nog meer resultaten nodig zijn.

Waarom beperkt Google plaatsen zo strikt?

Google wil te grote verzoeken voorkomen die hun servers kunnen overbelasten. Daarom hebben ze het aantal plaatsen beperkt tot een redelijke omvang voor typische gebruikssituaties.

Maar voor ervaren gebruikers zoals wij zijn 120 plaatsen gewoon niet genoeg.

Gelukkig hebben we met de juiste tools en technieken toegang tot miljoenen plaatsen van Google als dat nodig is.

Laten we eens kijken hoe.

Methode 1: Gebruik meerdere zoekopdrachten met gepagineerde verzoeken

De officieel ondersteunde manier om de limiet van 120 plaatsen te overschrijden is door gepagineerde verzoeken te gebruiken. Dit is hoe het werkt…

Stel eerst de pagetoken parameter null om de eerste 60 resultaten te krijgen:

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

Het antwoord omvat een next_page_token veld als "CpQCBAAA...". Geef dit door als de pagetoken in uw volgende verzoek:

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

Dit retourneert de volgende 60. Blijf de laatste doorgeven next_page_token om geleidelijk door alle resultaten te bladeren.

Combineer dit idealiter met meerdere API-sleutels om gelijktijdige gepagineerde zoekopdrachten uit te voeren. Met deze adapter heb ik 3 sleutels tegelijkertijd gebouwd om de paginering te versnellen:

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

}

Hierdoor kan ik drie keer sneller door de resultaten bladeren door verzoeken tegelijkertijd uit te spreiden over meerdere API-sleutels.

Met deze strategie kunt u per gesprek maximaal 360 plaatsen ophalen (120 * 3 toetsen). Om meer te krijgen, blijft u gewoon doorgaan met het pagineren van volgende verzoeken.

Pro Tip: Cache elke pagina met resultaten lokaal, zodat u API-aanroepen niet herhaalt als er fouten optreden.

Beperkingen van paginering

Het nadeel is dat je alle pagineringslogica zelf moet afhandelen. En hoewel u het kunt versnellen met gelijktijdige verzoeken, is het doorgaans nog steeds langzamer dan een enkele bulkquery.

Paginering werkt het beste als u slechts een paar duizend extra plaatsen boven de limiet nodig heeft. Maar als je eenmaal op de tien- of honderdduizenden plaatsen bent beland, worden andere benaderingen efficiënter…

Methode 2: Splits het zoekgebied in kleinere rasters

Voor grote volumes heb ik gemerkt dat het opsplitsen van het zoekgebied in "rasters" de beste resultaten oplevert.

De stappen zijn:

  1. Verdeel uw doellocatie in meerdere kleinere zoekgebieden.

  2. Doorzoek elk gebied afzonderlijk om de volledige 120 plaatsen per sectie op te halen.

  3. Combineer de resultaten van elk gebied in uw volledige dataset.

Laten we een voorbeeldworkflow doornemen...

Stel je voor dat ik alle restaurants in Manhattan nodig had. Dat zijn ruim 15,000 plaatsen, ruim boven de limiet van 120.

Hier is hoe ik ze allemaal zou extraheren:

  1. Verdeel Manhattan in rasters. Ik zou het verdelen in verschillende buurten of postcodes. Bijvoorbeeld:

    10021
    10022
    10023
    10075

    En zo verder voor alle postcodes van Manhattan...

  2. Onderzoek elk raster. Voor elke postcode zou ik een tekstzoekopdracht uitvoeren, zoals:

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

    Dat levert de eerste 120 restaurants in die ZIP op.

  3. Combineer alle resultaten. Ik zou naar elke postcode zoeken en vervolgens alle plaatsen combineren in één grote lijst van meer dan 15,000 restaurants!

Zie je hoe dat werkt? Door gebieden op te splitsen in kleinere segmenten kun je per sectie 120 plaatsen terugvinden. Dit schaalt op naar een willekeurig totaal aantal plaatsen.

En nogmaals, het helpt om deze rasterzoekopdrachten parallel uit te voeren voor een grotere snelheid. Ik gebruik graag Node.js voor de scripting.

Optimale rasters creëren

Er zijn verschillende manieren om kaarten in rasters te verdelen:

  • Per buurt of wijk
  • Met behulp van postcodes
  • Met specifieke lat/lange grenzen
  • Gelijke afstand van 0.1 lat/lange graden

Maak uw rasters klein genoeg om de resultaten per zoekopdracht te maximaliseren. Maar niet zo klein dat je herhaaldelijk op dezelfde plekken komt.

De optimale afweging hangt af van het totale kaartgebied en de plaatsdichtheid. Maar voor de meeste steden werken rasters van 0.5 – 1 vierkante kilometer goed.

Experimenteer met verschillende granulariteiten om te zien wat de meest unieke plaatsen oplevert.

Het belangrijkste nadeel van rasterzoeken is de extra coderingscomplexiteit om gebieden te splitsen en resultaten te combineren. Gepagineerde verzoeken zijn eenvoudiger te implementeren.

Maar de prestatiewinst maakt netwerken de moeite waard. Ik heb deze methode gebruikt om met succes tot 300,000 plaatsen uit Google te halen – ver boven de limiet van 120.

Laten we nu eens kijken naar een nog krachtigere (maar kieskeurige) optie…

Methode 3: Zoekresultaten van Google Maps schrapen

Zoeken op Google Maps levert veel meer resultaten op dan hun API's toestaan. We kunnen dit rechtstreeks benutten door hun website te schrapen.

Hier zijn de basisstappen:

  1. Zoek naar een plaatscategorie op Google Maps, zoals 'pizza in Chicago'.

  2. Gebruik een webschraper om gegevens uit de weergegeven resultaten te extraheren.

  3. Blader door kaartweergaven en zoomniveaus om meer plaatsen te activeren.

  4. Combineer alle geschraapte gegevens in uw dataset.

Hiermee krijgt u toegang tot de volledige index van plaatsen van Google. Het probleem is dat hun site gebruikmaakt van complexe JavaScript-rendering en paginering.

Laten we een voorbeeld van een schraperarchitectuur bekijken…

Eerst geocodeer ik de zoeklocatie om het optimale kaartmiddelpunt te krijgen:

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

Vervolgens open ik de browser en navigeer naar de Google Maps-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); 

Vervolgens extraheer ik plaatsen uit de weergegeven resultaten en pagineer ik indien nodig:

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

Ik schrap voortdurend extra pagina's en zoomniveaus totdat ik alle resultaten heb.

Zoals u kunt zien, vereist dit een zorgvuldige reverse-engineering van de front-endcode. Maar de beloning is toegang tot de volledige plaatsendatabase van Google.

Ik heb met dit soort aangepaste schraper meer dan 500,000 plaatsen in Californië kunnen extraheren. Het kost werk, maar kan enorme datasets opleveren.

Gotcha's schrapen

Hier zijn enkele tips voor het schrapen van Google Maps:

  • Gebruik Puppeteer in Node of Selenium in Python voor browserautomatisering.

  • Implementeer willekeurige vertragingen tussen acties om er "menselijk" uit te zien.

  • Roteer proxy's en spoof-headers om botdetectie te voorkomen.

  • Schraap stapsgewijs en blijf doorgaan met hervatten.

  • Parallelliseer tussen browsers voor snellere resultaten.

Webscraping kan datasets op grote plaatsen ontsluiten, maar brengt ook grote uitdagingen met zich mee. Het API-gebruik is over het algemeen schoner… wat ons bij onze vierde strategie brengt.

Methode 4: Maak gebruik van Places-API's van derden

Talloze bedrijven bieden alternatieve plaatsendatabases aan met een uitgebreidere dekking dan die van Google.

Bijvoorbeeld:

  • Feitelijk heeft gegevens over meer dan 100 miljoen wereldwijde POI's, afkomstig van verschillende providers, waaronder Google.

  • Foursquare heeft meer dan 105 miljoen plaatsen in hun ontwikkelaars-API.

  • Yelp heeft gegevens over miljoenen lokale bedrijven via hun Fusion API.

  • GeoNames heeft een open database met meer dan 25 miljoen geografische kenmerken.

Deze kunnen allemaal Google Places aanvullen door grotere datasets aan te bieden.

Ik heb onlangs Factual geïntegreerd in een project om interessante punten in heel Japan te verzamelen – meer dan 5 miljoen plaatsen! Ver buiten de grenzen van Google.

Het nadeel is het coderen en betalen voor een andere dienst. Maar voor bepaalde gebruikssituaties kunnen gegevens van derden uw beste optie zijn voor grote hoeveelheden plaatsen.

Welke methode past het beste bij u?

Dus welke aanpak moet je gebruiken om miljoenen plaatsen uit Google te halen? Het hangt er van af!

Hier zijn mijn vuistregels:

  • Opdelen – Voor maximaal enkele duizenden extra plaatsen.

  • Grid zoeken – Tot honderdduizenden plaatsen.

  • Web schrapen – Miljoenen plaatsen, maar technisch uitdagend.

  • Externe API's – Tientallen miljoenen plaatsen maar extra kosten.

Bedenk ook hoe dringend u de gegevens nodig heeft en welke specifieke plaatsattributen u nodig heeft.

Ik vind dat de meeste projecten mooi passen in het zoeken naar rasters voor optimale prestaties versus eenvoud. Maar onderzoek alle opties – je hebt veel keuzes!

En het combineren van benaderingen is vaak het krachtigst, zoals grids + scraping of Factual API + Google Places.

De limieten zijn niet opgewassen tegen uw datahongerige ambities.

Belangrijkste punten en volgende stappen

Laten we samenvatten wat we hebben geleerd:

  • De Google Places API beperkt u tot 120 plaatsen per zoekopdracht... maar veel apps hebben veel meer gegevens nodig.

  • Technieken zoals paginering, rasterzoeken en webscrapen kunnen miljoenen plaatsen van Google ophalen.

  • API's van plaatsen van derden bieden ook uitgebreidere gegevens.

  • Overweeg om verschillende methoden te combineren, zoals roosters en schrapen, voor een optimaal resultaat.

Nu heb je een deskundige gids om de grenzen van Google te overwinnen. De wereld van plaatsgegevens is aan jou om te verkennen.

Besteed vervolgens wat tijd aan het kiezen van de aanpak die het beste bij uw gebruiksscenario past en begin met het implementeren van een oplossing.

Neem gerust contact op als u nog vragen heeft! Ik ben altijd blij om mede-geodatafanatici te helpen.

Ontketen nu het volledige potentieel van plaatsgegevens om uw volgende kaartproject kracht bij te zetten!

Doe mee aan het gesprek

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd *