{ "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ProdutosPreço OriginalMoedaCotaçãoPreço de CompraMargemPreço de Venda
0Câmera Canon999.99Dólar54999.951.406999.930
1Carro Renault4500.00Euro627000.002.0054000.000
2Notebook Dell899.99Dólar54499.951.707649.915
3IPhone799.00Dólar53995.001.706791.500
4Carro Fiat3000.00Euro618000.001.9034200.000
5Celular Xiaomi480.48Dólar52402.402.004804.800
6Joia 20g20.00Ouro3507000.001.158050.000
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ProdutosPreço OriginalMoedaCotaçãoPreço de CompraMargemPreço de Venda
0Câmera Canon999.99Dólar5.2332744999.951.406999.930
1Carro Renault4500.00Euro5.58270027000.002.0054000.000
2Notebook Dell899.99Dólar5.2332744499.951.707649.915
3IPhone799.00Dólar5.2332743995.001.706791.500
4Carro Fiat3000.00Euro5.58270018000.001.9034200.000
5Celular Xiaomi480.48Dólar5.2332742402.402.004804.800
6Joia 20g20.00Ouro310.4200007000.001.158050.000
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ProdutosPreço OriginalMoedaCotaçãoPreço de CompraMargemPreço de Venda
0Câmera Canon999.99Dólar5.2332745233.2216671.407326.510334
1Carro Renault4500.00Euro5.58270025122.1500002.0050244.300000
2Notebook Dell899.99Dólar5.2332744709.8942671.708006.820254
3IPhone799.00Dólar5.2332744181.3859261.707108.356074
4Carro Fiat3000.00Euro5.58270016748.1000001.9031821.390000
5Celular Xiaomi480.48Dólar5.2332742514.4834922.005028.966983
6Joia 20g20.00Ouro310.4200006208.4000001.157139.660000
\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 }