Monitoramento Automatizado de Câmbio do China Construction Bank via Python

Monitorar as variações de moedas estrangeiras diretamente por aplicativos bancários pode ser ineficiente devido aos constantes processos de autenticação e interfaces carregadas. Uma alternativa técnica mais ágil é realizar a extração direta dos dados através dos arquivos XML públicos fornecidos pelo portal de câmbio do China Construction Bank (CCB).

Identificando a Fonte de Dados

Ao analisar o tráfego de rede no portal de câmbio do CCB utilizando as ferrramentas de desenvolvedor do navegador (F12 > Network > Fetch/XHR), é possível localizar o arquivo jshckpj_new.xml. Este arquivo contém as cotações atualizadas em tempo real.

A estrutura de cada nó ReferencePriceSettlement no XML segue este padrão:

<ReferencePriceSettlement name="1">
    <Ofrd_Ccy_CcyCd>392</Ofrd_Ccy_CcyCd> <!-- Código da Moeda Alvo (ex: Iene) -->
    <Ofr_Ccy_CcyCd>156</Ofr_Ccy_CcyCd>  <!-- Código da Moeda Base (RMB) -->
    <BidRateOfCash>...</BidRateOfCash>   <!-- Compra em Papel Moeda -->
    <OfrRateOfCash>...</OfrRateOfCash>   <!-- Venda em Papel Moeda -->
    <BidRateOfCcy>...</BidRateOfCcy>     <!-- Compra em Divisas (Remessa) -->
    <OfrRateOfCcy>...</OfrRateOfCcy>     <!-- Venda em Divisas (Remessa) -->
    <LstPr_Dt>20240618</LstPr_Dt>        <!-- Data da Cotação -->
    <LstPr_Tm>203354</LstPr_Tm>          <!-- Hora da Cotação -->
</ReferencePriceSettlement>

Implementação do Script em Python

Para processar essas informações, utilizaremos as bibliotecas requests para a captura dos dados e xml.etree.ElementTree para o parsing do conteúdo. O foco deste exemplo será a extração da cotação do Iene Japonês (JPY).

import requests
import xml.etree.ElementTree as ET

def buscar_cotacao_ccb():
    endpoint = "http://forex1.ccb.com/cn/home/news/jshckpj_new.xml"
    
    try:
        solicitacao = requests.get(endpoint)
        solicitacao.raise_for_status()
        conteudo_xml = solicitacao.text
    except requests.exceptions.RequestException as erro:
        print(f"Falha na conexão: {erro}")
        return

    tree_root = ET.fromstring(conteudo_xml)

    # Extração e formatação da data/hora
    data_raw = tree_root.find('.//LstPr_Dt').text
    hora_raw = tree_root.find('.//LstPr_Tm').text
    
    data_formatada = f"{data_raw[:4]}-{data_raw[4:6]}-{data_raw[6:]}"
    hora_formatada = f"{hora_raw[:2]}:{hora_raw[2:4]}:{hora_raw[4:]}"
    timestamp = f"{data_formatada} {hora_formatada}"

    info_moeda = None

    # Localizando Iene (392) em relação ao Yuan (156)
    for entrada in tree_root.findall('ReferencePriceSettlement'):
        target = entrada.find('Ofrd_Ccy_CcyCd').text
        base = entrada.find('Ofr_Ccy_CcyCd').text
        
        if target == '392' and base == '156':
            info_moeda = {
                'compra': float(entrada.find('BidRateOfCcy').text),
                'venda': float(entrada.find('OfrRateOfCcy').text)
            }
            break

    if info_moeda:
        print(f"--- Relatório de Câmbio (JPY/CNY) ---")
        print(f"Atualização: {timestamp}")
        print(f"Taxa de Compra: {info_moeda['compra']}")
        print(f"Taxa de Venda: {info_moeda['venda']}")
        
        # Simulação de custos para volumes específicos
        for volume in [50000, 100000]:
            custo_total = volume * info_moeda['venda']
            print(f"Custo para adquirir {volume} JPY: {custo_total:.2f} CNY")
    else:
        print("Dados da moeda não encontrados no feed.")

if __name__ == "__main__":
    buscar_cotacao_ccb()

Referência de Códigos de Moedas

Caso deseje monitorar outros ativos, utilize os códigos numéricos correspondentes no filtro de busca do script:

  • 840: Dólar Americano (USD)
  • 978: Euro (EUR)
  • 826: Libra Esterlina (GBP)
  • 036: Dólar Australiano (AUD)
  • 344: Dólar de Hong Kong (HKD)
  • 124: Dólar Canadense (CAD)
  • 756: Franco Suíço (CHF)
  • 702: Dólar de Singapura (SGD)

Tags: Python Requests xml-parsing FinTech web-scraping

Publicado em 7-8 06:53