Índice
Usando Selênio na raspagem de dados é uma coisa bastante comum. Ele automatiza os navegadores e permite simular atividades reais do usuário para evitar o bloqueio. É especialmente útil ao raspar sites gerados dinamicamente por JavaScript, como o Google. Além disso, ajuda a evitar qualquer tipo de proteção contra rastejamento, pois basicamente simula o comportamento de clientes reais.
Neste artigo, você verá um tutorial passo a passo para desenvolver um raspador que poderá analisar os lugares do Google Maps sem ficar bloqueado mesmo depois de mais de 1000 páginas.
O que precisamos para construir o Rastejador
- Python 3+.
- Navegador cromado instalado.
- Selênio 3.141.0+ (pacote python).
- Driver cromado (para seu sistema operacional).
- Parsel ou qualquer outra biblioteca para extrair dados de HTML como a Beautiful Soup.
Tutorial passo a passo para construir o extrator do Google Maps
Baixar e salvar o ChromeDriver
Para usar Selenium com o Google Chrome você precisará vincular o código python ao navegador, usando ChromeDriver.
Baixe a versão do ChromeDriver que combina com a versão de seu navegador e tipo de SO. O número da versão de seu navegador ChromeDriver pode ser encontrado aqui: Chrom -> Ícone do menu (canto superior direito) -> Ajuda -> Sobre o Google Chrome.
Arquivo de cromedriver desarquivado e guarde-o em algum lugar em seu sistema (caminho para ele usaremos mais tarde). Neste exemplo tutorial, armazenamos o arquivo na pasta do projeto.
Instalar pacotes de Selênio e Parsel
Instale os pacotes Selenium e Parsel executando os seguintes comandos. Usaremos a Parsel mais tarde quando analisarmos o conteúdo a partir do HTML.
pip install selenium
pip install parsel # to extract data from HTML using XPath or CSS selectors
Inicializar e iniciar o Webdriver
Antes de inicializar o Webdriver, certifique-se de ter feito os passos anteriores e de ter o caminho para seu arquivo cromado. Inicialize o motorista através do seguinte código. Você deve ver a nova janela do Chrome aberta.
from selenium import webdriver
chromedrive_path = './chromedriver' # use the path to the driver you downloaded from previous steps
driver = webdriver.Chrome(chromedrive_path)
Em mac você pode ver o seguinte: "chromedriver não pode ser aberto porque o desenvolvedor não pode ser verificado". Para superar este controle-clique no seletor cromado no Finder, escolha Abrir no menu e depois clique em Abrir no diálogo que aparece. Você deve ver "ChromeDriver foi iniciado com sucesso" nas janelas abertas do terminal. Feche-a e depois disso, você poderá iniciar o ChromeDriver a partir de seu código.
Download da página do Google Maps
Uma vez que você inicia o motorista, você está pronto para abrir algumas páginas. Para abrir qualquer página, use o comando "get".
url = 'https://www.google.com/maps/search/bars+near+NY,+USA/@40.7443439,-74.0197995,13z'
driver.get(url)
Conteúdo da busca em mapas parciais
Assim que sua página for aberta, você verá a página na janela do seu navegador que é controlada pelo seu código python. Você pode executar o seguinte código para obter o conteúdo da página HTML do ChromeDriver.
page_content = driver.page_source
Para ver confortavelmente o conteúdo HTML, abra o console do desenvolvedor no Chrome abrindo o Menu Chrome no canto superior direito da janela do navegador e selecionando Mais Ferramentas > Ferramentas do Desenvolvedor. Agora você deve ser capaz de ver os elementos de sua página.

Você pode analisar o conteúdo da página HTML usando suas ferramentas de análise favoritas. Nós usaremos Parsel neste tutorial.
from parsel import Selector
response = Selector(page_content)
Iterate over listings e obtenha os dados de cada lugar.
results = []
for el in response.xpath('//div[contains(@aria-label, "Results for")]/div/div[./a]'):
results.append({
'link': el.xpath('./a/@href').extract_first(''),
'title': el.xpath('./a/@aria-label').extract_first('')
})
print(results)
Saída de lugares do Google Maps (abreviado).
[
{
'link': 'https://www.google.com/maps/place/Black+Iron+Burger/data=!4m5!3m4!1s0x89c259acf2c7299d:0x149a07481483ce!8m2!3d40.7542649!4d-73.990364?authuser=0&hl=en&rclk=1',
'title': 'Black Iron Burger'
},
{
'link': 'https://www.google.com/maps/place/Fools+Gold+NYC/data=!4m5!3m4!1s0x89c259846e633763:0x69420cb6024065f9!8m2!3d40.723028!4d-73.989794?authuser=0&hl=en&rclk=1',
'title': 'Fools Gold NYC'
},
{
'link': 'https://www.google.com/maps/place/11th+St.+Bar/data=!4m5!3m4!1s0x89c25976492b11ff:0x14f9cacdef3eb7c1!8m2!3d40.7280546!4d-73.9812525?authuser=0&hl=en&rclk=1',
'title': '11th St. Bar'
},
...
]
Pare o motorista quando o processo de extração estiver finalizado
É importante começar e parar o motorista antes e depois da raspagem de acordo. É o mesmo que você abriria e fecharia seu navegador antes e depois de navegar na Internet. Feche o motorista executando o seguinte código.
driver.quit()
Conclusão e Recomendações sobre o Raspador e o Raspador mais Robusto
Apesar da complicada estrutura HTML do Google Maps, com Selenium e um bom conhecimento dos seletores XPath e CSS, você pode alcançar resultados bastante bons na raspagem. Este método de usar um emulador de navegador deve protegê-lo de ser bloqueado. Entretanto, se você for escalar sua aplicação, você pode considerar o uso de proxies também, a fim de evitar alguns problemas inesperados.
Correndo em paralelo
É possível executar drivers em multiprocessamento (não em multithreading), mas cada driver consumirá uma CPU. Certifique-se de que você tenha o suficiente deles.
A melhor maneira de raspar o Google Maps em escala de empresa
Como a raspagem do Google pode ser um grande desafio, muitas empresas e grandes empresas querem começar a raspar milhões de páginas sem gastar tempo para desenvolver e manter seus próprios rastejadores.
A maneira mais fácil de começar a raspar o Google Maps é usando Plataforma Outscraper (para obter resultados em arquivos CSV), APIou SDKs (para integrar em código).
A maneira mais fácil de começar a usar o Google Maps Scraping
Instale o SDK do Outscraper executando o seguinte comando.
pip install google-services-api
Inicializar o cliente e pesquisar por listagens no Google ou analisar listas específicas, enviando identificações de locais.
* você pode obter o token API (SECRET_API_KEY) no página do perfil
from outscraper import ApiClient
api_client = ApiClient(api_key='SECRET_API_KEY')
# Search for businesses in specific locations:
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')
# Get data of the specific place by id
result = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='en')
# Search with many queries (batching)
result = api_client.google_maps_search([
'restaurants brooklyn usa',
'bars brooklyn usa',
], language='en')
print(result)
Saída de resultados (abreviada).
[
[
{
"name": "Colonie",
"full_address": "127 Atlantic Ave, Brooklyn, NY 11201",
"borough": "Brooklyn Heights",
"street": "127 Atlantic Ave",
"city": "Brooklyn",
"postal_code": "11201",
"country_code": "US",
"country": "United States of America",
"us_state": "New York",
"state": "New York",
"plus_code": null,
"latitude": 40.6908464,
"longitude": -73.9958422,
"time_zone": "America/New_York",
"popular_times": null,
"site": "http://www.colonienyc.com/",
"phone": "+1 718-855-7500",
"type": "American restaurant",
"category": "restaurants",
"subtypes": "American restaurant, Cocktail bar, Italian restaurant, Organic restaurant, Restaurant, Wine bar",
"posts": null,
"rating": 4.6,
"reviews": 666,
"reviews_data": null,
"photos_count": 486,
"google_id": "0x89c25a4590b8c863:0xc4a4271f166de1e2",
"place_id": "ChIJY8i4kEVawokR4uFtFh8npMQ",
"reviews_link": "https://search.google.com/local/reviews?placeid=ChIJY8i4kEVawokR4uFtFh8npMQ&q=restaurants+brooklyn+usa&authuser=0&hl=en&gl=US",
"reviews_id": "-4277250731621359134",
"photo": "https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w800-h500-k-no",
"street_view": "https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w1600-h1000-k-no",
"working_hours_old_format": "Monday: 5\\u20139:30PM | Tuesday: Closed | Wednesday: Closed | Thursday: 5\\u20139:30PM | Friday: 5\\u20139:30PM | Saturday: 11AM\\u20133PM,5\\u20139:30PM | Sunday: 11AM\\u20133PM,5\\u20139:30PM",
"working_hours": {
"Monday": "5\\u20139:30PM",
"Tuesday": "Closed",
"Wednesday": "Closed",
"Thursday": "5\\u20139:30PM",
"Friday": "5\\u20139:30PM",
"Saturday": "11AM\\u20133PM,5\\u20139:30PM",
"Sunday": "11AM\\u20133PM,5\\u20139:30PM"
},
"business_status": "OPERATIONAL",
},
"reserving_table_link": "https://resy.com/cities/ny/colonie",
"booking_appointment_link": "https://resy.com/cities/ny/colonie",
"owner_id": "114275131377272904229",
"verified": true,
"owner_title": "Colonie",
"owner_link": "https://www.google.com/maps/contrib/114275131377272904229",
"location_link": "https://www.google.com/maps/place/Colonie/@40.6908464,-73.9958422,14z/data=!4m8!1m2!2m1!1sColonie!3m4!1s0x89c25a4590b8c863:0xc4a4271f166de1e2!8m2!3d40.6908464!4d-73.9958422"
...
},
...
]
]
Extra: A maneira mais fácil de começar a usar o Google Reviews Scraping
Você pode extrair revisões executando o seguinte código (assumindo que você tenha instalado o pacote python e iniciado o cliente).
# Get reviews of the specific place by id
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='en')
# Get reviews for places found by search query
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='en')
# Get only new reviews during last 24 hours
from datetime import datetime, timedelta
yesterday_timestamp = int((datetime.now() - timedelta(1)).timestamp())
result = api_client.google_maps_reviews(
'ChIJrc9T9fpYwokRdvjYRHT8nI4', sort='newest', cutoff=yesterday_timestamp, reviewsLimit=100, language='en')
Saída de resultados (abreviada).
{
"name": "Memphis Seoul",
"address": "569 Lincoln Pl, Brooklyn, NY 11238, \\u0421\\u043f\\u043e\\u043b\\u0443\\u0447\\u0435\\u043d\\u0456 \\u0428\\u0442\\u0430\\u0442\\u0438",
"address_street": "569 Lincoln Pl",
"owner_id": "100347822687163365487",
"owner_link": "https://www.google.com/maps/contrib/100347822687163365487",
...
"reviews_data": [
{
"google_id": "0x89c25bb5950fc305:0x330a88bf1482581d",
"autor_link": "https://www.google.com/maps/contrib/112314095435657473333?hl=en-US",
"autor_name": "Eliott Levy",
"autor_id": "112314095435657473333",
"review_text": "Very good local comfort fusion food ! \\nKimchi coleslaw !! Such an amazing idea !",
"review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s112314095435657473333!2s0x0:0x330a88bf1482581d?hl=en-US",
"review_rating": 5,
"review_timestamp": 1560692128,
"review_datetime_utc": "06/16/2019 13:35:28",
"review_likes": null
},
{
"google_id": "0x89c25bb5950fc305:0x330a88bf1482581d",
"autor_link": "https://www.google.com/maps/contrib/106144075337788507031?hl=en-US",
"autor_name": "fenwar1",
"autor_id": "106144075337788507031",
"review_text": "Great wings with several kinds of hot sauce. The mac and cheese ramen is excellent.\\nUPDATE:\\nReturned later to try the meatloaf slider, a thick meaty slice topped with slaw and a fantastic sauce- delicious. \\nConsider me a regular.\\ud83d\\udc4d",
"review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s106144075337788507031!2s0x0:0x330a88bf1482581d?hl=en-US",
"review_rating": 5,
"review_timestamp": 1571100055,
"review_datetime_utc": "10/15/2019 00:40:55",
"review_likes": null
},
...
]
}
Perguntas frequentes
Perguntas e respostas mais frequentes
Graças ao SDK do Outscraper, é possível raspar os dados do Google Maps com o Python Selenium. Confira a documentação API do Outscraper Google Maps Places para ver o que você pode fazer.
Usando Python e Selenium, é possível automatizar o processo de raspagem de dados do Google Maps. O Outscraper oferece um API Places do Google Maps e SDKs que simplificam esta tarefa.
É possível automatizar a raspagem do Google Maps usando Python e Selenium. Outscraper Google Maps Places API e SDKs permitem que você faça isso da maneira mais fácil.
Comentário de 0