[Python] Extrair informações via python selenium do google maps [fechada]

Discussão em 'Python' iniciado por Stack, Outubro 20, 2024.

  1. Stack

    Stack Membro Participativo

    Estou tentando extrair informações do google maps de determinado lugares do país, informações essas como nome e numero de telefone de determinadas empresas, porém o google maps utiliza-se fortemente o javascript para gerar as suas informações da página, assim tornando-se dificil a minha busca dessas informações.. alguem poderia me ajudar nessa? segue o meu código abaixo

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.ui import WebDriverWait
    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.support import expected_conditions as EC
    from openpyxl import Workbook
    import re
    import pandas as pd
    from time import sleep

    class WebScraping:
    def __init__(self):
    options = webdriver.ChromeOptions()
    #options.add_argument('--headless=new')
    options.add_argument('--lang=pt-BR')
    options.add_argument('--disable-notifications')
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")
    options.add_argument("--remote-debugging-port=9222")
    service = webdriver.ChromeService(ChromeDriverManager().install())
    self.driver = webdriver.Chrome(options=options, service=service)
    self.driver.get("https://www.google.com.br/maps")
    self.dados = {}

    def iniciar_classes(self):
    self.navegar_maps()
    self.raspar_clientes()
    self.comparar_dados()
    self.criar_planilha(self.dados)

    def navegar_maps(self):
    self.pesquisar = input('Digite o que deseja pesquisar: ')
    try:
    campo_busca = WebDriverWait(self.driver, 30).until(
    EC.presence_of_element_located((By.XPATH, '//*[@id="searchboxinput"]')) #//*[@id="searchboxinput"]
    )

    campo_busca.send_keys(self.pesquisar)
    campo_busca.send_keys(Keys.RETURN)
    sleep(5)

    except Exception as e:
    print(f"Não foi possível acessar o elemento da página {e}")
    self.driver.quit()

    def raspar_clientes(self):
    tempo_scroll = 5

    rolar_pagina = self.driver.execute_script('return document.body.scrollHeight')
    while True:
    self.driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
    sleep(tempo_scroll)

    tamanho_pagina_atual = self.driver.execute_script('return document.body.scrollHeight')
    if tamanho_pagina_atual == rolar_pagina:
    break
    rolar_pagina = tamanho_pagina_atual

    try:
    div_principal = WebDriverWait(self.driver, 10).until(
    EC.presence_of_all_elements_located((By.XPATH, "//div[contains(@class, 'NrDZNb')]"))
    )
    for div in div_principal:

    try:
    nome_empresa = div.find_element(By.XPATH, ".//div[contains(@class, 'fontHeadlineSmall')]").text
    telefone = div.find_element(By.XPATH, ".//span[@class='Usd1k']").text
    self.dados[nome_empresa] = telefone
    print(f'{nome_empresa}: {telefone}')
    except Exception:
    print('Erro ao localizar o elemento!')

    except Exception as e:
    print('Não foi possivel coletar mais dados! error: {e}')
    break

    def comparar_dados(self):
    telefones_existentes = pd.read_excel('C:/Users/SAMSUNG/Desktop/Ciencia de dados/WebScraping/telefones.xlsx')

    telefones_existentes['TELEFONE1'] = telefones_existentes['TELEFONE1'].astype(str).apply(lambda x: re.sub(r'\D', '', x)) # trata os numeros removendo valores indevidos
    telefones_existentes['RAZAOSOCIAL'] = telefones_existentes['RAZAOSOCIAL'].astype(str).str.lower().str.strip()

    telefones_existentes_list = telefones_existentes[['TELEFONE1', 'RAZAOSOCIAL']].astype(str).values.flatten().tolist()
    telefones_existentes_set = set(telefones_existentes_list)

    deletar_titulos = []

    for titulo, tel in self.dados.items():
    titulo_str = str(titulo).lower().strip()
    tel_str = re.sub(r'\D', '', str(tel))

    if tel_str in telefones_existentes_set or titulo_str in telefones_existentes_set:
    deletar_titulos.append((titulo, tel))

    for titulo, tel in deletar_titulos:
    del self.dados[titulo, tel]

    print('-----------------------------------')
    print(f'Clientes removidos: {deletar_titulos}' )

    def criar_planilha(self, dados):
    wb = Workbook()
    ws = wb.active
    ws.title = 'Prospecção'
    ws.append(['Nome', 'Telefone'])
    for nome, telefone in dados.items():
    ws.append([nome, telefone])
    self.arquivo_excel = 'Prospecção.xlsx'
    wb.save(self.arquivo_excel)
    print(f'Salvo como: {self.arquivo_excel}!')

    self.driver.quit()

    start = WebScraping()
    start.iniciar_classes()

    Continue reading...

Compartilhe esta Página