Scraper Google Maps com Python e Selenium: Guia Completo
Você precisa extrair as informações de 500 restaurantes, os e-mails de encanadores locais ou as avaliações de clientes de uma região? O Google Maps contém esses dados, mas baixá-los manualmente leva horas.
É aí que Python e Selenium entram em cena. Essas duas ferramentas permitem automatizar a extração de dados do Google Maps — mas exigem tempo, habilidades de programação e apresentam desafios técnicos significativos.
Este artigo mostra como funcionam Python e Selenium para scraping, os passos concretos para começar, as armadilhas a evitar e, acima de tudo: quando uma abordagem manual não é a solução certa.
Por que Python e Selenium para Google Maps?
O Google Maps não é uma simples página HTML estática. Os resultados são carregados dinamicamente: você digita uma pesquisa, as fichas aparecem gradualmente, você rola, outros resultados são carregados. É JavaScript em ação.
Três ferramentas podem extrair esses dados:
1. BeautifulSoup ou Requests Essas bibliotecas Python recuperam o código HTML bruto de uma página. Problema: elas não conseguem executar JavaScript. No Google Maps, você obtém uma página vazia.
2. Selenium O Selenium inicia um verdadeiro navegador (Chrome, Firefox) e simula cliques, rolagens e interações humanas. O JavaScript é executado. Você pode esperar que os resultados sejam carregados e, em seguida, extraí-los. É lento, mas funciona.
3. Puppeteer ou Playwright Ferramentas semelhantes ao Selenium, mais rápidas, mas menos documentadas para iniciantes.
Por que escolher Python + Selenium? - Python é fácil de aprender e muito documentado - Selenium funciona com todos os navegadores - Combinados, eles lidam com páginas dinâmicas sem API - Você tem controle total sobre o que extrai
Limitação chave: é lento. Extrair 1.000 resultados pode levar de 2 a 3 horas. E você corre o risco de bloqueios de IP, CAPTCHAs ou bans temporários.
Requisitos técnicos: o que instalar
Antes de escrever uma única linha de código, instale essas ferramentas.
1. Python (versão 3.8 ou superior)
Baixe de python.org. Durante a instalação, marque "Add Python to PATH" — isso é crucial para usar o Python na linha de comando.
Verifique a instalação:
python --version
Você deve ver Python 3.x.x.
2. Selenium
Abra seu terminal ou prompt de comando e digite:
pip install selenium
Pip (Python Package Manager) baixa e instala o Selenium automaticamente.
3. WebDriver para seu navegador
O Selenium não pode controlar um navegador sem um driver (WebDriver). A escolha mais comum é o Chrome.
Para o Chrome:
- Baixe ChromeDriver (deve corresponder à sua versão do Chrome)
- Descompacte o arquivo
- Anote o caminho completo do arquivo chromedriver (ex: /Users/nome/Downloads/chromedriver)
Alternativa simples: instale webdriver-manager para evitar gerenciar as versões manualmente:
pip install webdriver-manager
4. Bibliotecas adicionais
Para processar e exportar os dados:
pip install pandas requests beautifulsoup4
- Pandas: organiza os dados em tabelas (DataFrames)
- Requests: faz requisições HTTP (opcional aqui, mas útil)
- BeautifulSoup: analisa o HTML (opcional)
Verifique se tudo funciona:
python -c "import selenium; print(selenium.__version__)"
Você deve ver um número de versão (ex: 4.15.2).
Anatomia de um script Selenium para Google Maps
Aqui está a estrutura geral de um script de scraping do Google Maps:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
import time
import pandas as pd
# 1. Lançar o navegador
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
# 2. Acessar o Google Maps
driver.get("https://www.google.com/maps")
# 3. Pesquisar um termo
search_box = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "searchboxinput"))
)
search_box.send_keys("Restaurantes Paris")
search_box.send_keys(Keys.ENTER)
# 4. Aguardar os resultados
time.sleep(3)
# 5. Extrair os dados
results = []
result_elements = driver.find_elements(By.CLASS_NAME, "Nv2PK")
for element in result_elements:
try:
name = element.find_element(By.CLASS_NAME, "NrjWb").text
results.append({"name": name})
except:
pass
# 6. Exportar em CSV
df = pd.DataFrame(results)
df.to_csv("restaurantes.csv", index=False)
# 7. Fechar o navegador
driver.quit()
Vamos analisar cada etapa.
Etapa 1: Lançar o navegador
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
webdriver-manager baixa automaticamente a versão correta do ChromeDriver. Você não precisa fazer nada manualmente.
Alternativa sem webdriver-manager (se você baixou o ChromeDriver manualmente):
driver = webdriver.Chrome("/caminho/para/chromedriver")
Etapa 2: Acessar o Google Maps e pesquisar
driver.get("https://www.google.com/maps")
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Aguardar que a barra de pesquisa esteja visível
search_box = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "searchboxinput"))
)
# Digitar a pesquisa
search_box.send_keys("Encanadores Lyon")
# Pressionar Enter
from selenium.webdriver.common.keys import Keys
search_box.send_keys(Keys.ENTER)
# Aguardar que os resultados sejam carregados
time.sleep(3)
Por que WebDriverWait?
O Google Maps carrega os elementos dinamicamente. Se você tentar encontrar a barra de pesquisa antes que ela exista, o script falha. WebDriverWait aguarda até 10 segundos para que o elemento apareça.
Etapa 3: Extrair os nomes e endereços
# Encontrar todos os resultados (cada resultado é uma ficha de negócio)
result_elements = driver.find_elements(By.CLASS_NAME, "Nv2PK")
results = []
for element in result_elements:
try:
# Nome do negócio
name = element.find_element(By.CLASS_NAME, "NrjWb").text
# Endereço
address = element.find_element(By.CLASS_NAME, "Xs85Hc").text
# Avaliação (opcional)
try:
rating = element.find_element(By.CLASS_NAME, "MW4etd").text
except:
rating = "N/A"
results.append({
"name": name,
"address": address,
"rating": rating
})
except Exception as e:
print(f"Erro: {e}")
continue
print(f"Extraído {len(results)} resultados")
Seletores CSS: By.CLASS_NAME encontra elementos pela sua classe CSS. Os nomes de classe (Nv2PK, NrjWb) mudam regularmente no Google. Se o script não funcionar, abra o inspetor (F12) e encontre as classes corretas.
Etapa 4: Gerenciar a paginação
O Google Maps exibe cerca de 20 resultados por página. Para obter mais, você precisa rolar para baixo na lista.
# Encontrar o contêiner dos resultados
results_container = driver.find_element(By.CLASS_NAME, "m6QErb")
# Rolar 5 vezes (cada rolagem carrega ~20 resultados adicionais)
for _ in range(5):
driver.execute_script(
"arguments[0].scrollTop = arguments[0].scrollHeight",
results_container
)
time.sleep(2) # Aguardar que os resultados sejam carregados
# Extrair TODOS os resultados (agora que você rolou)
all_results = driver.find_elements(By.CLASS_NAME, "Nv2PK")
Atenção: rolar 5 vezes = ~100 resultados. Rolar 20 vezes = 400+ resultados e 2-3 minutos. É lento.
Etapa 5: Extrair as coordenadas (latitude/longitude)
O Google Maps armazena as coordenadas GPS na URL. Você pode recuperá-las clicando em uma ficha.
results = []
for element in result_elements:
try:
name = element.find_element(By.CLASS_NAME, "NrjWb").text
# Clicar no resultado para abrir a ficha detalhada
element.click()
time.sleep(1)
# Recuperar a URL (ela contém as coordenadas)
current_url = driver.current_url
# Formato: https://www.google.com/maps/place/.../@48.8566,2.3522,...
results.append({
"name": name,
"url": current_url
})
except Exception as e:
print(f"Erro: {e}")
As coordenadas estão na URL após /@ (latitude, longitude).
Etapa 6: Exportar os dados em CSV
import pandas as pd
# Converter em DataFrame
df = pd.DataFrame(results)
# Exportar em CSV
df.to_csv("resultados_google_maps.csv", index=False, encoding="utf-8")
print(f"✓ {len(results)} resultados exportados para resultados_google_maps.csv")
Abra o arquivo CSV no Excel ou Google Sheets.
Etapa 7: Fechar o navegador
driver.quit()
Sempre feche o navegador para liberar a memória.
Script completo: exemplo concreto
Aqui está um script funcional para extrair restaurantes de uma cidade:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
import time
import pandas as pd
# Lançar o navegador
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try:
# Acessar o Google Maps
driver.get("https://www.google.com/maps")
# Pesquisar restaurantes
search_box = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "searchboxinput"))
)
search_box.send_keys("Restaurantes Marseille")
search_box.send_keys(Keys.ENTER)
time.sleep(3)
# Rolar para carregar mais resultados
results_container = driver.find_element(By.CLASS_NAME, "m6QErb")
for _ in range(3):
driver.execute_script(
"arguments[0].scrollTop = arguments[0].scrollHeight",
results_container
)
time.sleep(2)
# Extrair os dados
results = []
result_elements = driver.find_elements(By.CLASS_NAME, "Nv2PK")
for element in result_elements[:50]: # Limitar a 50 para testar
try:
name = element.find_element(By.CLASS_NAME, "NrjWb").text
address = element.find_element(By.CLASS_NAME, "Xs85Hc").text
results.append({
"name": name,
"address": address
})
except:
pass
# Exportar
df = pd.DataFrame(results)
df.to_csv("restaurantes_marseille.csv", index=False, encoding="utf-8")
print(f"✓ {len(results)} restaurantes extraídos")
finally:
driver.quit()
Execute-o:
python scraper.py
Um navegador Chrome se abre, realiza a pesquisa e exporta os resultados.
Os verdadeiros desafios do scraping do Google Maps
O script funciona no seu computador. Mas em grande escala, você encontrará problemas.
1. Bloqueio por IP
Após 50-100 requisições do mesmo IP, o Google bloqueia você temporariamente. Você verá um CAPTCHA ou uma página de erro.
Soluções:
- Adicionar atrasos aleatórios entre as requisições (time.sleep(random.randint(2, 5)))
- Usar proxies ou uma VPN
- Distribuir as requisições ao longo de vários dias
2. CAPTCHA
O Google pode exibir um CAPTCHA para verificar se você é humano. O Selenium não pode resolvê-lo automaticamente (sem ferramentas externas pagas).
Soluções: - Aceitar que algumas requisições falhem - Usar serviços de resolução de CAPTCHA (caro e lento) - Scraping com moderação
3. Seletores CSS que mudam
O Google altera regularmente suas classes CSS. Nv2PK de hoje pode se tornar Abc123 amanhã. Seu script quebra.
Soluções: - Usar seletores XPath mais estáveis (mais complexos) - Verificar e atualizar o script todo mês - Monitorar os erros
4. Performance
Extrair 1.000 resultados = 50+ minutos. Extrair 10.000 = 8+ horas. É muito lento em comparação com ferramentas automatizadas.
5. Dados incompletos
Você obtém os nomes e endereços. Mas os e-mails, números de telefone, avaliações, tecnologias usadas? Você precisa clicar em cada ficha, esperar que ela carregue e, em seguida, extrair. É ainda mais lento.
6. Conformidade legal
Os Termos de Serviço do Google Maps proíbem o scraping automatizado. Você não corre o risco de processos, mas sua conta pode ser banida ou seu IP bloqueado permanentemente.
Quando Python + Selenium NÃO é a solução certa
O Selenium é poderoso, mas não é a ferramenta ideal para:
Extrair > 500 resultados regularmente Muito lento, muitos riscos de bloqueio.
Obter e-mails, telefones, avaliações, tecnologias O Selenium pode fazer isso, mas você teria que clicar em cada ficha. 1.000 fichas = 2-3 dias de scraping.
Dados atualizados mensalmente Você terá que reiniciar o script todo mês. Risco de bloqueio a cada execução.
Necessidade de dados enriquecidos Os dados brutos do Google Maps carecem de informações comerciais.
Sem habilidades em código Python + Selenium exigem depuração, manutenção e atualizações.
IBLead: a alternativa sem código
Se você precisa extrair rapidamente dados do Google Maps sem scraping, existe outra abordagem: usar uma base de dados pré-indexada.
IBLead é uma base de dados de mais de 5 milhões de negócios do Google Maps (França, Bélgica, Suíça, Canadá, Estados Unidos e mais de 10 outros países). Os dados são atualizados mensalmente — não há necessidade de scraping.
Você pesquisa por cidade, região, categoria e, em seguida, exporta em CSV com: - Nomes, endereços, telefones - E-mails (enriquecidos a partir do site) - Avaliações do Google (texto completo, notas, datas, autores) — exclusivo - Tecnologias detectadas (WordPress, Shopify, HubSpot, etc.) — exclusivo - Redes sociais, horários, coordenadas GPS
Comparação: Python + Selenium vs IBLead
Pronto para começar?
Aceda a todas as empresas do Google Maps, enriquecidas com emails e dados legais.
Experimente o IBLead gratuitamenteArtigos relacionados
10 Dicas Comprovadas para Fazer Clientes Deixarem Mais Avaliações no Google Maps
Aprenda 10 estratégias práticas para aumentar as avaliações no Google Maps. Táticas que realmente funcionam.
7 Erros de Cold Email para Evitar: Exemplos e Modelos
Evite esses 7 erros de cold email que matam as taxas de resposta. Exemplos reais, modelos AIDA e soluções comprovadas para melhor prospecção.
Dados do Google Maps para ABM: O Guia Estratégico Completo
Descubra como os dados do Google Maps para marketing baseado em contas geram 208% mais receita. Crie listas de alvos precisas com 50M+ empresas.