Salta al contenuto

Superare il limite di 120 luoghi dell'API di Google Places: una guida per esperti

In qualità di guru del web scraping con oltre 5 anni di esperienza nell'estrazione di dati da Google Maps, ho imparato una o due cose su come superare i limiti. Vuoi estrarre più di 100,000 luoghi dall'API di Google Places? Bene, sei arrivato nel posto giusto!

In questa guida completa di oltre 2,000 parole, condividerò diversi metodi comprovati per estrarre tutti i dati di Google Places che il tuo cuore desidera.

Queste tecniche avanzate vanno ben oltre l'API di base, sfruttando script personalizzati, origini dati non ufficiali, proxy e altro ancora.

Ti guiderò anche attraverso esempi reali e codice di esempio in modo che tu possa integrare queste strategie nei tuoi progetti.

Alla fine, sarai un professionista nel superare i limiti di Google e sfruttare tutta la potenza dei dati di Places per le tue esigenze.

Immergiamoci!

Il dolore di ottenere solo 120 posti

Come probabilmente saprai, l'API di Google Places ti limita a soli 120 luoghi per query. Per la maggior parte dei progetti, 120 posti semplicemente non bastano.

Pensaci ...

  • Ci sono oltre 8,000 sedi Starbucks solo negli Stati Uniti. Buona fortuna a recuperarli tutti a 120 per chiamata.

  • La città di Los Angeles ha oltre 15,000 ristoranti. Con 120 per query, dovresti effettuare 125 richieste API per ottenerle tutte.

  • Se volessi creare un elenco di tutti i centri commerciali in America (oltre 1,000), raggiungeresti il ​​limite molto rapidamente.

E se ritieni che 120 per richiesta sembrino pochi, sappi che erano solo 20 posti prima che Google aumentasse il limite nel 2019. Quindi essenzialmente riconoscono che spesso sono necessari ancora più risultati.

Perché Google limita i luoghi in modo così rigoroso?

Google vuole evitare richieste eccessivamente grandi che potrebbero sovraccaricare i propri server. Quindi hanno limitato il numero di posti a dimensioni ragionevoli per i casi d’uso tipici.

Ma per gli utenti esperti come noi, 120 posti non sono sufficienti.

Per fortuna, con gli strumenti e le tecniche giusti, possiamo accedere a milioni di posti da Google, se necessario.

Diamo un'occhiata a come.

Metodo 1: utilizzare più query con richieste impaginate

Il modo ufficialmente supportato per superare il limite di 120 posti è utilizzare richieste impaginate. Ecco come funziona…

Innanzitutto, imposta il pagetoken parametro null per ottenere i primi 60 risultati:

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

La risposta include a next_page_token campo come "CpQCBAAA...". Passa questo come pagetoken nella tua prossima richiesta:

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

Ciò restituisce i successivi 60. Continua a passare l'ultimo next_page_token per impaginare gradualmente tutti i risultati.

Idealmente, combinalo con più chiavi API per eseguire query impaginate simultanee. Questo adattatore che ho creato interroga 3 chiavi contemporaneamente per velocizzare l'impaginazione:

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

}

Ciò mi consente di impaginare i risultati 3 volte più velocemente distribuendo le richieste su più chiavi API contemporaneamente.

Con questa strategia è possibile recuperare fino a 360 posti per chiamata (120 * 3 tasti). Per ottenere di più è sufficiente continuare a impaginare con le richieste successive.

Suggerimento Pro: Memorizza nella cache locale ogni pagina dei risultati in modo da non ripetere le chiamate API in caso di errori.

Limitazioni dell'impaginazione

Lo svantaggio è che devi gestire tu stesso tutta la logica di impaginazione. E sebbene sia possibile accelerarlo con richieste simultanee, in genere è comunque più lento di una singola query in blocco.

L'impaginazione funziona meglio se hai bisogno solo di poche migliaia di posti extra oltre il limite. Ma una volta arrivati ​​a decine o centinaia di migliaia di posti, altri approcci diventano più efficienti...

Metodo 2: dividere l'area di ricerca in griglie più piccole

Per grandi volumi, ho scoperto che dividere l'area di ricerca in "griglie" produce i risultati migliori.

I passi sono i seguenti:

  1. Dividi la tua posizione target in più aree di ricerca più piccole.

  2. Interroga ciascuna area in modo indipendente per recuperare tutti i 120 posti per sezione.

  3. Combina i risultati di ciascuna area nel tuo set di dati completo.

Esaminiamo un flusso di lavoro di esempio...

Immagina di dover comprare tutti i ristoranti di Manhattan. Si tratta di oltre 15,000 posti, ben oltre il limite di 120.

Ecco come li estrarrei tutti:

  1. Dividere Manhattan in griglie. Lo dividerei in diversi quartieri o codici postali. Per esempio:

    10021
    10022
    10023
    10075

    E così via per tutti i codici postali di Manhattan…

  2. Interroga ciascuna griglia. Per ogni codice postale, farei una ricerca testuale come:

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

    Ciò restituisce i primi 120 ristoranti in quel CAP.

  3. Combina tutti i risultati. Eseguivo la ricerca per ogni codice postale, quindi combinavo tutti i luoghi in un unico grande elenco di oltre 15,000 ristoranti!

Vedi come funziona? Suddividendo le aree in segmenti più piccoli è possibile recuperare 120 posti per sezione. Questo si estende fino a qualsiasi numero totale di posti.

E ancora, aiuta a fare queste ricerche sulla griglia in parallelo per una maggiore velocità. Mi piace usare Node.js per lo scripting.

Creazione di griglie ottimali

Esistono diversi modi per dividere le mappe in griglie:

  • Per quartiere o distretto
  • Utilizzando CAP/codici postali
  • Con limiti lat/long specifici
  • Spaziatura uguale di 0.1 gradi lat/long

Rendi le tue griglie abbastanza piccole da massimizzare i risultati per query. Ma non troppo piccolo da colpire ripetutamente gli stessi posti.

Il compromesso ottimale dipende dall'area totale della mappa e dalla densità del luogo. Ma per la maggior parte delle città, le griglie da 0.5 a 1 miglio quadrato funzionano bene.

Sperimenta diverse granularità per vedere cosa restituisce i luoghi più unici.

Lo svantaggio principale della ricerca a griglia è la maggiore complessità della codifica per dividere le aree e combinare i risultati. Le richieste impaginate sono più semplici da implementare.

Ma i miglioramenti in termini di prestazioni valgono la pena di utilizzare le griglie. Ho utilizzato questo metodo per estrarre con successo fino a 300,000 posti da Google, ben oltre il limite di 120.

Ora diamo un'occhiata a un'opzione ancora più potente (ma complessa)...

Metodo 3: raschiare i risultati di ricerca di Google Maps

La ricerca di Google Maps restituisce molti più risultati di quelli consentiti dalle loro API. Possiamo sfruttarlo direttamente raschiando il loro sito web.

Ecco i passaggi di base:

  1. Cerca una categoria di luogo su Google Maps, come "pizza a Chicago".

  2. Utilizzare un web scraper per estrarre i dati dai risultati renderizzati.

  3. Scorri le visualizzazioni della mappa e i livelli di zoom per attivare più luoghi.

  4. Combina tutti i dati raschiati nel tuo set di dati.

Ciò ti dà accesso all'indice completo dei luoghi di Google. Il problema è che il loro sito utilizza rendering e impaginazione JavaScript complessi.

Esaminiamo un esempio di architettura di scraper...

Innanzitutto, geocodifico la posizione di ricerca per ottenere il punto centrale ottimale della mappa:

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

Successivamente, apro il browser e vado all'URL di 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); 

Quindi estraggo i luoghi dai risultati renderizzati e li impago secondo necessità:

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

Raschio continuamente pagine aggiuntive e livelli di zoom finché non ottengo tutti i risultati.

Come puoi vedere, ciò richiede un meticoloso reverse engineering del codice front-end. Ma la ricompensa è l'accesso al database completo dei luoghi di Google.

Sono riuscito a estrarre oltre 500,000 posti in tutta la California utilizzando questo tipo di raschietto personalizzato. Richiede lavoro, ma può fornire enormi set di dati.

Raschiare i trucchi

Ecco alcuni suggerimenti per lo scraping di Google Maps:

  • Utilizza Puppeteer in Node o Selenium in Python per l'automazione del browser.

  • Implementa ritardi casuali tra le azioni per apparire "umano".

  • Ruota proxy e intestazioni spoofing per evitare il rilevamento dei bot.

  • Raschiare in modo incrementale e persistere lo stato per riprendere.

  • Parallelizza i browser tra loro per risultati più rapidi.

Il web scraping può sbloccare enormi quantità di dati, ma comporta anche grandi sfide. L'utilizzo dell'API è generalmente più pulito... il che ci porta alla nostra quarta strategia.

Metodo 4: sfruttare le API di posizioni di terze parti

Numerose aziende offrono database di luoghi alternativi con una copertura più ampia di quella di Google.

Per esempio:

  • Factual dispone di dati su oltre 100 milioni di POI globali provenienti da vari fornitori tra cui Google.

  • foursquare ha più di 105 milioni di posti nella loro API per sviluppatori.

  • Guaire dispone di dati su milioni di aziende locali tramite la loro API Fusion.

  • GeoNames dispone di un database aperto con oltre 25 milioni di caratteristiche geografiche.

Tutti questi possono integrare Google Places fornendo set di dati più grandi.

Recentemente ho integrato Factual in un progetto per estrarre in massa punti di interesse in tutto il Giappone: oltre 5 milioni di posti! Ben oltre i limiti di Google.

Lo svantaggio è codificare e pagare per un altro servizio. Ma per alcuni casi d’uso, i dati di terze parti potrebbero essere la soluzione migliore per grandi quantità di luoghi.

Qual è il metodo migliore per te?

Quindi quale approccio dovresti utilizzare per estrarre milioni di luoghi da Google? Dipende!

Ecco le mie regole pratiche:

  • Impaginazione – Fino a qualche migliaio di posti aggiuntivi.

  • Grid Search – Fino a centinaia di migliaia di posti.

  • Scraping Web – Milioni di posti ma tecnicamente impegnativi.

  • API esterne – Decine di milioni di posti ma costi aggiuntivi.

Considera anche l'urgenza con cui hai bisogno dei dati e quali attributi specifici del luogo richiedi.

Trovo che la maggior parte dei progetti si adatti perfettamente alla ricerca della griglia per prestazioni ottimali rispetto alla semplicità. Ma esplora tutte le opzioni: hai molte scelte!

E la combinazione degli approcci è spesso la più potente, come grids + scraping o Factual API + Google Places.

I limiti non corrispondono alle tue ambizioni affamate di dati.

Punti chiave e passaggi successivi

Ricapitoliamo quello che abbiamo imparato:

  • L'API di Google Places ti limita a 120 luoghi per query... ma molte app necessitano di molti più dati.

  • Tecniche come l'impaginazione, la ricerca su griglia e il web scraping possono recuperare milioni di posti da Google.

  • Anche le API dei luoghi di terze parti forniscono dati più estesi.

  • Considera la possibilità di combinare metodi diversi come griglie + raschiatura per risultati ottimali.

Ora hai una guida esperta per superare i limiti di Google. Il mondo dei dati sui luoghi è tuo da esplorare.

Successivamente, dedica un po' di tempo alla scelta dell'approccio più adatto al tuo caso d'uso e inizia a implementare una soluzione.

Sentiti libero di contattarci se hai altre domande! Sono sempre felice di aiutare gli altri fanatici dei dati geografici.

Ora libera tutto il potenziale dei dati sui luoghi per alimentare il tuo prossimo progetto di mappatura!

Partecipa alla conversazione

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *