Í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.

scrpae google maps por selenium
Controle do Browser Cromado com Selênio

O que precisamos para construir o Rastejador

  1. Python 3+.
  2. Navegador cromado instalado.
  3. Selênio 3.141.0+ (pacote python).
  4. Driver cromado (para seu sistema operacional).
  5. 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.

google maps análise HTML
Encontrando XPath para Elementos que Queremos Console do Desenvolvedor

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.

Categorias: Pyhton

Vlad

Gerente de projetos Linkedin

Comentário de 0

Deixe um comentário

Espaço reservado para avatar