9x
005597
2024-08-22

Strumento Geo-Zone Web Query (API): Automazione utilizzando Python

Come posso automatizzare le richieste web (API) allo strumento Geo-Zone usando Python?


Risposta:

Sì, puoi farlo molto facilmente. L'esempio seguente mostra questo.

Preparazione

Per effettuare richieste web allo strumento Geo-Zone Tool utilizzando Python, è necessario:

  1. Editor o IDE (Integrated Development Environment) per la scrittura dello script
  2. Python - python.org
  3. Richieste della libreria Python
  4. Libreria Python Panda (opzionale)

Per eseguire una richiesta web dello strumento Geo-Zone, le informazioni sono necessarie per lo strumento Geo-Zone. Utilizzando l'esempio della struttura dell'URL della query, questo è spiegato nel seguente articolo:
Contolling WebService (API)

Per questo esempio, vengono utilizzate le seguenti informazioni, che è necessario sostituire nello script con le proprie:

  1. Lingua: it (Tedesco)
  2. Accesso: john [email protected]
  3. linea hash: 123456ABCD
  4. Mappa: wind-DIN-EN-1991-1-4 (carico del vento secondo l'Appendice tedesca EC1)
  5. Dove: Dlubal, Tiefenbach (sede di Dlubal GmbH)
  6. Posizione: 49.4353975, 12.5894907 (latitudine, longitudine)

Esegui la richiesta web e leggi i dati

Il seguente script interroga il servizio web del Geo-Zone Tool e documenta i tempi e il contenuto richiesti.


…
#%% Importazione
# Libreria per la lettura del timestamp (libreria standard, opzionale) 
Importa datetime come dt
# Esegui libreria tramite richiesta web
Richieste di importazione

#%% Imposta parametri
# URL Webservice Geo-Zone Tool 
urlgz = ' https://external-crm.dlubal.com/loadzones/data.aspx'

# Parametri per la query (sostituire con i propri valori)
parz = {
        'lingua': 'it',
        'accesso': '[email protected]',
        ' hash': '123456ABCD',
        'mappa': 'vento-DIN-EN-1991-1-4',
        'posto': 'Dlubal, Tiefenbach, Germania',
        'elemento': '49.4353975,12.5894907'
        }
# Imposta il tempo per l'annullamento della richiesta
reto=10 #p

Esegui query #%%.
# Timestamp prima del recupero
cdt1 = dt.datetime.now ()
# Query web utilizzando Richieste
rgz = request.get(urlgz, params=pargz, timeout=reto)
# Timestamp dopo il recupero
cdt2 = dt.datetime.now ()
# Durata della query in secondi
dur=(cdt2-cdt1).total_seconds()
# Codice di stato HTTP della richiesta
sgz=rgz.status_code
# Descrizione del contenuto della query
hgz=rgz.headers['Tipo di contenuto']
# Contenuto della richiesta web come testo
tgz = rgz.text

#%% Output della console della richiesta web
txt=[]
txt.append(f"Timestamp: {cdt1}") #Ora AAAA-MM-GG HH:MM:SS.SSSSSS
txt.append(f"Durata: {dur} s") #Durata della query
txt.append(f"Codice di stato: {rgz.status_code}"), codice di stato #HTTP (normale: 200)
txt.append(f"Intestazione: {hgz}"), #descrizione del contenuto (normale: testo/html; set di caratteri=utf-8)
txt.append(f"Testo di output della richiesta:\n{tgz}") #Output dello strumento Geo-Zone Tool
print ('\n'.join(txt))
…

Ciò porta ai seguenti risultati, ad esempio:


Timestamp: 2024-08-22 13:24:32.727006
Durata: 2,214527
Codice di stato: 200
Intestazione: testo/html; setcaratteri=utf-8
Testo della richiesta: 
Risultato 1, Risultato 2, Zona, Latitudine, Longitudine, Elevazione, Via, CAP, Città, Norma, Allegato, Nota(i), Note legali
22.5 m/s,0.32 kN/m2,1,49.4353975,12.5894907,520.69384765625,Am Zellweg 2,93464,Tiefenbach,EN 1991-1-4,DIN EN 1991-1-4

Aggiunta: preparazione del contenuto della richiesta web

Il seguente script converte il testo ottenuto dal servizio web Geo-Zone Tool in una forma tabellare. Inoltre, i valori dei risultati sono separati dalle loro unità e infine salvati come file CSV ed Excel.


…
#%% Importazione
# Funzioni di stringa della libreria standard per l'importazione e l'esportazione
da io import StringIO
# Libreria per l'elaborazione dei dati
Importa i panda come pd

#%% Funzioni
di rsep_val_unit(indf, cnstart='Risultato',):
    "''"
    Separa le colonne del dataframe di richiesta Dlubal Geo-Zone Tool con risultati per valore e unità.

    Parametri
    ----------
    indf panda.DataFrame
        Dati di input.
    Cninizio: stringa, opzionale
        Identificatore all'inizio del nome della colonna contenente i risultati

    Resi
    -------
    outdf : panda.DataFrame
        Dati di output.

    "''"
    tmp2 = indf.loc(axis=1)[indf.columns.str.startswith(cnstart)]
    tmp3 = pd.DataFrame ()
    per i in tmp2.columns:
        tmp3[[(i, 'valore'), (i, 'unità')]] = tmp2[i].str.split(
            ' ', n=1, espandi=Vero)
    outdf = pd.concat(
        [tmp3, indf.loc(axis=1)[~indf.columns.str.startswith(cnstart)]], axis=1)
    ritorno outdf

#%% Esegui conversione
# Converti l'output dello strumento Geo-Zone Tool in un dataframe "tabulare".
dfgz=pd.read_csv(StringIO(rgz.text))
# DataFrame con risultati separati per valore e unità
dfgz_rs=rsep_val_unit(dfgz)

#%% Risparmio
# come file CSV
dfgz_rs.to_csv("Dlubal_ULS_request.csv")
# come file Excel
dfgz_rs.to_excel("Dlubal_ULS_request.xlsx")

#%% Output della conversione della console
print(f"Frame dati originale:\n{dfgz.to_string()}")
print(f"Frame dati manipolato:\n{dfgz_rs.to_string()}")
print("Esempio di output:\n"
      + f"Il primo risultato ha il valore {dfgz_rs.iloc[0,0]}."
      + f" (in {dfgz_rs.iloc[0,1]})")
…

Ciò si traduce nei seguenti risultati, ad esempio:


Dataframe originale:
   Risultato 1, Risultato 2, Zona, Latitudine, Longitudine, Elevazione, Via, CAP, Appendice alla norma cittadina Nota(i)
0 22.5 m/s 0.32 kN/m2 1 49.435398 12.589491 520.693848 Am Zellweg 2 93464 Tiefenbach EN 1991-1-4 DIN EN 1991-1-4 NaN
Frame di dati manipolato:
  (Risultato 1, valore) (Risultato 1, unità) (Risultato 2, valore) (Risultato 2, unità) Zona Latitudine Longitudine Elevazione Via CAP Città Norma Appendice Nota(i)
0 22.5 m/s 0.32 kN/m2 1 49.435398 12.589491 520.693848 Am Zellweg 2 93464 Tiefenbach EN 1991-1-4 DIN EN 1991-1-4 NaN
Esempio di output:
   Il primo risultato ha il valore 22.5. (m/s)

Autore

Mr. GBhardt fornisce supporto tecnico per i clienti di Dlubal Software e si prende cura delle loro richieste.

Link