<jupyter_start><jupyter_text>Automação Web e Busca de Informações com Python SobreNesse notebook é apresentado um projeto em python que realiza as seguintes tarefas:0. Entender o desafio proposto1. Buscar informações na Web2. Atualizar a base de dados Desafio> Trabalhamos em uma importadora e o preço dos nossos produtos é vinculado a cotação de:- Dólar- Euro- Ouro> Precisamos pegar na internet, de forma automática, a cotação desses 3 itens e saber quanto devemos cobrar pelos nossos produtos, considerando uma margem de contribuição que temos na nossa base de dados. AgradecimentoEsse projeto foi desenvolvido graças ao Profº Lira e a [hashtag](https://www.hashtagtreinamentos.com/) pela realização do evento intensivão de python.  01: Bibliotecas NecessáriasPara desenvolver esse programa iremos precisar das seguintes bibliotecas:1. [Pandas](https://pandas.pydata.org/pandas-docs/stable/getting_started/index.html): Para análise de dados2. [Selenium](https://selenium-python.readthedocs.io/): Para automação WEBRealizando a instalação no terminal:```shellpip install pandaspip install selenium```<jupyter_code>import pandas as pd                             # Pandas para análise de dados
from selenium import webdriver                  # Webdriver para navegação web
from selenium.webdriver.common.keys import Keys # Teclas como ENTER<jupyter_output><empty_output><jupyter_text>02: Buscando Informações na WebNessa etapa iremos coletar os dados da web utilizando o selenium.Obs: O plano poderia ser mais curto, mais ele foi propositalmente alongado para demonstrar as funcionalidades do selenium. O plano:1. Entrar no site do google2. Digitar "cotação dolar"3. Apertar ENTER para pesquisar4. Coletar a cotação informadaPorém isso só da certo para moedas, e ao pesquisar "cotação ouro" aparece um resultado diferente que é tirado de outro site, por isso nosso plano não funciona mais 😢. O plano B:1. Entrar no site do melhor cambio2. Pesquisar e clicar no ícone "Ouro Hoje"3. Mudar de aba do navegador4. Coletar a cotação informada<jupyter_code>nav = webdriver.Chrome()    # Inicia o driver do chrome

xpaths = {  # Armazena xpaths em um dicionário
    'google_input': '/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input',
    'cotacao': '//*[@id="knowledge-currency__updatable-data-column"]/div[1]/div[2]/span[1]',
    'icone_ouro': '//*[@id="commodity-hoje"]/tbody/tr[2]/td[2]/a/img',
}

def cotacao(moeda): # Função para pegar a cotação de uma moeda
    nav.get('https://www.google.com/')  # Abre o site do google
    nav.find_element_by_xpath(xpaths['google_input']).send_keys(f'cotação {moeda}') # Escreve a pesquisa
    nav.find_element_by_xpath(xpaths['google_input']).send_keys(Keys.ENTER)         # Pesquisa a cotação
    return nav.find_element_by_xpath(xpaths['cotacao']).get_attribute('data-value') # Retorna a cotação

cotacao_dolar = cotacao('dolar')    # Pega cotação do dolar
cotacao_euro = cotacao('euro')      # Pega cotação do euro

nav.get('https://www.melhorcambio.com/')    # Abre o site do melhor cambio

aba_original = nav.window_handles[0]        # Armazena a aba para um futuro switch

nav.find_element_by_xpath(xpaths['icone_ouro']).click() # Clina no ícone do ouro

aba_nova = nav.window_handles[1]            # Armazena a aba nova

nav.switch_to.window(aba_nova)              # Muda de aba para aba nova

cotacao_ouro = nav.find_element_by_id('comercial').get_attribute('value')   # Pega o valor do ouro

cotacao_ouro = cotacao_ouro.replace(",", ".")   # Troca vírgula por ponto

print(f'Ouro:{cotacao_ouro}\nEuro:{cotacao_euro}\nDolar:{cotacao_dolar}')   # Printa as cotações

nav.quit()  # Fecha o navegador<jupyter_output>Ouro:280.47
Euro:5.868913578000001
Dolar:4.9147<jupyter_text>03: Atualizando a Base de DadosAgora que nós conseguimos os valores atualizados das cotações, devemos fazer a atualização de nossa base de dados, para isso iremos usar o pandas. Vamos também aproveitar para fazer uma rápida checagem nos dados para verificar dados faltantes, tipagem errada ou preenchimento errado.<jupyter_code>produtos = pd.read_excel('data/Produtos.xlsx')

display(produtos)               # Exibe o DataFrame
print(produtos.info())          # Exibe metadados do DataFrame
print(produtos.isna().sum())    # Exibe número de valores faltantes por coluna<jupyter_output><empty_output><jupyter_text>Após o importe e checagem da base de dados devemos atualizar os valores antigos e persistir essas mudanças em uma planilha atualizada. Obs: A tipagem retirada da web é ``string``, devemos fazer um cast para float.<jupyter_code>produtos.loc[produtos['Moeda']=='Dólar', 'Cotação'] = float(cotacao_dolar)  # Atualiza cotação do dolar
produtos.loc[produtos['Moeda']=='Euro', 'Cotação'] = float(cotacao_euro)    # Atualiza cotação do euro
produtos.loc[produtos['Moeda']=='Ouro', 'Cotação'] = float(cotacao_ouro)    # Atualiza cotação do ouro

# Atualiza o preço base em real
produtos['Preço Base Reais'] = produtos['Cotação'] * produtos['Preço Base Original']
# Atualiza o preço final
produtos['Preço Final'] = produtos['Margem'] * produtos['Preço Base Reais']

display(produtos)   # Mostra tabela atualizada<jupyter_output><empty_output><jupyter_text>Finalmente persistimos a mudança na tabela em disco.<jupyter_code>produtos.to_excel("data/Produtos Atualizado.xlsx", index=False)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09688258353556095, 'fraction_numerical': 0.011013627030054134, 'mean_word_length': 5.006726457399103, 'pattern_counts': {'":': 0, '<': 20, '<?xml version=': 0, '>': 22, 'https://': 5, 'lorem ipsum': 0, 'www.': 3, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '74724', 'license': 'CNRI-Python', 'n_tokens_mistral': 2030, 'n_tokens_neox': 1942, 'n_words': 531, 'path': 'automacao-web.ipynb', 'repo_name': 'cassiofb-dev/projetos-intensivao-python', 'size': '5357'}