0% acharam este documento útil (0 voto)
33 visualizações16 páginas

Trabalho Python

Enviado por

rondipaper
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
33 visualizações16 páginas

Trabalho Python

Enviado por

rondipaper
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 16

Trabalho python

Aluno: Rondinelle Felipe Diogenes Nery​


Victor Ferreira de Lima Costa

Código:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import csv
import time
import re

🚀
print(" Iniciando o WebDriver...")
options = webdriver.ChromeOptions()
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)

🌐
print(" Acessando a página do Movidesk...")
driver.get("https://grupocasamagalhaes.movidesk.com/kb/form/7426/#")


print(" Esperando o campo 'Serviço' aparecer...")
espera = WebDriverWait(driver, 15)
dropdown_div = espera.until(
EC.element_to_be_clickable((By.XPATH, "//div[contains(@id,'jqxWidget') and
contains(@class,'jqx-widget')]"))
)

🖱️
print(" Clicando no campo 'Serviço'...")
dropdown_div.click()
time.sleep(3)

🧠
➡️
print("\n AGORA É COM VOCÊ:")

⏸️
print(" Expanda todos os grupos no navegador (níveis 1, 2, 3 e 4).")
input(" Pressione ENTER aqui quando tudo estiver expandido...")

🔍
# Coletar os itens da árvore
print(" Coletando itens visíveis...")
itens = driver.find_elements(By.CLASS_NAME, "jqx-tree-item-li")
caminho = ["", "", "", ""]
numeracao = ["", "", "", ""]
dados = []

# Contadores de cada nível


nivel1 = nivel2 = nivel3 = nivel4 = 0

for item in itens:


try:
driver.execute_script("arguments[0].scrollIntoView(true);", item)
time.sleep(0.05)

estilo = item.get_attribute("style")
match = re.search(r"margin-left:\s*(\d+)px", estilo)
if not match:
continue

margin = int(match.group(1))
nivel = margin // 18

div_texto = item.find_element(By.CLASS_NAME, "jqx-tree-item")


texto = div_texto.get_attribute("innerText").strip()

if not texto:
continue

# Atualiza caminho e reset de níveis abaixo


caminho[nivel] = texto
for i in range(nivel + 1, 4):
caminho[i] = ""

# Numeração
if nivel == 0:
nivel1 += 1
nivel2 = nivel3 = nivel4 = 0
elif nivel == 1:
nivel2 += 1
nivel3 = nivel4 = 0
elif nivel == 2:
nivel3 += 1
nivel4 = 0
elif nivel == 3:
nivel4 += 1

# Gerar código hierárquico


if nivel == 0:
cod = f"{nivel1}"
elif nivel == 1:
cod = f"{nivel1}.{nivel2}"
elif nivel == 2:
cod = f"{nivel1}.{nivel2}.{nivel3}"
elif nivel == 3:
cod = f"{nivel1}.{nivel2}.{nivel3}.{nivel4}"
else:
cod = ""

print(f"{cod} -", " > ".join([c for c in caminho if c]))


dados.append([cod] + caminho)

⚠️
except Exception as e:
print(f" Erro ao processar item: {e}")

💾
# Salvar CSV
print("\n Salvando em 'servicos_hierarquia.csv'...")
with open("servicos_hierarquia.csv", "w", newline="", encoding="utf-8") as arquivo:
writer = csv.writer(arquivo)
writer.writerow(["Código", "Nível 1", "Nível 2", "Nível 3", "Nível 4"])
writer.writerows(dados)


print(f"\n Finalizado! Total extraído: {len(dados)} registros")
driver.quit()
Trabalho Acadêmico: Extração de Dados com
Selenium e Python

Introdução
Este trabalho tem como objetivo demonstrar a aplicação da linguagem de programação
Python em conjunto com bibliotecas como Selenium, re, csv, time e webdriver-manager
para realizar a automação da coleta de dados estruturados em interfaces web
dinâmicas. Como exemplo prático, será apresentado um script que extrai automaticamente
a estrutura hierárquica da árvore de serviços da plataforma Movidesk, recurso
amplamente utilizado no setor de suporte técnico e atendimento ao cliente.

Durante o processo, a biblioteca Selenium é responsável por simular a navegação no


navegador, permitindo interações automáticas como o carregamento da página e a leitura
de elementos HTML. Para garantir a compatibilidade com o navegador instalado, utiliza-se a
biblioteca webdriver-manager, que gerencia automaticamente o download e atualização do
driver adequado (ChromeDriver). Como o conteúdo da árvore é carregado dinamicamente,
a biblioteca time é empregada para introduzir pausas estratégicas, assegurando que todos
os elementos estejam devidamente renderizados antes da coleta dos dados.

A estrutura hierárquica dos serviços é determinada por meio do valor do estilo


margin-left presente nos elementos HTML, o qual indica o nível de profundidade de
cada item. Para extrair esse valor numérico, a biblioteca re (expressões regulares) é
utilizada, possibilitando a identificação e o tratamento preciso dessas informações. Por fim,
os dados coletados são armazenados em um arquivo .csv por meio da biblioteca csv,
permitindo uma visualização tabular organizada e compatível com editores de planilhas
como Excel.

Este exemplo evidencia como o uso combinado dessas bibliotecas oferece uma solução
robusta, prática e escalável para tarefas de web scraping e automação de processos
repetitivos, com potencial aplicação em diversos contextos profissionais e acadêmicos.

Bibliotecas Utilizadas:

🕹 O que é o Selenium?
selenium é uma biblioteca que permite:

●​ Automatizar ações em navegadores (como Chrome, Firefox, Edge...)​

●​ Fazer testes automatizados de interface​


●​ Fazer web scraping em sites dinâmicos, onde o conteúdo só aparece depois do
carregamento (tipo com JavaScript)​

🚀 Exemplos do que dá pra fazer com Selenium:


●​ Abrir uma página​

●​ Preencher formulários​

●​ Clicar em botões​

●​ Rolar a página​

●​ Pegar textos, links, imagens​

●​ Baixar dados mesmo de sites que bloqueiam requests​

📦 Instalação
bash

pip install selenium

👉 E se for usar junto com webdriver-manager (recomendado):


bash
CopiarEditar
pip install webdriver-manager

✅ Exemplo básico: abrir o navegador e buscar no Google


python
CopiarEditar
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

navegador = webdriver.Chrome(ChromeDriverManager().install())
navegador.get("https://www.google.com")

caixa = navegador.find_element(By.NAME, "q")


caixa.send_keys("Python Selenium")
caixa.submit()

🔎 Métodos comuns com Selenium:


Comando O que faz

get("URL") Acessa a URL

find_element() / Encontra elementos HTML pelo seletor


find_elements()

.click() Clica em botão, link, etc.

.send_keys("texto") Digita em campos de formulário

.text Pega o texto de um elemento

.get_attribute("atributo" Pega valores de atributos (ex: href, style,


) src)

.execute_script(...) Executa JavaScript direto na página

🧩 Exemplo real no seu projeto (extraindo serviços com margin-left)


Você pode usar Selenium para:

1.​ Abrir a tela do Movidesk​

2.​ Navegar até a árvore de serviços​

3.​ Coletar os textos e estilos (style) com find_elements()​

4.​ Usar re para pegar o margin-left​

5.​ Usar isso para descobrir a hierarquia​

6.​ Salvar com csv​


Tudo isso junto, Selenium faz o papel de “abrir a página e te dar os dados” — como se
fosse você mexendo no mouse e teclado, só que automático!

Principais funcionalidades utilizadas:

webdriver.Chrome(): inicializa o navegador Google Chrome.

find_elements(), find_element(): localizam elementos HTML na página.

WebDriverWait e expected_conditions: esperam até que um elemento específico esteja


disponível na tela.

O que é webdriver-manager?

Quando você usa Selenium com Chrome, precisa de um programa chamado


ChromeDriver, que precisa ser compatível com a versão do seu navegador.

Antes, a gente precisava:

●​ Acessar o site do ChromeDriver​

●​ Baixar a versão certa​

●​ Colocar o executável na pasta do projeto​

●​ Atualizar manualmente quando o Chrome atualizava​

👉 Com o webdriver-manager, isso tudo é automático.

📦 Instalação (se ainda não tiver):


bash
CopiarEditar
pip install webdriver-manager

✅ Exemplo sem webdriver-manager (modo antigo, manual):


python
CopiarEditar
from selenium import webdriver
# Precisa já ter o chromedriver.exe no mesmo diretório
navegador = webdriver.Chrome(executable_path="chromedriver.exe")

Isso pode dar erro se a versão do ChromeDriver não for compatível.

✅ Exemplo com webdriver-manager (modo moderno, automático):


python
CopiarEditar
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

navegador = webdriver.Chrome(ChromeDriverManager().install())

💡 O que acontece nos bastidores:


●​ Ele verifica a versão do seu navegador​

●​ Baixa o ChromeDriver compatível​

●​ Salva em uma pasta do sistema​

●​ Usa esse caminho automaticamente​

✅ Versão mais moderna (com opções do navegador):


python
CopiarEditar
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")

servico = Service(ChromeDriverManager().install())
navegador = webdriver.Chrome(service=servico, options=options)
🧩 Quando usar no seu projeto?
Se você tá montando um script pra outras pessoas usarem (ou pra rodar em outro PC), o
webdriver-manager evita dor de cabeça com versão de navegador/driver. Ideal pra
manter a automação funcionando sem precisar configurar o ambiente toda hora.

📚 O que é a biblioteca csv?


A csv é usada para:

●​ 📥 Ler arquivos .csv (como se fossem tabelas)​


●​ 📤 Salvar dados em .csv (muito útil em scripts que coletam dados, tipo web
scraping)​

Um .csv é tipo isso aqui:

CopiarEditar
Nome,Idade,Cidade
Rondinelle,39,Fortaleza
Tatiane,38,Fortaleza

✅ Exemplo 1: Escrevendo um arquivo .csv


python
CopiarEditar
import csv

dados = [
["Nome", "Idade", "Cidade"],
["Rondinelle", 39, "Fortaleza"],
["Tatiane", 38, "Fortaleza"]
]

with open("pessoas.csv", mode="w", newline="", encoding="utf-8") as


arquivo:
escritor = csv.writer(arquivo)
escritor.writerows(dados)
print("Arquivo CSV criado com sucesso.")

writerows() escreve todas as linhas de uma vez​


newline="" evita linhas em branco extras no Windows​
encoding="utf-8" garante acentos e caracteres especiais certinhos

✅ Exemplo 2: Lendo um arquivo .csv


python
CopiarEditar
import csv

with open("pessoas.csv", mode="r", encoding="utf-8") as arquivo:


leitor = csv.reader(arquivo)
for linha in leitor:
print(linha)

Vai mostrar:

css
CopiarEditar
['Nome', 'Idade', 'Cidade']
['Rondinelle', '39', 'Fortaleza']
['Tatiane', '38', 'Fortaleza']

🧩 Exemplo prático no seu projeto: salvar árvore de serviços


Imagina que você extraiu dados com o Selenium como:

python
CopiarEditar
dados = [
["1", "Sistema"],
["1.1", "Categoria"],
["1.1.1", "Serviço"],
["1.1.1.1", "Subserviço"]
]

Você pode salvar assim:


python
CopiarEditar
import csv

with open("Hierarquia_Numerada.csv", mode="w", newline="",


encoding="utf-8") as arquivo:
escritor = csv.writer(arquivo)
escritor.writerow(["Numeração Hierárquica", "Descrição"])
escritor.writerows(dados)

⏱ O que é a biblioteca time?

time é uma biblioteca padrão do Python (não precisa instalar), usada para lidar com
tempo e pausas.

Ela serve pra:

●​ Aguardar um tempo (ex: esperar 2 segundos)​

●​ Saber quanto tempo algo demorou​

●​ Trabalhar com datas/horas (em segundos desde 1970, o famoso "timestamp")​

🧠 Exemplo prático mais comum: time.sleep(segundos)


É o que a gente mais usa quando precisa dar um tempo pro navegador carregar algo
antes de continuar o código.

✅ Exemplos simples
⏸ Exemplo 1: Esperar 2 segundos antes de continuar
python
CopiarEditar
import time

print("Carregando página...")
time.sleep(2)
print("Pronto!")
A função sleep(2) pausa o código por 2 segundos.

🧪 Exemplo 2: Medir tempo de execução


python
CopiarEditar
import time

inicio = time.time()

# Código a ser medido


for i in range(5):
print("Processando...", i)
time.sleep(1)

fim = time.time()
print(f"Tempo total: {fim - inicio:.2f} segundos")

🕵️ No contexto do Selenium
Quando você clica ou carrega uma página, os elementos podem demorar a aparecer. Pra
evitar erros, usamos o time.sleep() pra esperar um pouco antes de interagir com o
próximo item.

🧩 Exemplo com Selenium:


python
CopiarEditar
from selenium import webdriver
import time

navegador = webdriver.Chrome()
navegador.get("https://exemplo.com")

time.sleep(3) # Espera 3 segundos para garantir que a página


carregue

botao = navegador.find_element("id", "btn-iniciar")


botao.click()
⚠️ Atenção: time.sleep() é simples, mas não é o ideal para tudo
Se o site for muito rápido, sleep é desnecessário. Se for lento, pode precisar de mais
tempo. Por isso, para projetos mais robustos, usamos o WebDriverWait com condições
específicas — mas para coisas rápidas e diretas, o time.sleep() resolve bem.

📚 O que é a biblioteca re?


A re é a biblioteca de expressões regulares do Python. Ela permite buscar, verificar,
extrair ou substituir padrões em strings.

Expressões regulares são como "fórmulas" para encontrar trechos específicos dentro de
textos, usando símbolos especiais. Por exemplo:

●​ \d → representa um dígito (0 a 9)​

●​ \w → representa uma letra ou número (palavra)​

●​ . → representa qualquer caractere​

●​ +, *, ? → controlam quantas vezes um padrão aparece​

🧠 Usando re na prática
1. Importando a biblioteca
python
CopiarEditar
import re

✅ Exemplos simples para entender


🔍 Exemplo 1: Encontrar números em uma string
python
CopiarEditar
import re

texto = "O valor da margem é margin-left: 48px;"


resultado = re.search(r'margin-left:\s*(\d+)px', texto)
if resultado:
print("Valor encontrado:", resultado.group(1)) # Saída: 48

(\d+) → Significa: encontre 1 ou mais dígitos​


\s* → Significa: ignore espaços entre : e o número​
group(1) → é o valor capturado entre parênteses

🔄 Exemplo 2: Extrair todos os valores de margin-left de um texto


python
CopiarEditar
html = '''
<div style="margin-left: 0px;">Sistema</div>
<div style="margin-left: 16px;">Categoria</div>
<div style="margin-left: 32px;">Serviço</div>
'''

margens = re.findall(r'margin-left:\s*(\d+)px', html)

print(margens) # Saída: ['0', '16', '32']

re.findall → retorna todas as correspondências encontradas como uma


lista.

🔄 Exemplo 3: Substituir valores


python
CopiarEditar
texto = "Olá, meu e-mail é [email protected]"
novo_texto = re.sub(r'\S+@\S+', '[EMAIL REMOVIDO]', texto)

print(novo_texto) # Saída: Olá, meu e-mail é [EMAIL REMOVIDO]


💡 Resumo dos métodos mais usados da re
Método O que faz

search( Busca a primeira ocorrência


)

findall Retorna todas as ocorrências


()

sub() Substitui trechos com base na expressão


regular

match() Verifica se a string começa com o padrão

compile Pré-compila uma expressão para reuso


()

🧩 Exemplo real no seu projeto


Se você está varrendo um site com Selenium e extrai um atributo de estilo como esse:

html
CopiarEditar
<div style="margin-left: 32px;">Serviço</div>

Você pode usar o re para descobrir o nível de hierarquia com base no margin-left:

python
CopiarEditar
import re

estilo = 'margin-left: 32px;'


match = re.search(r'margin-left:\s*(\d+)', estilo)

if match:
margem = int(match.group(1))
nivel = margem // 16 # Ex: 32 // 16 = nível 2
print(f"Margin: {margem}px → Nível {nivel}")
Descrição do Funcionamento do Código
Inicialização do WebDriver

O script inicia o navegador Chrome por meio do webdriver.Chrome(), configurado com


suporte do ChromeDriverManager() para automatizar a instalação do driver.

Acesso à página do Movidesk

A página é aberta e o script espera até que o campo "Serviço" da árvore hierárquica esteja
visível e clicável.

Interação Manual

O usuário é instruído a expandir manualmente todos os níveis da árvore de serviços (do 1


ao 4), pois a página não permite fazer isso automaticamente.

Coleta de Dados

O código percorre todos os elementos da árvore (classe jqx-tree-item-li) e identifica o nível


hierárquico com base na margem esquerda (usando margin-left e divisão por 18 pixels).

Cada nível é contado separadamente (nivel1, nivel2, etc.) e gera-se um código numerado,
como 1.2.3.1.

O caminho completo é montado concatenando os textos dos níveis com > para formar a
descrição completa.

Gravação em Arquivo

Os dados são armazenados em um arquivo CSV ou Excel, com duas colunas:

Numeração Hierárquica: o código como 1.1.2

Descrição: representa o caminho completo do serviço, como Atendimento Milênio > Fiscal >
Certificado

Conclusão
O script desenvolvido demonstra o poder da automação com Python e Selenium para coleta
estruturada de dados em interfaces web dinâmicas. A abordagem permite transformar uma
árvore de serviços interativa em um arquivo utilizável para análise, relatórios ou integração
com outros sistemas.

Você também pode gostar