9x
005597
22.8.2024

Webové dotazy (API) na Geo-Zone Tool: Automatizace pomocí Pythonu

Jak mohu automatizovat webové dotazy (API) do nástroje Geo-Zone Tool pomocí Pythonu?


Odpověď:

Ano, to můžete udělat velmi snadno. V následujícím textu bude vše předvedeno na příkladu.

Příprava

Pro zadávání webových dotazů pro nástroj Geo-Zone Tool pomocí Pythonu potřebujete:

  1. Editor nebo IDE (Integrated Development Environment) pro psaní skriptu
  2. Python – python.org
  3. Dotazy na knihovnu Python
  4. Knihovna Python Pandas (volitelné)

Pro zadání dotazu nástroje Geo-Zone Tool jsou vyžadovány informace z nástroje Geo-Zone Tool. V následujícím příspěvku to vysvětlíme na příkladu struktury URL dotazu:
Ovládání Webové služby (API)

Pro tento příklad použijeme následující informace, které je třeba ve skriptu nahradit svými:

  1. Jazyk: cs (německy)
  2. Přihlášení: jan [email protected]
  3. hash line: 123456ABCD
  4. Mapa: wind-DIN-EN-1991-1-4 (zatížení větrem podle německé přílohy EC1)
  5. Místo: Dlubal, Tiefenbach (sídlo společnosti Dlubal GmbH)
  6. Poloha: 49.4353975, 12.5894907 (zeměpisná šířka, délka)

Provedení webového dotazu a načtení dat

Následující skript se dotazuje na webovou službu nástroje Geo-Zone Tool a zdokumentuje požadované časy a obsah.


...
#%% Import
# Databáze pro načtení časových razítek (standardní databáze, volitelná) 
Importovat datum a čas jako dt
# Spuštění knihovny pomocí webového požadavku
Importovat požadavky

#%% Nastavení parametrů
# URL webové služby Geo-Zone Tool 
urlgz = 'https://external-crm.dlubal.com/loadzones/data.aspx'

# Parametry pro dotaz (nahraďte vlastními hodnotami)
parz = {
        'language': 'de',
        'login': '[email protected]',
        'hash': '123456ABCD',
        'map': 'wind-DIN-EN-1991-1-4',
        'place': 'Dlubal, Tiefenbach',
        'position': '49.4353975,12.5894907'
        }
# Nastavit čas pro zrušení požadavku
reto=10 #p

Proveďte #%% dotaz
# Časové razítko před načtením
cdt1 = dt.datetime.now ()
# Webový dotaz pomocí dotazů
rgz = querys.get(urlgz, params=pargz, timeout=reto)
# Časové razítko po načtení
cdt2 = dt.datetime.now ()
# Doba trvání dotazu v sekundách
dur=(cdt2-cdt1).total_seconds()
# Stavový kód HTTP požadavku
sgz=rgz.status_code
# Popis obsahu dotazu
hgz=rgz.headers['content-type']
# Obsah webového požadavku jako text
tgz = rgz.text

#%% Výstup z konzoly dotazu na web
txt=[]
txt.append(f"Časové razítko: {cdt1}") #Time YYYY-MM-DD HH:MM:SS.SSSSSS
txt.append(f"Trvání: {dur} s") #Doba trvání dotazu
txt.append(f"Stavový kód: {rgz.status_code}"), #stavový kód HTTP (normální: 200)
txt.append(f"Záhlaví: {hgz}"), #popis obsahu (normal: text/html; charset=utf-8)
txt.append(f"Textový výstup požadavku:\n{tgz}") #Output nástroje pro stanovení oblastí zatížení
print('\n'.join(txt))
...
#/kód#

To vede například k následujícím výsledkům:

#code.output#
Časové razítko: 2024-08-22 13:24:32.727006
Délka: 2,214527
Status Code: 200
Záhlaví: text/html; charset=utf-8
Text poptávky: 
Výsledek 1, Výsledek 2, Oblast, Zeměpisná šířka, Zeměpisná délka, Nadmořská výška, Ulice, PSČ, Město, Norma, Příloha, Poznámka/y, Právní upozornění
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-14

Přídavek: Příprava obsahu webového požadavku

Následující skript převede text získaný z webové služby Geo-Zone Tool do tabulky. Kromě toho se výsledné hodnoty oddělí od příslušných jednotek a nakonec se uloží jako soubor CSV a Excel.


...
#%% Import
# Řetězcové funkce z databáze norem pro import a export
z io import StringIO
# Databáze pro zpracování dat
Importovat pandy jako pd

#%% Funkce
def rsep_val_unit(indf, cnstart='Result',):
    """
    Samostatný požadavek nástroje Dlubal Geo-Zone Tool ve sloupcích Dataframe s výsledky podle hodnot a jednotek.

    Parametry
    ----------
    indf pandas.DataFrame
        Vstupní údaje.
    Cnstart: string, volitelný
        Identifikátor na začátku názvu sloupce obsahujícího výsledky

    Vrátí
    -------
    outdf : pandas.DataFrame
        Výstupní data.

    """
    tmp2 = indf.loc(axis=1)[indf.columns.str.startswith(cnstart)]
    tmp3 = pd.DataFrame ()
    pro i v 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)
    návrat vendf

#%% Provést konverzi
# Zkonvertujte výstup nástroje Geo-Zone Tool do "tabulkového" datového rámce
dfgz=pd.read_csv(StringIO(rgz.text))
# DataFrame s výsledky oddělenými hodnotami a jednotkami
dfgz_rs=rsep_val_unit(dfgz)

#%% Úspora
# jako soubor CSV
dfgz_rs.to_csv("Dlubal_zadak_v_souvislosti_v ÚÚL.csv")
# jako soubor Excel
dfgz_rs.to_excel("Dlubal_request_ULS_request.xlsx")

#%% Výstup konverze z konzoly
print(f"Původní datový rámec:\n{dfgz.to_string()}")
print(f"Upravený datový rámec:\n{dfgz_rs.to_string()}")
print("Příklad výstupu:\n"
      + f"První výsledek má hodnotu {dfgz_rs.iloc[0,0]}."
      + f" (v {dfgz_rs.iloc[0,1]})")
...

Výsledkem jsou například následující výsledky:


Původní datový rámec:
   Výsledek 1, Výsledek 2, Oblast, Zeměpisná šířka, Zeměpisná délka, Nadmořská výška, Ulice, PSČ, Městská norma Poznámka k příloze
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
Manipulovaný datový rámec:
  (Výsledek 1, hodnota) (Výsledek 1, jednotka) (Výsledek 2, hodnota) (Výsledek 2, jednotka) Oblast Zeměpisná šířka Délka Nadmořská výška Ulice PSČ Město Norma Příloha Poznámka/poznámky
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
Příklad výstupu:
   První výsledek má hodnotu 22,5. (m/s)

Autor

Ing. Gebhardt vyřizuje v rámci zákaznické podpory podněty od uživatelů.

Odkazy