{
"cells": [
{
"cell_type": "markdown",
"id": "970521dd",
"metadata": {},
"source": [
"# Automação Web para Busca de Cotações de Moedas"
]
},
{
"cell_type": "markdown",
"id": "836b6f53",
"metadata": {},
"source": [
"## Entendendo a Situação Atual"
]
},
{
"cell_type": "markdown",
"id": "33933bab",
"metadata": {},
"source": [
"Você trabalha em uma importadora e precisa atualizar diariamente uma planiha do Excel com os custos de cada produto. Esses produtos podem ter seus valores vinculados as seguintes moedas:\n",
"\n",
"- Dólar\n",
"- Euro\n",
"- Ouro\n",
"\n",
"Para obter a cotação dessas moedas, fazemos buscas na internet. Com os valores das cotações podemos atualizar nossos preços de venda, considerando uma margem de contribuição."
]
},
{
"cell_type": "markdown",
"id": "88433d4b",
"metadata": {},
"source": [
"## Base de Dados"
]
},
{
"cell_type": "markdown",
"id": "587e4778",
"metadata": {},
"source": [
"O link para a base de dados está disponível no link logo abaixo:\n",
"\n",
"- https://drive.google.com/drive/folders/1KmAdo593nD8J9QBaZxPOG1yxHZua4Rtv?usp=sharing"
]
},
{
"cell_type": "markdown",
"id": "b0981445",
"metadata": {},
"source": [
"## Divisão do Problema"
]
},
{
"cell_type": "markdown",
"id": "5b0ded07",
"metadata": {},
"source": [
"1. Obter a cotação do dólar\n",
"2. Obter a cotação do euro\n",
"3. Obter a cotação do ouro\n",
"4. Atualizar a planilha com as cotações de cada moeda\n",
"5. Atualizar o preço de compra e o preço de venda de cada produto\n",
"6. Exportar a planilha atualizada"
]
},
{
"cell_type": "markdown",
"id": "b8303062",
"metadata": {},
"source": [
"## Criando e Configurando o Navegador"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "a6312155",
"metadata": {},
"outputs": [],
"source": [
"# Importa o webdriver a partir da biblioteca selenium\n",
"from selenium import webdriver\n",
"\n",
"# Importa o gerenciador do webdriver do Google Chrome\n",
"from webdriver_manager.chrome import ChromeDriverManager\n",
"\n",
"# Importa a classe Service\n",
"from selenium.webdriver.chrome.service import Service\n",
"\n",
"# Faz o download do webdriver do Google Chrome\n",
"servico = Service(ChromeDriverManager().install())\n",
"\n",
"# Cria um navegador do Google Chrome\n",
"navegador = webdriver.Chrome(service=servico)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "2da99e25",
"metadata": {},
"outputs": [],
"source": [
"# Importa o método de localização de elementos\n",
"from selenium.webdriver.common.by import By\n",
"\n",
"# Importa o Keys para escrevermos no navegador\n",
"from selenium.webdriver.common.keys import Keys"
]
},
{
"cell_type": "markdown",
"id": "a5344e5e",
"metadata": {},
"source": [
"## Solução"
]
},
{
"cell_type": "markdown",
"id": "ebad0929",
"metadata": {},
"source": [
"A função abaixa será chamada repetidas vezes para obtermos cotações de moedas."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "06273325",
"metadata": {},
"outputs": [],
"source": [
"def obter_cotacao_moeda(busca: str) -> float:\n",
" '''Obtém a cotação da moeda especificada'''\n",
" \n",
" # Acessa o site do Google\n",
" navegador.get('https://google.com')\n",
"\n",
" # Localiza o campo de pesquisa do Google via XPATH\n",
" campo_pesquisa = navegador.find_element(By.XPATH, r'/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input')\n",
"\n",
" # Escreve no campo de pesquisa\n",
" campo_pesquisa.send_keys(busca)\n",
"\n",
" # Dá enter no campo de busca\n",
" campo_pesquisa.send_keys(Keys.ENTER)\n",
"\n",
" # Obtém a cotação do dólar\n",
" cotacao = navegador.find_element(By.XPATH, r'//*[@id=\"knowledge-currency__updatable-data-column\"]/div[1]/div[2]/span[1]').get_attribute('data-value')\n",
" \n",
" # Retorna a cotação\n",
" return float(cotacao)"
]
},
{
"cell_type": "markdown",
"id": "10d90448",
"metadata": {},
"source": [
"A função abaixo será usada para obter a cotação do ouro."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "bc926f48",
"metadata": {},
"outputs": [],
"source": [
"def obter_cotacao_ouro():\n",
" '''Obtém a cotação do ouro'''\n",
" \n",
" # Acessa o site do Melhor Câmbio\n",
" navegador.get('https://www.melhorcambio.com/ouro-hoje')\n",
" \n",
" # Localiza o campo com a cotação do ouro\n",
" campo_cotacao_ouro = navegador.find_element(By.XPATH, r'//*[@id=\"comercial\"]')\n",
" \n",
" # Obtém o valor da cotação do ouro\n",
" cotacao_ouro = campo_cotacao_ouro.get_attribute('value')\n",
" \n",
" # Retorna o valor da cotação do ouro\n",
" return cotacao_ouro"
]
},
{
"cell_type": "markdown",
"id": "7f762c56",
"metadata": {},
"source": [
"### Obter a cotação do dólar"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "52398f8f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cotação do dólar: R$5.233274\n"
]
}
],
"source": [
"# Obtém a cotação do dólar\n",
"cotacao_dolar = obter_cotacao_moeda('cotação do dólar')\n",
"\n",
"# Exibe o valor da cotação do dólar\n",
"print(f'Cotação do dólar: R${cotacao_dolar}')"
]
},
{
"cell_type": "markdown",
"id": "de239445",
"metadata": {},
"source": [
"### Obter a cotação do euro"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "8c1820af",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cotação do euro: R$5.5827\n"
]
}
],
"source": [
"# Obtém a cotação do euro\n",
"cotacao_euro = obter_cotacao_moeda('cotação do euro')\n",
"\n",
"# Exibe o valor da cotação do euro\n",
"print(f'Cotação do euro: R${cotacao_euro}')"
]
},
{
"cell_type": "markdown",
"id": "43a12ee1",
"metadata": {},
"source": [
"### Obter a cotação do ouro"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "25959766",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cotação do ouro: R$310.42\n"
]
}
],
"source": [
"# Obtém a cotação do ouro\n",
"cotacao_ouro = obter_cotacao_ouro()\n",
"\n",
"# Substitui a vírgula pelo ponto\n",
"cotacao_ouro = cotacao_ouro.replace(',', '.')\n",
"\n",
"# Exibe o valor da cotação do ouro\n",
"print(f'Cotação do ouro: R${cotacao_ouro}')"
]
},
{
"cell_type": "markdown",
"id": "c2340fd0",
"metadata": {},
"source": [
"Dado que neste ponto já realizamos todas as buscas, podemos fechar o navegador:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "76607149",
"metadata": {},
"outputs": [],
"source": [
"navegador.quit()"
]
},
{
"cell_type": "markdown",
"id": "4fef3b14",
"metadata": {},
"source": [
"### Atualizar a planilha com as cotações de cada moeda"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "6a99c43a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Produtos | \n",
" Preço Original | \n",
" Moeda | \n",
" Cotação | \n",
" Preço de Compra | \n",
" Margem | \n",
" Preço de Venda | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Câmera Canon | \n",
" 999.99 | \n",
" Dólar | \n",
" 5 | \n",
" 4999.95 | \n",
" 1.40 | \n",
" 6999.930 | \n",
"
\n",
" \n",
" 1 | \n",
" Carro Renault | \n",
" 4500.00 | \n",
" Euro | \n",
" 6 | \n",
" 27000.00 | \n",
" 2.00 | \n",
" 54000.000 | \n",
"
\n",
" \n",
" 2 | \n",
" Notebook Dell | \n",
" 899.99 | \n",
" Dólar | \n",
" 5 | \n",
" 4499.95 | \n",
" 1.70 | \n",
" 7649.915 | \n",
"
\n",
" \n",
" 3 | \n",
" IPhone | \n",
" 799.00 | \n",
" Dólar | \n",
" 5 | \n",
" 3995.00 | \n",
" 1.70 | \n",
" 6791.500 | \n",
"
\n",
" \n",
" 4 | \n",
" Carro Fiat | \n",
" 3000.00 | \n",
" Euro | \n",
" 6 | \n",
" 18000.00 | \n",
" 1.90 | \n",
" 34200.000 | \n",
"
\n",
" \n",
" 5 | \n",
" Celular Xiaomi | \n",
" 480.48 | \n",
" Dólar | \n",
" 5 | \n",
" 2402.40 | \n",
" 2.00 | \n",
" 4804.800 | \n",
"
\n",
" \n",
" 6 | \n",
" Joia 20g | \n",
" 20.00 | \n",
" Ouro | \n",
" 350 | \n",
" 7000.00 | \n",
" 1.15 | \n",
" 8050.000 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Produtos Preço Original Moeda Cotação Preço de Compra Margem \\\n",
"0 Câmera Canon 999.99 Dólar 5 4999.95 1.40 \n",
"1 Carro Renault 4500.00 Euro 6 27000.00 2.00 \n",
"2 Notebook Dell 899.99 Dólar 5 4499.95 1.70 \n",
"3 IPhone 799.00 Dólar 5 3995.00 1.70 \n",
"4 Carro Fiat 3000.00 Euro 6 18000.00 1.90 \n",
"5 Celular Xiaomi 480.48 Dólar 5 2402.40 2.00 \n",
"6 Joia 20g 20.00 Ouro 350 7000.00 1.15 \n",
"\n",
" Preço de Venda \n",
"0 6999.930 \n",
"1 54000.000 \n",
"2 7649.915 \n",
"3 6791.500 \n",
"4 34200.000 \n",
"5 4804.800 \n",
"6 8050.000 "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Importa o pandas com o apelido pd\n",
"import pandas as pd\n",
"\n",
"# Importa a base de dados\n",
"df_produtos = pd.read_excel('Produtos.xlsx')\n",
"\n",
"# Exibe a base de dados\n",
"df_produtos"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "e59ea321",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Produtos | \n",
" Preço Original | \n",
" Moeda | \n",
" Cotação | \n",
" Preço de Compra | \n",
" Margem | \n",
" Preço de Venda | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Câmera Canon | \n",
" 999.99 | \n",
" Dólar | \n",
" 5.233274 | \n",
" 4999.95 | \n",
" 1.40 | \n",
" 6999.930 | \n",
"
\n",
" \n",
" 1 | \n",
" Carro Renault | \n",
" 4500.00 | \n",
" Euro | \n",
" 5.582700 | \n",
" 27000.00 | \n",
" 2.00 | \n",
" 54000.000 | \n",
"
\n",
" \n",
" 2 | \n",
" Notebook Dell | \n",
" 899.99 | \n",
" Dólar | \n",
" 5.233274 | \n",
" 4499.95 | \n",
" 1.70 | \n",
" 7649.915 | \n",
"
\n",
" \n",
" 3 | \n",
" IPhone | \n",
" 799.00 | \n",
" Dólar | \n",
" 5.233274 | \n",
" 3995.00 | \n",
" 1.70 | \n",
" 6791.500 | \n",
"
\n",
" \n",
" 4 | \n",
" Carro Fiat | \n",
" 3000.00 | \n",
" Euro | \n",
" 5.582700 | \n",
" 18000.00 | \n",
" 1.90 | \n",
" 34200.000 | \n",
"
\n",
" \n",
" 5 | \n",
" Celular Xiaomi | \n",
" 480.48 | \n",
" Dólar | \n",
" 5.233274 | \n",
" 2402.40 | \n",
" 2.00 | \n",
" 4804.800 | \n",
"
\n",
" \n",
" 6 | \n",
" Joia 20g | \n",
" 20.00 | \n",
" Ouro | \n",
" 310.420000 | \n",
" 7000.00 | \n",
" 1.15 | \n",
" 8050.000 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Produtos Preço Original Moeda Cotação Preço de Compra Margem \\\n",
"0 Câmera Canon 999.99 Dólar 5.233274 4999.95 1.40 \n",
"1 Carro Renault 4500.00 Euro 5.582700 27000.00 2.00 \n",
"2 Notebook Dell 899.99 Dólar 5.233274 4499.95 1.70 \n",
"3 IPhone 799.00 Dólar 5.233274 3995.00 1.70 \n",
"4 Carro Fiat 3000.00 Euro 5.582700 18000.00 1.90 \n",
"5 Celular Xiaomi 480.48 Dólar 5.233274 2402.40 2.00 \n",
"6 Joia 20g 20.00 Ouro 310.420000 7000.00 1.15 \n",
"\n",
" Preço de Venda \n",
"0 6999.930 \n",
"1 54000.000 \n",
"2 7649.915 \n",
"3 6791.500 \n",
"4 34200.000 \n",
"5 4804.800 \n",
"6 8050.000 "
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Atualiza os valores na coluna Cotação\n",
"df_produtos.loc[df_produtos['Moeda'] == 'Dólar', 'Cotação'] = float(cotacao_dolar)\n",
"df_produtos.loc[df_produtos['Moeda'] == 'Euro', 'Cotação'] = float(cotacao_euro)\n",
"df_produtos.loc[df_produtos['Moeda'] == 'Ouro', 'Cotação'] = float(cotacao_ouro)\n",
"\n",
"# Exibe o dataframe\n",
"df_produtos"
]
},
{
"cell_type": "markdown",
"id": "8878da3e",
"metadata": {},
"source": [
"### Atualizar o preço de compra e o preço de venda de cada produto"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "b140c164",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Produtos | \n",
" Preço Original | \n",
" Moeda | \n",
" Cotação | \n",
" Preço de Compra | \n",
" Margem | \n",
" Preço de Venda | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Câmera Canon | \n",
" 999.99 | \n",
" Dólar | \n",
" 5.233274 | \n",
" 5233.221667 | \n",
" 1.40 | \n",
" 7326.510334 | \n",
"
\n",
" \n",
" 1 | \n",
" Carro Renault | \n",
" 4500.00 | \n",
" Euro | \n",
" 5.582700 | \n",
" 25122.150000 | \n",
" 2.00 | \n",
" 50244.300000 | \n",
"
\n",
" \n",
" 2 | \n",
" Notebook Dell | \n",
" 899.99 | \n",
" Dólar | \n",
" 5.233274 | \n",
" 4709.894267 | \n",
" 1.70 | \n",
" 8006.820254 | \n",
"
\n",
" \n",
" 3 | \n",
" IPhone | \n",
" 799.00 | \n",
" Dólar | \n",
" 5.233274 | \n",
" 4181.385926 | \n",
" 1.70 | \n",
" 7108.356074 | \n",
"
\n",
" \n",
" 4 | \n",
" Carro Fiat | \n",
" 3000.00 | \n",
" Euro | \n",
" 5.582700 | \n",
" 16748.100000 | \n",
" 1.90 | \n",
" 31821.390000 | \n",
"
\n",
" \n",
" 5 | \n",
" Celular Xiaomi | \n",
" 480.48 | \n",
" Dólar | \n",
" 5.233274 | \n",
" 2514.483492 | \n",
" 2.00 | \n",
" 5028.966983 | \n",
"
\n",
" \n",
" 6 | \n",
" Joia 20g | \n",
" 20.00 | \n",
" Ouro | \n",
" 310.420000 | \n",
" 6208.400000 | \n",
" 1.15 | \n",
" 7139.660000 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Produtos Preço Original Moeda Cotação Preço de Compra Margem \\\n",
"0 Câmera Canon 999.99 Dólar 5.233274 5233.221667 1.40 \n",
"1 Carro Renault 4500.00 Euro 5.582700 25122.150000 2.00 \n",
"2 Notebook Dell 899.99 Dólar 5.233274 4709.894267 1.70 \n",
"3 IPhone 799.00 Dólar 5.233274 4181.385926 1.70 \n",
"4 Carro Fiat 3000.00 Euro 5.582700 16748.100000 1.90 \n",
"5 Celular Xiaomi 480.48 Dólar 5.233274 2514.483492 2.00 \n",
"6 Joia 20g 20.00 Ouro 310.420000 6208.400000 1.15 \n",
"\n",
" Preço de Venda \n",
"0 7326.510334 \n",
"1 50244.300000 \n",
"2 8006.820254 \n",
"3 7108.356074 \n",
"4 31821.390000 \n",
"5 5028.966983 \n",
"6 7139.660000 "
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Recalcula o preço de compra\n",
"df_produtos['Preço de Compra'] = df_produtos['Preço Original'] * df_produtos['Cotação']\n",
"\n",
"# Recalcula o preço de venda\n",
"df_produtos['Preço de Venda'] = df_produtos['Preço de Compra'] * df_produtos['Margem']\n",
"\n",
"# Exibe o dataframe\n",
"df_produtos"
]
},
{
"cell_type": "markdown",
"id": "644585fa",
"metadata": {},
"source": [
"### Exportar a planilha atualizada"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "c64b1e04",
"metadata": {},
"outputs": [],
"source": [
"# Exporta a planilha para o caminho especificado\n",
"df_produtos.to_excel('BaseProdutosAtualizada.xlsx', index=False)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.9"
},
"vscode": {
"interpreter": {
"hash": "f32abec95efd41eeb867b68655adb5a2214ae5c2494a5d4484c60756a8377293"
}
}
},
"nbformat": 4,
"nbformat_minor": 5
}