38x
005597
2024-08-22

Solicitudes web (API) de en la herramienta de zonas geográficas: Automatización usando Python

¿Cómo puedo automatizar las solicitudes web (API) para la herramienta de zonas geográficas utilizando Python?


Respuesta:

Puede hacerlo muy fácilmente. El siguiente ejemplo se lo muestra.

Preparación

Las solicitudes web para la herramienta de zonas geográficas (Geo-Zone Tool) utilizando Python requieren:

  1. Editor o IDE (Entorno de Desarrollo Integrado) para escribir la secuencia de comandos (script)
  2. Python - python.org
  3. Solicitudes de la biblioteca de Python
  4. Pandas de la biblioteca de Python (opcional)

Para ejecutar una solicitud web de la herramienta de zonas geográficas, necesita la información para esta herramienta. Usando el ejemplo de la estructura de la URL de consulta, esto se explica en el siguiente artículo:
Servicio web de control (API)

En este ejemplo, se utiliza la siguiente información, que puede reemplazar con la suya propia en la secuencia de comandos:

  1. Idioma: es (español)
  2. Inicio de sesión: [email protected]
  3. Función hash: 123456ABCD
  4. Mapa: wind-DIN-EN-1991-1-4 (carga de viento según el anexo alemán EC1)
  5. Ubicación: Dlubal, Tiefenbach (sede central de Dlubal GmbH)
  6. Posición: 49.4353975, 12.5894907 (Latitud, Longitud)

Ejecutar solicitud web y leer datos

La siguiente secuencia de comandos consulta el servicio web de la herramienta Geo-Zone Tool y documenta los tiempos y el contenido requeridos.

…
#%% Importar
# Biblioteca para leer la marca de tiempo (biblioteca estándar, opcional)
import datetime as dt
# Biblioteca para ejecutar la solicitud web
import requests

#%% Establecer parámetros
# URL Webservice Geo-Zone Tool
urlgz = 'https://external-crm.dlubal.com/loadzones/data.aspx'

# Parámetros para la consulta (reemplazar con sus propios valores)
pargz = {
        'language': 'es',
        'login': '[email protected]',
        'hash': '123456ABCD',
        'map': 'wind-DIN-EN-1991-1-4',
        'place': 'Dlubal, Tiefenbach',
        'position': '49.4353975,12.5894907'
        }
# Definir el tiempo para cancelar la solicitud
reto=10 # s

#%% Ejecutar consulta
# Marca de tiempo antes de la recuperación
cdt1 = dt.datetime.now()
# Consulta web mediante solicitudes
rgz = requests.get(urlgz, params=pargz, timeout=reto)
# Marca de tiempo después de la recuperación
cdt2 = dt.datetime.now()
# Duración de la consulta en segundos
dur=(cdt2-cdt1).total_seconds()
# Código de estado HTTP de la solicitud
sgz=rgz.status_code
# Descripción del contenido de la consulta
hgz=rgz.headers['content-type']
# Contenido de la solicitud web como texto
tgz = rgz.text

#%% Salida de la consola de la solicitud web
txt=[]
txt.append(f"Timestamp: {cdt1}") #Hora AAAA-MM-DD HH:MM:SS.SSSSSS
txt.append(f"Duration: {dur} s") # Duración de la consulta
txt.append(f"Status code: {rgz.status_code}") # HTTP status code (normal: 200)
txt.append(f"Header: {hgz}") # Descripción del contenido (normal: text/html; charset=utf-8)
txt.append(f"Text output of request:\n{tgz}") # Salida de la herramienta de zonas geográficas
print('\n'.join(txt))
…

Esto conduce a los siguientes resultados, por ejemplo:

Marca de tiempo: 2024-08-22 13:24:32.727006
Duration: 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 los datos sin garantía

Suplemento: preparación del contenido de la solicitud web

La siguiente secuencia de comandos (script) convierte el texto obtenido del servicio web de la herramienta Geo-Zone en una forma tabular. Además, los valores de los resultados se separan de sus unidades y finalmente se guardan como un archivo CSV y Excel.

…
#%% Importa
# Funciones de cadenas de caracteres de la biblioteca estándar para importar y exportar
from io import StringIO
# Biblioteca para el procesamiento de datos
import pandas as pd

#%% Funciones
def rsep_val_unit(indf, cnstart='Result',):
    """
    Separa las columnas del marco de datos de solicitud de la herramienta de Geo-Zone de Dlubal con resultados por valor y unidad.

    Parámetros
    ----------
    indf : pandas.DataFrame
        Input data.
    cnstart: string, optional
        Identificador al inicio del nombre de la columna que contiene los resultados.

    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

#%% Ejecutar conversión
# Convertir la salida de la herramienta Geo-Zone en un marco de datos "tabular"
dfgz=pd.read_csv(StringIO(rgz.text))
# DataFrame con resultados separados por valor y unidad
dfgz_rs=rsep_val_unit(dfgz)

#%% Guardando
# como archivo CSV
dfgz_rs.to_csv("Dlubal_GZT_request.csv")
# como archivo de Excel
dfgz_rs.to_excel("Dlubal_GZT_request.xlsx")

#%% Salida de consola de la conversión
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]})")
…

Esto da como resultado, por ejemplo, lo siguiente:

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 los datos sin garantía
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 los datos sin garantía
Salida de resultados de ejemplo:
   El primer resultado tiene el valor 22,5. (en m/s)

Autor

El Sr. Gebhardt proporciona soporte técnico para los clientes de Dlubal Software y se ocupa de sus solicitudes.

Enlaces


;