hidroweb-python
Biblioteca Python completa e profissional para consumo da API HidroWebService da ANA (Agencia Nacional de Aguas e Saneamento Basico).
Funcionalidades
API Completa
- Cliente Python sincrono e assincrono
- CLI poderosa para uso via terminal
- Cache inteligente (memoria, disco, Redis)
- Export de dados (CSV, Excel, JSON, Parquet)
- Retry automatico com backoff exponencial
- Paginacao automatica para grandes datasets
- Type hints completos
- Logging estruturado
Endpoints Disponiveis
- Autenticacao OAuth
- Series telemetricas adotadas
- Series telemetricas detalhadas
- Inventario de estacoes
- Filtros avancados por UF, bacia, tipo
Instalacao
Via uv (recomendado)
uv add hidroweb
Via pip
pip install hidroweb
Instalacao completa (com todas as dependencias opcionais)
pip install hidroweb[full]
# Inclui: cache redis, export parquet
Pre-requisitos
Para usar esta biblioteca, voce precisa solicitar credenciais de acesso a ANA:
- Envie um e-mail para: hidro@ana.gov.br
- Assunto: "[SEU CPF/CNPJ] - Solicitacao de acesso a API HidroWebService"
- Inclua no corpo:
- Nome completo e instituicao
- CPF ou CNPJ (sera seu usuario)
- Endereco de e-mail
- Breve explicacao do motivo
Uso Basico
API Python
from hidroweb import ClienteHidroweb
# Inicializar cliente
cliente = ClienteHidroweb(
identificador="SEU_CPF_OU_CNPJ",
senha="SUA_SENHA"
)
# Listar estacoes ativas de Sao Paulo
estacoes = cliente.inventario.listar_estacoes(
uf="SP",
operando=True
)
# Obter serie telemetrica
medicoes = cliente.series.obter_serie_adotada(
codigo_estacao="15400000",
range_intervalo="DIAS_30"
)
# Exibir dados
for medicao in medicoes[:5]:
print(f"{medicao.Data_Hora_Medicao}: Cota={medicao.Cota_Adotada}cm")
Com Cache
from hidroweb import ClienteHidroweb
from hidroweb.cache.disco import CacheDisco
from datetime import timedelta
# Cliente com cache em disco
cache = CacheDisco(ttl_padrao=timedelta(hours=24))
cliente = ClienteHidroweb(
identificador="SEU_CPF",
senha="SUA_SENHA",
cache=cache
)
# Primeira busca: da API
medicoes = cliente.series.obter_serie_adotada("15400000")
# Segunda busca: do cache (instantaneo!)
medicoes = cliente.series.obter_serie_adotada("15400000")
Export de Dados
from hidroweb import ClienteHidroweb
from hidroweb.export import GerenciadorExport
from pathlib import Path
cliente = ClienteHidroweb(identificador="CPF", senha="SENHA")
# Buscar dados
medicoes = cliente.series.obter_serie_adotada("15400000")
# Exportar para CSV
GerenciadorExport.exportar(medicoes, Path("dados.csv"), formato="csv")
# Exportar para Excel
GerenciadorExport.exportar(medicoes, Path("dados.xlsx"), formato="xlsx", nome_aba="Medicoes")
# Exportar para JSON
GerenciadorExport.exportar(medicoes, Path("dados.json"), formato="json", indent=2)
# Exportar para Parquet (ideal para big data)
GerenciadorExport.exportar(medicoes, Path("dados.parquet"), formato="parquet")
API Assincrona
import asyncio
from hidroweb import ClienteHidrowebAsync
async def main():
async with ClienteHidrowebAsync(
identificador="CPF",
senha="SENHA"
) as cliente:
# Buscar multiplas estacoes em paralelo
codigos = ["15400000", "15410000", "15420000"]
resultados = await cliente.buscar_multiplas_estacoes(codigos)
for codigo, medicoes in resultados.items():
print(f"Estacao {codigo}: {len(medicoes)} medicoes")
asyncio.run(main())
CLI (Command Line Interface)
# Autenticar
hidroweb auth --identificador SEU_CPF --senha SUA_SENHA
# Listar estacoes
hidroweb estacoes listar --uf SP --operando --limite 10
# Ver informacoes de uma estacao
hidroweb estacoes info 15400000
# Obter serie telemetrica
hidroweb series obter 15400000 --intervalo DIAS_30 --formato tabela
# Exportar dados
hidroweb export series 15400000 dados.csv --intervalo DIAS_30 --formato csv
hidroweb export series 15400000 dados.xlsx --formato xlsx
hidroweb export series 15400000 dados.json --formato json
Funcionalidades Avancadas
Retry Automatico
from hidroweb.retry import com_retry, EstrategiaRetry
# Usar decorador
@com_retry(max_tentativas=5, backoff_base=2.0)
def buscar_dados_criticos():
return cliente.series.obter_serie_adotada("15400000")
# Ou usar diretamente
estrategia = EstrategiaRetry(
max_tentativas=5,
backoff_base=1.0,
backoff_max=60.0
)
resultado = estrategia.executar(buscar_dados_criticos)
Paginacao
from hidroweb.paginacao import Paginador
# Criar paginador
paginador = Paginador(
funcao_busca=lambda limit, offset: cliente.inventario.listar_estacoes(),
tamanho_pagina=100
)
# Iterar por paginas
for item in paginador.iterar_todas():
processar(item)
# Ou obter todas de uma vez
todas = paginador.obter_todas()
Cache Redis (opcional)
from hidroweb import ClienteHidroweb
from hidroweb.cache.redis import CacheRedis
from datetime import timedelta
# Requer: pip install hidroweb[redis]
cache = CacheRedis(
host='localhost',
port=6379,
ttl_padrao=timedelta(hours=1)
)
cliente = ClienteHidroweb(
identificador="CPF",
senha="SENHA",
cache=cache
)
Documentacao Completa
- Guia de Inicio Rapido
- Autenticacao
- Sistema de Cache
- Export de Dados
- CLI Completo
- API Assincrona
- Referencia da API
Exemplos Praticos
| # | Arquivo | Descricao |
|---|---|---|
| 01 | 01_autenticacao.py | Autenticacao basica |
| 02 | 02_listar_estacoes.py | Listar estacoes por UF |
| 03 | 03_buscar_series.py | Buscar series telemetricas |
| 04 | 04_uso_cache.py | Cache em memoria |
| 05 | 05_export_csv.py | Exportar para CSV |
| 06 | 06_async_basico.py | API assincrona basica |
| 07 | 07_export_excel.py | Exportar para Excel |
| 08 | 08_series_detalhadas.py | Series detalhadas por data |
| 09 | 09_async_multiplas_estacoes.py | Async com multiplas estacoes |
| 10 | 10_uso_avancado.py | Pipeline com cache, retry e export |
Desenvolvimento
# Clonar repositorio
git clone https://github.com/seu-usuario/hidroweb-python
cd hidroweb-python
# Instalar com dependencias de desenvolvimento
uv pip install -e ".[dev]"
# Rodar testes
pytest
# Rodar testes com coverage
pytest --cov=src/hidroweb --cov-report=html
# Linting
ruff check src/ tests/
black --check src/ tests/
# Type checking
mypy src/
Contribuindo
Contribuicoes sao bem-vindas! Veja CONTRIBUTING.md
Status do Projeto
- Core API implementado
- Cache completo (memoria, disco, Redis)
- Export (CSV, Excel, JSON, Parquet)
- CLI funcional
- API assincrona
- Retry e paginacao
- Testes completos
- Documentacao completa
Licenca
MIT License - veja LICENSE
Links Uteis
Exemplos de Uso
Analise de Dados
import pandas as pd
from hidroweb import ClienteHidroweb
cliente = ClienteHidroweb(identificador="CPF", senha="SENHA")
# Buscar dados de multiplas estacoes
estacoes_sp = cliente.inventario.listar_estacoes(uf="SP", operando=True)
# Coletar series de todas
dados_completos = []
for estacao in estacoes_sp[:10]: # Primeiras 10
medicoes = cliente.series.obter_serie_adotada(estacao.codigoestacao)
dados_completos.extend([m.model_dump() for m in medicoes])
# Criar DataFrame para analise
df = pd.DataFrame(dados_completos)
print(df.describe())
Pipeline de Dados
from hidroweb import ClienteHidroweb
from hidroweb.cache.disco import CacheDisco
from hidroweb.export import GerenciadorExport
from pathlib import Path
# Setup
cache = CacheDisco()
cliente = ClienteHidroweb("CPF", "SENHA", cache=cache)
# Pipeline: buscar -> processar -> exportar
def pipeline_dados(uf: str, output_dir: Path):
# 1. Buscar estacoes
estacoes = cliente.inventario.listar_estacoes(uf=uf, operando=True)
# 2. Buscar series (com cache automatico)
for estacao in estacoes:
medicoes = cliente.series.obter_serie_adotada(estacao.codigoestacao)
# 3. Exportar cada estacao
arquivo = output_dir / f"{estacao.codigoestacao}.parquet"
GerenciadorExport.exportar(medicoes, arquivo, formato="parquet")
print(f" {estacao.Estacao_Nome}: {len(medicoes)} medicoes")
# Executar
pipeline_dados("MG", Path("dados_mg"))
Agradecimentos
- ANA (Agencia Nacional de Aguas e Saneamento Basico) pela disponibilizacao da API
- Comunidade Python Brasil
Desenvolvido para a comunidade hidrologica brasileira
Metadata
Release files for hidroweb 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| hidroweb-1.0.0.tar.gz | 34.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| hidroweb-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 69.0 kB
Release files / hidroweb-1.0.0.tar.gz
| Download URL | hidroweb-1.0.0.tar.gz |
|---|---|
| Size | 34.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
599e13df08a71346eac7f2dcab20b8cec8504048ee0cbe97c009d2d35f73553b
|
|
BLAKE2b-256 checksum How to use checksums |
65afef993de20fc74fb2762a133b3a0323e7f81637f5611efe622e7b1d1e6fca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 25, 2026.
Transparency logRelease files / hidroweb-1.0.0-py3-none-any.whl
| Download URL | hidroweb-1.0.0-py3-none-any.whl |
|---|---|
| Size | 34.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d2d419291d97e4ce2eb8e616df109e704923c7d9f5fd49002957096cd9ac3dea
|
|
BLAKE2b-256 checksum How to use checksums |
c011abbf6ed1ff9ada2cb243172a4320bd031d8dc0872df4c5dbebf85961bf51
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 25, 2026.
Transparency log