1
resposta

Web Scraping na página InfoMoney com python

Alguém pode me ajudar, por favor!!!

Este é meu primeiro web scraping, pra falar a verdade meu primeiro projeto em programação.

Este é o repositório: https://github.com/leandromartins36/acoes_nv

Preciso que os dados sejam exibidos como na imagem abaixo: porém são 6 empresas, e não consigui fazer o append das demais no dataframe do pandas. Utilizo o jupyter notebook.

Estão sendo lidas de um Arquivo Excel.

Empresas 0 ibovespa 1 caixa-seguridade-cxse3 2 bb-seguridade-bbse3 3 fundo-imobiliario-cxco11 4 porto-seguro-pssa3 5 sulamerica-sula11


import pandas as pd
import requests as rs
from bs4 import BeautifulSoup as bs
import ssl
from selenium import webdriver
from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options
import time
import pandas_datareader.data as web
#####################################    

navegador = webdriver.FirefoxProfile()
navegador.set_preference("browser.privatebrowsing.autostart", True)
firefox_options = Options()
firefox_options.add_argument("--headless")
navegador = webdriver.Firefox(
firefox_profile=navegador, options=firefox_options)
agente = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36'
headers = {'User-Agent': agente}
#####################################    
# percorre a requisição e captura o html de cada pagina
# dataframe vindo da planilha de empresas.
empresas_df = pd.read_excel('EmpresasInfomoney.xlsx')
url = "https://www.infomoney.com.br/cotacoes/"
tabelaResul = pd.DataFrame()
sigla_html = pd.DataFrame()
contador = 0
while (contador < len(empresas_df)):
    for empresa in empresas_df["Empresas"]:
        url_nv = ''.join([url, empresa, '/historico/'])
        # print(empresa)
        navegador.get(url_nv)
        time.sleep(5)
        conteudo = rs.get(url_nv, headers=headers)
        time.sleep(3)
        # encontra o elemento da pagina e grava na memoria os dados da tabela.
        tb_din = navegador.find_element_by_xpath(
            '//*[@id="quotes_history"]').get_attribute('outerHTML')
        sigla_html = navegador.find_element_by_xpath(
            '/html/body/div[4]/div/div[1]/div[1]/div/div[1]/h1')
        # , index_col="DATA" incluir após thousands para colocar a data como indice.
        pd_html = pd.read_html(tb_din, decimal=',', thousands='.')
        df = pd.DataFrame(pd_html[0])
        df['EMPRESA'] = sigla_html.text
        time.sleep(3)
        tabelaResul.append(df)
        contador += 1
        time.sleep(3)

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Oii Leandro, como você está?

Sinto muito pela demora em obter um retorno.

A forma como você está utilizando para adicionar os registros no dataframe está correto, porém tem um pequeno detalhe: a função pd.append não modifica a variável, mas sim retorna um novo objeto, por isso é necessário atribuir a chamada do append a uma variável, como mostro abaixo:

tabelaResul = tabelaResul.append(df)

De posse disso, se você efetuar o print desta variável irá visualizar todas as empresas que o scraping percorreu.

Uma observação sobre seu código é que a página de histórico da empresa fundo-imobiliario-cxco11 se difere das demais, portanto, ao percorrer essa empresa o seu código irá gerar um erro por não encontrar a tabela correspondente ao xpath.

Deixo como recomendação alguns cursos da plataforma sobre manipulação de dataframes:

Qualquer dúvida fico à disposição.

Grande abraço e bons estudos!