1
resposta

[Projeto] [Dúvida] web scraping com Python

Estou tentando fazer uma função para buscar os dados dos fundos de investimentos no site da CVM para poder analisar.

Porém não estou conseguindo prosseguir com o código.

import pandas as pd
import requests

date = '202301'
url = f'https://dados.cvm.gov.br/dados/FI/DOC/INF_DIARIO/DADOS/inf_diario_fi_{date}.zip'

def busca_informes(date):
  resposta = requests.get(url)
  return pd.read_csv(resposta, sep=';', compression='zip')

informes_diários = busca_informes(date)
informes_diários

Quando tento executar o informes diários aparece o seguinte erro:


ValueError                                Traceback (most recent call last)
<ipython-input-7-a4085b83905a> in <module>
----> 1 informes_diários = busca_informes(date)
      2 informes_diários


9 frames
/usr/local/lib/python3.8/dist-packages/pandas/io/common.py in _get_filepath_or_buffer(filepath_or_buffer, encoding, compression, mode, storage_options)
    394     if not is_file_like(filepath_or_buffer):
    395         msg = f"Invalid file path or buffer object type: {type(filepath_or_buffer)}"
    --> 396         raise ValueError(msg)
    397 
   398     return IOArgs(

** ValueError: Invalid file path or buffer object type: <class 'requests.models.Response'> **

Alguém conseguiria me auxiliar para prosseguir com meu projeto?

Grato pela atenção!

1 resposta

Olá, Paulo! Tudo bom? Espero que sim!

Na função busca_informes, você está passando um parâmetro date que não é utilizado em momento algum, observe que a variável url não vai ser alterada caso mudemos ele.

def busca_informes(date):
  resposta = requests.get(url)
  return pd.read_csv(resposta, sep=';', compression='zip')

Outro possível problema que encontrei é a resposta do requests.get(url). Se nós verificarmos o que essa linha em específico oferece de saída, temos a seguinte resposta:

import requests

requisicao = requests.get(url)
requisicao
<Response [200]>

E o código acima indica que deu tudo certo em acessar o site, mas não tem informação suficiente para o Pandas localizar o material que você quer fazer o Download. Então ou passamos diretamente o link do material que vamos indicar para o Pandas fazer o Download, ou analisados a página HTML dessa variável requisicao (Usando BeautifulSoup ou equivalente). Felizmente o primeiro caso é suficiente, e podemos transformar o nosso código com a função busca_informes() em:

import pandas as pd

def busca_informes(date):
    url = f'https://dados.cvm.gov.br/dados/FI/DOC/INF_DIARIO/DADOS/inf_diario_fi_{date}.zip'
    return pd.read_csv(url, sep=';', compression='zip')

date = '202301'
df = busca_informes(date)

E podemos verificar a saída:

df.head(5)
TP_FUNDOCNPJ_FUNDODT_COMPTCVL_TOTALVL_QUOTAVL_PATRIM_LIQCAPTC_DIARESG_DIANR_COTST
0FI00.017.024/0001-532023-01-021.10184e+0630.97441.10483e+06001
1FI00.017.024/0001-532023-01-031.10241e+0630.98891.10535e+06001
2FI00.017.024/0001-532023-01-041.10299e+0631.00331.10586e+06001
3FI00.017.024/0001-532023-01-051.10356e+0631.01731.10636e+06001
4FI00.017.024/0001-532023-01-061.10379e+0631.03081.10685e+06001

Se ainda tiver alguma dúvida, estou por aqui. Ótimos estudos e grande abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Não é necessário fechar o tópico, outras pessoas podem ser ajudadas por ele :D