35x
005597
2024-08-22

Consultas web (API) da Geo-Zone Tool: Automatização com Python

Como é que posso automatizar as consultas web (API) para a ferramenta Geo-Zone Tool com o Python?


Resposta:

Sim, é possível fazer isso com muita facilidade. O exemplo a seguir mostra isso.

Preparação

Para realizar consultas web na ferramenta Geo-Zone Tool utilizando Python, é necessário:

  1. Editor ou IDE (Integrated Development Beam) para escrever o script
  2. Python – python.org
  3. Consultas da biblioteca Python
  4. Biblioteca Python Pandas (opcional)

Para realizar uma consulta web na ferramenta Geo-Zone Tool, são necessárias informações para a Geo-Zone Tool. Isto é explicado no seguinte artigo utilizando o exemplo da estrutura do URL de consulta.
Acesso ao serviço web (API)

Para este exemplo, são utilizadas as seguintes informações que têm de ser substituídas pelas suas no script:

  1. Idioma: pt (português)
  2. Iniciar sessão: [email protected]
  3. Hash: 123456ABCD
  4. Mapa: wind-DIN-EN-1991-1-4 (carga de vento de acordo com o anexo alemão EC1)
  5. Local: Dlubal, Tiefenbach (sede da Dlubal GmbH)
  6. Posição: 49.4353975, 12.5894907 (latitude, longitude)

Efetuar consulta web e ler dados

O seguinte script consulta o serviço web da Geo-Zone Tool e documenta os tempos e os conteúdos necessários.

...
#%% Importar
# Biblioteca para ler a marca de tempo (biblioteca padrão, opcional)
import datetime as dt
# Executar biblioteca através de consulta web
import requests

#%% Definir parâmetros
# URl Webservice Geo-Zonen-Tool
urlgz = 'https://external-crm.dlubal.com/loadzones/data.aspx'

# Parâmetros para a consulta (substituir pelos seus próprios valores)
pargz = {
        'idioma': 'pt',
        'iniciar sessão': '[email protected]',
        'hash': '123456ABCD',
        'map': 'wind-DIN-EN-1991-1-4',
        'place': 'Dlubal, Tiefenbach',
        'position': '49.4353975,12.5894907'
        }
# Definir hora para o cancelamento da consulta
reto=10 # s

#%% Executar consulta
# Marca de tempo antes da recuperação
cdt1 = dt.datetime.now()
# Consulta na web utilizando pedidos
rgz = requests.get(urlgz, params=pargz, timeout=reto)
# Marca de tempo após recuperação
cdt2 = dt.datetime.now()
# Duração da consulta em segundos
dur=(cdt2-cdt1).total_seconds()
# Código de estado HTTP da consulta
sgz=rgz.status_code
# Descrição do conteúdo da consulta
hgz=rgz.headers['content-type']
# Conteúdo da consulta web como texto
tgz = rgz.text

#%% Saída da consola da consulta web
txt=[]
txt.append(f"Timestamp: {cdt1}") # Hora YYYY-MM-DD HH:MM:SS.SSSSSS
txt.append(f"Duration: {dur} s") # Duração da consulta
txt.append(f"Status code: {rgz.status_code}") # HTTP status code (normal: 200)
txt.append(f"Header: {hgz}") # Descrição do conteúdo (normal: text/html; charset=utf-8)
txt.append(f"Text output of request:\n{tgz}") # Saída da Geo-Zone Tool
print('\n'.join(txt))
...

Isto conduz aos seguintes resultados, por exemplo:

Marca de tempo: 2024-08-22 13:24:32.727006
Duração: 2.214527
Status code: 200
Header: text/html; charset=utf-8
Text output of request: 
Result 1,Result 2,Zone,Latitude,Longitude,Elevation,Street,ZIP,City,Standard,Annex,Note(s),Legal notice
22.5 m/s,0.32 kN/m²,1,49.4353975,12.5894907,520.69384765625,Am Zellweg 2,93464,Tiefenbach,EN 1991-1-4,DIN EN 1991-1-4,,Todos os dados fornecidos sem garantia

Complemento: preparação do conteúdo das consultas web

O seguinte script converte o texto obtido a partir do serviço web Geo-Zone Tool numa forma tabular. Além disso, os valores dos resultados são separados das unidades e finalmente guardados como ficheiro CSV e Excel.

…
#%% Importar
# Funções de string da biblioteca padrão para importação e exportação
from io import StringIO
# Biblioteca para o processamento de dados
import pandas as pd

#%% Funções
def rsep_val_unit(indf, cnstart='Result',):
    """
    Separates Dlubal Geo-Zone-Tool request Dataframe columns with results by value and unit.

    Parâmetros
    ----------
    indf : pandas.DataFrame
        Input data.
    cnstart: string, optional
        Identifier at start of column name containing results.

    Returns
    -------
    outdf : pandas.DataFrame
        Output data.

    """
    tmp2 = indf.loc(axis=1)[indf.columns.str.startswith(cnstart)]
    tmp3 = pd.DataFrame()
    for i in tmp2.columns:
        tmp3[[(i, 'value'), (i, 'unit')]] = tmp2[i].str.split(
            ' ', n=1, expand=True)
    outdf = pd.concat(
        [tmp3, indf.loc(axis=1)[~indf.columns.str.startswith(cnstart)]], axis=1)
    return outdf

#%% Efetuar conversão
# Converter saída de dados da Geo-Zone Tool em tabela de dados "tabular"
dfgz=pd.read_csv(StringIO(rgz.text))
# DataFrame com resultados separados por valor e unidade
dfgz_rs=rsep_val_unit(dfgz)

#%% A guardar
# como ficheiro CSV
dfgz_rs.to_csv("Dlubal_GZT_request.csv")
# como ficheiro Excel
dfgz_rs.to_excel("Dlubal_GZT_request.xlsx")

#%% Saídas da consola da conversão
print(f"Original Dataframe:\n{dfgz.to_string()}")
print(f"Manipulated Dataframe:\n{dfgz_rs.to_string()}")
print("Exemplary Output:\n"
      + f"   The first result has the value {dfgz_rs.iloc[0,0]}."
      + f" (in {dfgz_rs.iloc[0,1]})")
…

Isto conduz aos seguintes resultados, por exemplo:

Original Dataframe:
   Result 1               Result 2  Zone   Latitude  Longitude   Elevation        Street    ZIP        City     Standard            Annex  Note(s)              Legal notice
0  22.5 m/s  0.32 kN/m²     1  49.435398  12.589491  520.693848  Am Zellweg 2  93464  Tiefenbach  EN 1991-1-4  DIN EN 1991-1-4      NaN  Todos os dados fornecidos sem garantia
Manipulated Dataframe:
  (Result 1, value) (Result 1, unit) (Result 2, value)  (Result 2, unit)  Zone   Latitude  Longitude   Elevation        Street    ZIP        City     Standard            Annex  Note(s)              Legal notice
0              22.5              m/s              0.32  kN/m²     1  49.435398  12.589491  520.693848  Am Zellweg 2  93464  Tiefenbach  EN 1991-1-4  DIN EN 1991-1-4      NaN  Todos os dados fornecidos sem garantia
Exemplo de saída:
   O primeiro resultado tem o valor 22,5. (m/s)

Autor

O Eng. Gebhardt é quem processa os pedidos dos nossos utilizadores no departamento de apoio ao cliente.

Ligações


;