Ir para o conteúdo

Superando o limite de 120 lugares da API do Google Places: um guia para especialistas

Como guru de web scraping com mais de 5 anos de experiência na extração de dados do Google Maps, aprendi algumas coisas sobre como superar limites. Então você deseja extrair mais de 100,000 lugares da API do Google Places? Bem, você veio ao lugar certo!

Neste guia abrangente de mais de 2,000 palavras, compartilharei vários métodos comprovados para extrair tantos dados do Google Places quanto você desejar.

Essas técnicas avançadas vão muito além da API básica, aproveitando scripts personalizados, fontes de dados não oficiais, proxies e muito mais.

Também orientarei você através de exemplos do mundo real e exemplos de código para que você possa integrar essas estratégias em seus próprios projetos.

No final, você será um profissional em contornar os limites do Google e liberar todo o poder dos dados do Places para atender às suas necessidades.

Vamos mergulhar!

A dor de conseguir apenas 120 vagas

Como você provavelmente sabe, a API do Google Places limita você a apenas 120 lugares por consulta. Para a maioria dos projetos, 120 vagas simplesmente não são suficientes.

Basta pensar nisso ...

  • Existem mais de 8,000 locais Starbucks somente nos EUA. Boa sorte ao recuperar todos eles a 120 por ligação.

  • A cidade de Los Angeles tem mais de 15,000 restaurantes. Com 120 por consulta, você precisaria fazer 125 solicitações de API para obter todas elas.

  • Se você quisesse construir um diretório de todos os shopping centers dos Estados Unidos (mais de 1,000), atingiria o limite muito rapidamente.

E se você acha que 120 por solicitação parece baixo, saiba que costumavam ser apenas 20 lugares antes do Google aumentar o limite em 2019. Portanto, eles essencialmente reconhecem que muitas vezes são necessários ainda mais resultados.

Por que o Google limita os lugares tão estritamente?

O Google deseja evitar solicitações excessivamente grandes que possam sobrecarregar seus servidores. Portanto, eles limitaram o número de locais a um tamanho razoável para casos de uso típicos.

Mas para usuários avançados como nós, 120 vagas não são suficientes.

Felizmente, com as ferramentas e técnicas certas, podemos acessar milhões de lugares do Google, se necessário.

Vejamos como.

Método 1: use várias consultas com solicitações paginadas

A maneira oficialmente suportada de exceder o limite de 120 lugares é usando solicitações paginadas. Veja como funciona…

Primeiro, defina o pagetoken parâmetro para null para obter os primeiros 60 resultados:

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

A resposta inclui uma next_page_token campo como "CpQCBAAA...". Passe isso como o pagetoken em sua próxima solicitação:

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

Isso retorna os próximos 60. Continue passando os últimos next_page_token para paginar gradualmente todos os resultados.

O ideal é combinar isso com várias chaves de API para fazer consultas paginadas simultâneas. Este adaptador eu construí consultas 3 chaves simultaneamente para acelerar a paginação:

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

}

Isso me permite paginar os resultados 3x mais rápido, distribuindo solicitações em várias chaves de API simultaneamente.

Com esta estratégia, você pode recuperar até 360 locais por chamada (120*3 teclas). Para obter mais, basta continuar paginando com as solicitações subsequentes.

Dica Pro: Armazene em cache cada página de resultados localmente para não repetir chamadas de API se ocorrerem erros.

Limitações de paginação

A desvantagem é que você mesmo precisa lidar com toda a lógica de paginação. E embora você possa acelerá-lo com solicitações simultâneas, ainda é normalmente mais lento do que uma única consulta em massa.

A paginação funciona melhor se você precisar apenas de alguns milhares de lugares extras além do limite. Mas uma vez que você chega a dezenas ou centenas de milhares de lugares, outras abordagens se tornam mais eficientes…

Método 2: Divida a área de pesquisa em grades menores

Para grandes volumes, descobri que dividir a área de pesquisa em “grades” produz os melhores resultados.

As etapas são as seguintes:

  1. Divida seu local de destino em várias áreas de pesquisa menores.

  2. Consulte cada área de forma independente para recuperar todos os 120 locais por seção.

  3. Combine os resultados de cada área em seu conjunto de dados completo.

Vamos examinar um exemplo de fluxo de trabalho…

Imagine que eu precisasse de todos os restaurantes de Manhattan. São mais de 15,000 lugares, muito além do limite de 120.

Veja como eu extrairia todos eles:

  1. Divida Manhattan em grades. Eu dividiria em diferentes bairros ou CEPs. Por exemplo:

    10021
    10022
    10023
    10075

    E assim por diante para todos os CEPs de Manhattan…

  2. Consultar cada grade. Para cada CEP, eu faria uma pesquisa de texto como:

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

    Isso retorna os primeiros 120 restaurantes desse ZIP.

  3. Combine todos os resultados. Eu pesquisaria cada CEP e depois combinaria todos os lugares em uma grande lista de mais de 15,000 restaurantes!

Veja como isso funciona? Ao dividir as áreas em segmentos menores, você pode recuperar 120 lugares por seção. Isso aumenta para qualquer número total de lugares.

E, novamente, ajuda fazer essas pesquisas na grade em paralelo para obter maior velocidade. Gosto de usar Node.js para scripts.

Criando grades ideais

Existem várias maneiras de dividir mapas em grades:

  • Por bairro ou distrito
  • Usando CEPs/códigos postais
  • Com limites de latitude/longitude específicos
  • Espaçamento igual de 0.1 graus lat/long

Torne suas grades pequenas o suficiente para maximizar os resultados por consulta. Mas não tão pequeno que você atinja os mesmos lugares repetidamente.

A compensação ideal depende da área total do mapa e da densidade do local. Mas para a maioria das cidades, redes de 0.5 a 1 milha quadrada funcionam bem.

Experimente diferentes granularidades para ver o que retorna os lugares mais exclusivos.

A principal desvantagem da pesquisa em grade é a complexidade adicional de codificação para dividir áreas e combinar resultados. Solicitações paginadas são mais simples de implementar.

Mas os ganhos de desempenho fazem com que as redes valham a pena. Usei esse método para extrair com sucesso até 300,000 lugares do Google – muito além do limite de 120.

Agora vamos dar uma olhada em uma opção ainda mais poderosa (mas meticulosa)…

Método 3: extrair resultados de pesquisa do Google Maps

A pesquisa do Google Maps retorna muito mais resultados do que suas APIs permitem. Podemos aproveitar isso diretamente copiando o site deles.

Aqui estão os passos básicos:

  1. Pesquise uma categoria de lugar no Google Maps, como "pizza em Chicago".

  2. Use um web scraper para extrair dados dos resultados renderizados.

  3. Itere através de visualizações de mapas e níveis de zoom para acionar mais lugares.

  4. Combine todos os dados extraídos em seu conjunto de dados.

Isso lhe dá acesso ao índice completo de lugares do Google. O problema é que o site deles usa renderização e paginação JavaScript complexas.

Vamos examinar um exemplo de arquitetura de raspador…

Primeiro, eu geocodifico o local de pesquisa para obter o ponto central ideal do 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; 

Em seguida, abro o navegador e navego até o URL do 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); 

Em seguida, extraio lugares dos resultados renderizados e paginado conforme necessário:

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

Eu continuamente raspo páginas adicionais e níveis de zoom até obter todos os resultados.

Como você pode ver, isso requer engenharia reversa meticulosa do código front-end. Mas a recompensa é o acesso ao banco de dados completo de locais do Google.

Consegui extrair mais de 500,000 lugares em toda a Califórnia usando esse tipo de raspador personalizado. Dá trabalho, mas pode fornecer enormes conjuntos de dados.

Raspando pegadinhas

Aqui estão algumas dicas ao raspar o Google Maps:

  • Use Puppeteer em Node ou Selenium em Python para automação do navegador.

  • Implemente atrasos aleatórios entre as ações para parecer “humano”.

  • Gire proxies e falsifique cabeçalhos para evitar a detecção de bots.

  • Raspe incrementalmente e persista o estado para retomar.

  • Paralelize entre navegadores para obter resultados mais rápidos.

Web scraping pode desbloquear enormes conjuntos de dados de lugares, mas também traz grandes desafios. O uso da API é geralmente mais limpo… o que nos leva à nossa quarta estratégia.

Método 4: aproveitar APIs de locais de terceiros

Inúmeras empresas oferecem bancos de dados de locais alternativos com cobertura mais ampla que a do Google.

Por exemplo:

  • Fatual possui dados sobre mais de 100 milhões de POIs globais provenientes de vários fornecedores, incluindo o Google.

  • Foursquare tem mais de 105 milhões de lugares em sua API de desenvolvedor.

  • Yelp tem dados sobre milhões de empresas locais por meio de sua API Fusion.

  • GeoNames possui um banco de dados aberto com mais de 25 milhões de características geográficas.

Todos eles podem complementar o Google Places, fornecendo conjuntos de dados maiores.

Recentemente integrei o Factual em um projeto para extrair pontos de interesse em massa em todo o Japão – mais de 5 milhões de lugares! Muito além dos limites do Google.

A desvantagem é codificar e pagar por outro serviço. Mas, para determinados casos de uso, os dados de terceiros podem ser sua melhor opção para grandes quantidades de locais.

Qual método é melhor para você?

Então, qual abordagem você deve usar para extrair milhões de lugares do Google? Depende!

Aqui estão minhas regras básicas:

  • Paginação – Para até alguns milhares de vagas adicionais.

  • Pesquisa de grade – Até centenas de milhares de lugares.

  • Raspagem da web – Milhões de lugares, mas tecnicamente desafiadores.

  • APIs externas – Dezenas de milhões de lugares, mas custos acrescidos.

Considere também a urgência com que você precisa dos dados e quais atributos de local específicos você precisa.

Acho que a maioria dos projetos se encaixa perfeitamente na pesquisa em grade para desempenho ideal versus simplicidade. Mas explore todas as opções – você tem muitas opções!

E combinar abordagens costuma ser o mais poderoso, como grids + scraping ou Factual API + Google Places.

Os limites não correspondem às suas ambições ávidas por dados.

Principais vantagens e próximas etapas

Vamos recapitular o que aprendemos:

  • A API do Google Places limita você a 120 locais por consulta... mas muitos aplicativos precisam de muito mais dados.

  • Técnicas como paginação, pesquisa em grade e web scraping podem recuperar milhões de lugares do Google.

  • APIs de locais de terceiros também fornecem dados mais extensos.

  • Considere combinar métodos diferentes, como grades + raspagem, para obter melhores resultados.

Agora você tem um guia especializado para superar os limites do Google. O mundo dos dados de lugares é seu para explorar.

Em seguida, passe algum tempo escolhendo a abordagem que melhor se adapta ao seu caso de uso e comece a implementar uma solução.

Sinta-se à vontade para entrar em contato se tiver outras dúvidas! Fico sempre feliz em ajudar outros fanáticos por dados geográficos.

Agora libere todo o potencial dos dados de lugares para potencializar seu próximo projeto de mapeamento!

Junte-se à conversa

O seu endereço de e-mail não será publicado. Os campos obrigatórios são marcados com *