Ir al contenido

Superar el límite de 120 lugares de la API de Google Places: una guía para expertos

Como gurú del web scraping con más de 5 años de experiencia extrayendo datos de Google Maps, he aprendido un par de cosas sobre cómo superar los límites. ¿Quieres extraer más de 100,000 lugares de la API de Google Places? Bueno, ¡has venido al lugar correcto!

En esta guía completa de más de 2,000 palabras, compartiré varios métodos probados para extraer tantos datos de Google Places como desee.

Estas técnicas avanzadas van mucho más allá de la API básica y aprovechan scripts personalizados, fuentes de datos no oficiales, servidores proxy y más.

También lo guiaré a través de ejemplos del mundo real y código de muestra para que pueda integrar estas estrategias en sus propios proyectos.

Al final, serás un profesional superando los límites de Google y liberando todo el poder de los datos de Places para tus necesidades.

¡Vamos a sumergirnos!

El dolor de conseguir sólo 120 plazas

Como probablemente sepa, la API de Google Places le limita a sólo 120 lugares por consulta. Para la mayoría de los proyectos, 120 lugares simplemente no es suficiente.

Solo piensa en ello…

  • Hay más de 8,000 locales de Starbucks sólo en Estados Unidos. Buena suerte recuperándolos todos a 120 por llamada.

  • La ciudad de Los Ángeles tiene más de 15,000 restaurantes. A 120 por consulta, necesitaría realizar 125 solicitudes de API para obtenerlas todas.

  • Si quisiera crear un directorio de todos los centros comerciales de Estados Unidos (más de 1,000), alcanzaría el límite muy rápidamente.

Y si cree que 120 por solicitud parece poco, sepa que solían ser solo 20 lugares antes de que Google aumentara el límite en 2019. Por lo tanto, esencialmente reconocen que a menudo se necesitan aún más resultados.

¿Por qué Google limita los lugares de forma tan estricta?

Google quiere evitar solicitudes demasiado grandes que podrían sobrecargar sus servidores. Por lo tanto, limitaron la cantidad de lugares a un tamaño razonable para casos de uso típicos.

Pero para usuarios avanzados como nosotros, 120 plazas no son suficientes.

Afortunadamente, con las herramientas y técnicas adecuadas, podemos acceder a millones de lugares de Google si es necesario.

Veamos cómo.

Método 1: utilizar varias consultas con solicitudes paginadas

La forma admitida oficialmente de superar el límite de 120 lugares es mediante solicitudes paginadas. Así es como funciona…

Primero, configure el pagetoken parámetro para null para obtener los primeros 60 resultados:

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

La respuesta incluye una next_page_token campo como "CpQCBAAA...". Pase esto como el pagetoken en su próxima solicitud:

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

Esto devuelve los siguientes 60. Sigue pasando la última next_page_token para paginar gradualmente todos los resultados.

Lo ideal es combinar esto con varias claves API para realizar consultas paginadas simultáneas. Este adaptador que construí consulta 3 claves simultáneamente para acelerar la paginación:

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

}

Esto me permite paginar los resultados 3 veces más rápido al distribuir las solicitudes en múltiples claves API al mismo tiempo.

Con esta estrategia, puedes recuperar hasta 360 lugares por llamada (120 * 3 claves). Para obtener más, simplemente siga paginando con solicitudes posteriores.

Consejo profesional: Almacene en caché cada página de resultados localmente para no repetir las llamadas a la API si se producen errores.

Limitaciones de la paginación

La desventaja es que usted mismo debe manejar toda la lógica de paginación. Y aunque puede acelerarlo con solicitudes simultáneas, suele ser más lento que una única consulta masiva.

La paginación funciona mejor si sólo necesita unos pocos miles de lugares adicionales más allá del límite. Pero una vez que se llega a las decenas o cientos de miles de lugares, otros enfoques se vuelven más eficientes...

Método 2: dividir el área de búsqueda en cuadrículas más pequeñas

Para volúmenes grandes, he descubierto que dividir el área de búsqueda en "cuadrículas" produce los mejores resultados.

Los pasos son los siguientes:

  1. Divida su ubicación de destino en varias áreas de búsqueda más pequeñas.

  2. Consulta cada área de forma independiente para recuperar los 120 lugares completos por sección.

  3. Combine los resultados de cada área en su conjunto de datos completo.

Veamos un flujo de trabajo de muestra...

Imagínese que necesitaba conseguir todos los restaurantes de Manhattan. Eso es más de 15,000 plazas, mucho más allá del límite de 120.

Así es como los extraería todos:

  1. Divide Manhattan en cuadrículas. Lo dividiría en diferentes barrios o códigos postales. Por ejemplo:

    10021
    10022
    10023
    10075

    Y así sucesivamente para todos los códigos postales de Manhattan...

  2. Consultar cada grilla. Para cada código postal, haría una búsqueda de texto como:

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

    Eso devuelve los primeros 120 restaurantes en ese ZIP.

  3. Combina todos los resultados. Realizaría la búsqueda de cada código postal y luego combinaría todos los lugares en una gran lista de más de 15,000 restaurantes.

¿Ves cómo funciona eso? Al dividir áreas en segmentos más pequeños, puede recuperar 120 lugares por sección. Esto se amplía a cualquier número total de lugares.

Y nuevamente, es útil realizar estas búsquedas de cuadrícula en paralelo para una mayor velocidad. Me gusta usar Node.js para las secuencias de comandos.

Creando cuadrículas óptimas

Hay varias formas de dividir mapas en cuadrículas:

  • Por barrio o distrito
  • Usando códigos postales
  • Con límites específicos de latitud y longitud
  • Espaciado igual de 0.1 grados de latitud/longitud

Haga sus cuadrículas lo suficientemente pequeñas para maximizar los resultados por consulta. Pero no tan pequeño como para llegar a los mismos lugares repetidamente.

La compensación óptima depende del área total del mapa y de la densidad del lugar. Pero para la mayoría de las ciudades, las cuadrículas de 0.5 a 1 milla cuadrada funcionan bien.

Experimente con diferentes granularidades para ver qué ofrece los lugares más singulares.

La principal desventaja de la búsqueda en cuadrícula es la complejidad adicional de codificación para dividir áreas y combinar resultados. Las solicitudes paginadas son más sencillas de implementar.

Pero las mejoras en el rendimiento hacen que las redes valga la pena. He utilizado este método para extraer con éxito hasta 300,000 lugares de Google, mucho más allá del límite de 120.

Ahora veamos una opción aún más poderosa (pero delicada)...

Método 3: eliminar los resultados de búsqueda de Google Maps

La búsqueda de Google Maps arroja muchos más resultados de los que permiten sus API. Podemos aprovechar esto directamente raspando su sitio web.

Aquí están los pasos básicos:

  1. Busque una categoría de lugar en Google Maps, como "pizza en Chicago".

  2. Utilice un raspador web para extraer datos de los resultados renderizados.

  3. Itere a través de vistas de mapas y niveles de zoom para activar más lugares.

  4. Combine todos los datos extraídos en su conjunto de datos.

Esto le da acceso al índice completo de lugares de Google. El problema es que su sitio utiliza renderizado y paginación complejos de JavaScript.

Repasemos un ejemplo de arquitectura raspadora...

Primero, geocodifico la ubicación de búsqueda para obtener el punto central óptimo del mapa:

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

A continuación, abro el navegador y navego hasta la 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); 

Luego extraigo lugares de los resultados renderizados y los paginar según sea necesario:

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

Continuamente busco páginas adicionales y niveles de zoom hasta que tengo todos los resultados.

Como puede ver, esto requiere una meticulosa ingeniería inversa del código de interfaz. Pero la recompensa es el acceso a la base de datos completa de lugares de Google.

Pude extraer más de 500,000 lugares en California utilizando este tipo de raspador personalizado. Requiere trabajo, pero puede generar conjuntos de datos enormes.

Eliminando trampas

Aquí hay algunos consejos al raspar Google Maps:

  • Utilice Puppeteer en Node o Selenium en Python para la automatización del navegador.

  • Implemente retrasos aleatorios entre acciones para parecer "humano".

  • Gire los servidores proxy y falsifique encabezados para evitar la detección de bots.

  • Raspe de forma incremental y persista el estado para reanudar.

  • Paralelice entre navegadores para obtener resultados más rápidos.

El web scraping puede desbloquear conjuntos de datos de lugares enormes, pero también conlleva grandes desafíos. El uso de API es generalmente más limpio... lo que nos lleva a nuestra cuarta estrategia.

Método 4: aprovechar las API de lugares de terceros

Numerosas empresas ofrecen bases de datos de lugares alternativos con una cobertura más amplia que la de Google.

Por ejemplo:

  • Factual tiene datos sobre más de 100 millones de puntos de interés globales procedentes de varios proveedores, incluido Google.

  • Foursquare tiene más de 105 millones de lugares en su API de desarrollador.

  • Yelp tiene datos sobre millones de empresas locales a través de su API Fusion.

  • GeoNombres Tiene una base de datos abierta con más de 25 millones de características geográficas.

Todos ellos pueden complementar Google Places proporcionando conjuntos de datos más grandes.

Recientemente integré Factual en un proyecto para extraer en masa puntos de interés en todo Japón: ¡más de 5 millones de lugares! Mucho más allá de los límites de Google.

La desventaja es codificar y pagar por otro servicio. Pero para ciertos casos de uso, los datos de terceros pueden ser su mejor opción para grandes cantidades de lugares.

¿Qué método es mejor para usted?

Entonces, ¿qué enfoque debería utilizar para extraer millones de lugares de Google? ¡Eso depende!

Aquí están mis reglas generales:

  • Paginación – Para hasta unos miles de plazas adicionales.

  • Búsqueda de cuadrícula – Hasta los cientos de miles de lugares.

  • Raspado web – Millones de lugares pero técnicamente desafiantes.

  • API externas – Decenas de millones de plazas pero costes añadidos.

Considere también la urgencia con la que necesita los datos y qué atributos de lugar específicos necesita.

Encuentro que la mayoría de los proyectos encajan bien en la búsqueda de grillas para lograr un rendimiento óptimo frente a la simplicidad. Pero explora todas las opciones: ¡tienes muchas opciones!

Y combinar enfoques suele ser el más poderoso, como grids + scraping o Factual API + Google Places.

Los límites no pueden competir con sus ambiciones ávidas de datos.

Conclusiones clave y próximos pasos

Recapitulemos lo que aprendimos:

  • La API de Google Places te limita a 120 lugares por consulta... pero muchas aplicaciones necesitan muchos más datos.

  • Técnicas como la paginación, la búsqueda en cuadrícula y el web scraping pueden recuperar millones de lugares de Google.

  • Las API de lugares de terceros también proporcionan datos más completos.

  • Considere combinar diferentes métodos, como cuadrículas + raspado, para obtener resultados óptimos.

Ahora tienes una guía de experto para superar los límites de Google. El mundo de los datos de lugares es tuyo para explorar.

A continuación, dedique algo de tiempo a elegir el enfoque que mejor se adapte a su caso de uso y comience a implementar una solución.

¡No dudes en comunicarte con nosotros si tienes alguna otra pregunta! Siempre estaré feliz de ayudar a otros fanáticos de los datos geográficos.

¡Ahora libera todo el potencial de los datos de lugares para impulsar tu próximo proyecto cartográfico!

Únase a la conversación

Su dirección de correo electrónico no será publicada. Las areas obligatorias están marcadas como requeridas *