Web scraper moderno e robusto para captura de dados financeiros da ANBIMA (AssociaΓ§Γ£o Brasileira das Entidades dos Mercados Financeiro e de Capitais)
- VisΓ£o Geral
- Funcionalidades
- InstalaΓ§Γ£o
- Uso RΓ‘pido
- DocumentaΓ§Γ£o Detalhada
- Estrutura do Projeto
- ContribuiΓ§Γ£o
- LicenΓ§a
O ANBIMA Scraper Γ© uma ferramenta Python moderna e robusta para capturar dados financeiros do site da ANBIMA. O projeto foi completamente refatorado aplicando as melhores prΓ‘ticas de desenvolvimento, incluindo:
- β Arquitetura orientada a objetos com classes bem estruturadas
- β Sistema de logging robusto com diferentes nΓveis e outputs
- β Tratamento de erros avanΓ§ado com retry automΓ‘tico
- β Interface de linha de comando (CLI) intuitiva
- β ConfiguraΓ§Γ£o centralizada e flexΓvel
- β Type hints para melhor desenvolvimento
- β Testes automatizados (estrutura preparada)
- β DocumentaΓ§Γ£o completa com docstrings
- Estrutura modular: CΓ³digo organizado em mΓ³dulos especΓficos
- ReutilizaΓ§Γ£o: Classe base
BaseScraper
com funcionalidades comuns - Robustez: Cliente HTTP com retry e rotaΓ§Γ£o de user agents
- Flexibilidade: ConfiguraΓ§Γ£o via arquivos e variΓ‘veis de ambiente
- Monitoramento: Logs detalhados para troubleshooting
- Performance: Download apenas de dados novos
Scraper | Status | DescriΓ§Γ£o | Dados Capturados |
---|---|---|---|
Indicators | β Completo | Indicadores financeiros | SELIC, CDI, IPCA, IGP-M, DΓ³lar, Euro, TR, TBF, FDS |
IDKA | β Completo | Γndice de DuraΓ§Γ£o Constante ANBIMA | Retornos, volatilidade, taxas de juros |
IMA Carteiras | π Estrutura | Carteiras teΓ³ricas IMA | ComposiΓ§Γ£o de carteiras |
IMA Quadro Resumo | π Estrutura | Quadro resumo IMA | Resultados diΓ‘rios |
Curvas de Juros | π Estrutura | Curvas de juros fechamento | Curvas zero-cupom |
DebΓͺntures | π Estrutura | Mercado secundΓ‘rio de debΓͺntures | Taxas mΓ©dias |
- VerificaΓ§Γ£o automΓ‘tica: Detecta dados existentes e baixa apenas o necessΓ‘rio
- Processamento seguro: Limpeza automΓ‘tica de dados invΓ‘lidos
- DeduplicaΓ§Γ£o: Remove registros duplicados automaticamente
- OrdenaΓ§Γ£o: Organiza dados por data de referΓͺncia
- ValidaΓ§Γ£o: Verifica integridade dos dados baixados
- Logs estruturados: Rastreamento completo das operaΓ§Γ΅es
- Python 3.8 ou superior
- pip (gerenciador de pacotes Python)
# Clone o repositΓ³rio
git clone https://github.com/royopa/anbima_scraper.git
cd anbima_scraper
# Instale as dependΓͺncias
pip install -r requirements.txt
# Clone o repositΓ³rio
git clone https://github.com/royopa/anbima_scraper.git
cd anbima_scraper
# Instale em modo desenvolvimento
pip install -e .
# Instale dependΓͺncias de desenvolvimento
pip install -r requirements.txt
-
Crie os diretΓ³rios necessΓ‘rios (criados automaticamente):
mkdir -p data/raw data/processed logs
-
Configure arquivos opcionais:
user-agents.txt
: Lista de user agents para rotaΓ§Γ£oANBIMA.txt
: Arquivo de feriados da ANBIMA
# Executar todos os scrapers
python -m anbima_scraper run-all
# Executar apenas indicadores
python -m anbima_scraper run indicators
# Executar mΓΊltiplos scrapers
python -m anbima_scraper run indicators idka
# ForΓ§ar atualizaΓ§Γ£o (mesmo se dados existirem)
python -m anbima_scraper run-all --force
# Verificar status dos scrapers
python -m anbima_scraper status
# Listar scrapers disponΓveis
python -m anbima_scraper list
from anbima_scraper import ANBIMAScraper
# Criar instΓ’ncia do scraper
scraper = ANBIMAScraper()
# Executar todos os scrapers
results = scraper.run_all()
# Executar scraper especΓfico
success = scraper.run_scraper("indicators")
# Verificar status
status = scraper.get_scraper_status()
# Executar mΓΊltiplos scrapers
results = scraper.run_multiple(["indicators", "idka"])
#!/usr/bin/env python3
"""
Exemplo completo de uso do ANBIMA Scraper.
"""
from anbima_scraper import ANBIMAScraper
def main():
# Criar instΓ’ncia
scraper = ANBIMAScraper()
# Verificar status atual
print("Status atual:")
status = scraper.get_scraper_status()
for name, last_date in status.items():
date_str = last_date.strftime("%Y-%m-%d") if last_date else "Sem dados"
print(f" {name}: {date_str}")
# Executar scrapers
print("\nExecutando scrapers...")
results = scraper.run_all()
# Mostrar resultados
print("\nResultados:")
for name, success in results.items():
status = "β" if success else "β"
print(f"{status} {name}")
if __name__ == "__main__":
main()
O projeto usa configuraΓ§Γ£o centralizada em src/anbima_scraper/config/settings.py
:
# URLs da ANBIMA
ANBIMA_URLS = {
"indicators": "https://www.anbima.com.br/informacoes/indicadores/",
"idka": "http://www.anbima.com.br/informacoes/idka/IDkA-down.asp",
# ... outras URLs
}
# ConfiguraΓ§Γ΅es de requisiΓ§Γ£o
REQUEST_SETTINGS = {
"timeout": 30,
"max_retries": 3,
"retry_delay": 1,
# ... outras configuraΓ§Γ΅es
}
data_referencia,data_captura,indice,descricao,valor
2023-12-15,2023-12-15,selic,Taxa SELIC do BC2,13.75
2023-12-15,2023-12-15,cdi,DI-CETIP3,13.65
dt_referencia,no_indexador,no_indice,nu_indice,ret_dia_perc,ret_mes_perc,ret_ano_perc,ret_12_meses_perc,vol_aa_perc,taxa_juros_aa_perc_compra_d1,taxa_juros_aa_perc_venda_d0
2023-12-15,Prefixado,IDkA-P,1234.56,0.12,2.34,15.67,18.90,8.45,13.50,13.60
O sistema gera logs estruturados em logs/anbima_scraper.log
:
2023-12-15 10:30:15 [INFO] anbima_scraper.core.anbima_scraper: Starting ANBIMA scraper for all data sources
2023-12-15 10:30:16 [INFO] anbima_scraper.scrapers.indicators: Scraping ANBIMA indicators
2023-12-15 10:30:18 [INFO] anbima_scraper.scrapers.indicators: Indicators data updated successfully
anbima_scraper/
βββ src/anbima_scraper/ # CΓ³digo fonte principal
β βββ __init__.py # Exports principais
β βββ cli.py # Interface de linha de comando
β βββ core/ # Funcionalidades centrais
β β βββ __init__.py
β β βββ anbima_scraper.py # Classe principal
β β βββ scraper.py # Classe base
β βββ scrapers/ # Scrapers especΓficos
β β βββ __init__.py
β β βββ indicators.py # Indicadores ANBIMA
β β βββ idka.py # IDKA
β β βββ ima.py # IMA
β β βββ curves.py # Curvas de juros
β β βββ debentures.py # DebΓͺntures
β βββ utils/ # UtilitΓ‘rios
β β βββ __init__.py
β β βββ http_client.py # Cliente HTTP
β β βββ calendar.py # UtilitΓ‘rios de calendΓ‘rio
β β βββ data_processor.py # Processamento de dados
β βββ config/ # ConfiguraΓ§Γ΅es
β βββ __init__.py
β βββ settings.py # ConfiguraΓ§Γ΅es centralizadas
βββ data/ # Dados processados
β βββ raw/ # Dados brutos
β βββ processed/ # Dados processados
βββ tests/ # Testes
β βββ __init__.py
β βββ test_indicators.py # Testes dos indicadores
βββ examples/ # Exemplos de uso
β βββ basic_usage.py # Exemplo bΓ‘sico
βββ logs/ # Logs do sistema
βββ pyproject.toml # ConfiguraΓ§Γ£o do projeto
βββ requirements.txt # DependΓͺncias
βββ .pre-commit-config.yaml # Hooks de pre-commit
βββ .gitignore # Arquivos ignorados
βββ README.md # Este arquivo
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β CLI Module β β Python API β β Configuration β
β β β β β β
β run-all β β ANBIMAScraper β β settings.py β
β run β β run_all() β β URLs β
β status β β run_scraper() β β Settings β
β list β β get_status() β β Logging β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β β β
βββββββββββββββββββββββββΌββββββββββββββββββββββββ
β
βββββββββββββββββββ
β Base Scraper β
β β
β BaseScraper β
β - HTTP Client β
β - Calendar β
β - Data Proc β
βββββββββββββββββββ
β
βββββββββββββββββββββββββΌββββββββββββββββββββββββ
β β β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β Indicators β β IDKA β β Others β
β β β β β β
β - SELIC β β - Returns β β - IMA β
β - CDI β β - Volatility β β - Curves β
β - IPCA β β - Rates β β - Debentures β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
# Executar todos os testes
pytest
# Executar com cobertura
pytest --cov=anbima_scraper
# Executar testes especΓficos
pytest tests/test_indicators.py
# Executar com verbose
pytest -v
# Exemplo de teste
def test_map_indicator_selic(scraper):
"""Test SELIC indicator mapping."""
result = scraper._map_indicator("Taxa SELIC do BC2", "DescriΓ§Γ£o")
assert result == "selic"
# Instalar pre-commit hooks
pre-commit install
# Formatar cΓ³digo
black src/ tests/
# Verificar imports
isort src/ tests/
# Verificar tipos
mypy src/
# Verificar linting
flake8 src/ tests/
- Criar classe do scraper:
from ..core.scraper import BaseScraper
class NewScraper(BaseScraper):
def __init__(self):
super().__init__("new_scraper")
def scrape(self, start_date=None, end_date=None):
# Implementar lΓ³gica do scraper
pass
- Adicionar configuraΓ§Γ΅es:
# Em settings.py
ANBIMA_URLS["new_scraper"] = "https://anbima.com.br/new-endpoint"
FILE_PATHS["new_scraper"] = PROCESSED_DATA_DIR / "new_scraper.csv"
- Registrar no scraper principal:
# Em anbima_scraper.py
self.scrapers["new_scraper"] = NewScraper()
- DEBUG: InformaΓ§Γ΅es detalhadas para desenvolvimento
- INFO: InformaΓ§Γ΅es gerais sobre operaΓ§Γ΅es
- WARNING: Avisos sobre situaΓ§Γ΅es nΓ£o crΓticas
- ERROR: Erros que impedem operaΓ§Γ£o normal
2023-12-15 10:30:15 [INFO] anbima_scraper.core.anbima_scraper: Starting ANBIMA scraper for all data sources
2023-12-15 10:30:16 [INFO] anbima_scraper.scrapers.indicators: Scraping ANBIMA indicators
2023-12-15 10:30:17 [DEBUG] anbima_scraper.utils.http_client: Making GET request to: https://www.anbima.com.br/informacoes/indicadores/
2023-12-15 10:30:18 [INFO] anbima_scraper.utils.http_client: Request successful: 200
2023-12-15 10:30:19 [INFO] anbima_scraper.scrapers.indicators: Fetched indicators data: 25 rows
2023-12-15 10:30:20 [INFO] anbima_scraper.scrapers.indicators: Processed indicators data: 25 rows
2023-12-15 10:30:21 [INFO] anbima_scraper.scrapers.indicators: Indicators data updated successfully
Error: Request failed: Connection timeout
SoluΓ§Γ£o: Verificar conectividade com internet e configuraΓ§Γ΅es de proxy.
No new data to download
SoluΓ§Γ£o: Usar flag --force
para forΓ§ar atualizaΓ§Γ£o.
Permission denied: logs/anbima_scraper.log
SoluΓ§Γ£o: Verificar permissΓ΅es do diretΓ³rio logs/
.
ModuleNotFoundError: No module named 'pandas'
SoluΓ§Γ£o: Instalar dependΓͺncias com pip install -r requirements.txt
.
Para obter mais informaΓ§Γ΅es sobre problemas:
import logging
logging.getLogger('anbima_scraper').setLevel(logging.DEBUG)
- Fork o projeto
- Clone seu fork
- Crie uma branch para sua feature
- Implemente suas mudanΓ§as
- Adicione testes
- Execute os testes
- Commit suas mudanΓ§as
- Push para sua branch
- Abra um Pull Request
- Use Black para formataΓ§Γ£o
- Use isort para organizaΓ§Γ£o de imports
- Use flake8 para linting
- Use mypy para type checking
- Adicione docstrings para todas as funΓ§Γ΅es
- Escreva testes para novas funcionalidades
- CΓ³digo segue padrΓ΅es de formataΓ§Γ£o
- Testes passam
- DocumentaΓ§Γ£o atualizada
- Logs apropriados adicionados
- Tratamento de erros implementado
Este projeto estΓ‘ licenciado sob a LicenΓ§a MIT - veja o arquivo LICENSE para detalhes.
- ANBIMA por disponibilizar os dados financeiros
- Comunidade Python pelas ferramentas e bibliotecas
- Contribuidores que ajudaram a melhorar o projeto
- Issues: GitHub Issues
- DocumentaΓ§Γ£o: Este README e docstrings no cΓ³digo
- Email: [email protected]
β Se este projeto foi ΓΊtil para vocΓͺ, considere dar uma estrela no GitHub!