XML-Datei herunterladen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
himber
User
Beiträge: 1
Registriert: Donnerstag 2. Januar 2020, 13:34

Hallo liebes Forum,

ich würde gerne xml-Strommarktdaten mit Python automatisch von folgender Website herunterladen:
https://smard.de/home/downloadcenter/do ... tdaten/726#!

Die Einstellung der Downloadoptionen kann ich einstellen durch Anhängen von z. B.: "?downloadAttributes={"selectedCategory":1,"selectedSubCategory":1,"selectedRegion":"DE","from":1577055600000,"to":1578005999999,"selectedFileType":"XML"}"

Mein Problem ist nun allerdings den Download auszulösen. Der Button beinhaltet die js-Funktion "downloadData.download()", über das Firefox-Entwicklertool/Debug habe ich "downloadData" in "app/lib/app.js" und in "app/lib/templates.js" gefunden. Leider konnte ich daraus aber nicht nachvollziehen, wie ich den Download über Python starten könnte.

Der Anfragetext, der mit GET beim manuellen Klick auf "Datei herunterladen" gesendet wird enthält:

Code: Alles auswählen

e_c=Downloadcenter
e_a=Marktdaten herunterladen
e_n=Marktdaten herunterladen
idsite=1
rec=1
r=570699
h=13
m=57
s=35
url=https://smard.de/home/downloadcenter/download_marktdaten/?downloadAttributes=%7B%22selectedCategory%22:1,%22selectedSubCategory%22:1,%22selectedRegion%22:%22DE%22,%22from%22:1577055600000,%22to%22:1578005999999,%22selectedFileType%22:%22XML%22%7D
urlref=https://smard.de/home/downloadcenter/download_marktdaten/726
_id=9a441931cf0512a5
_idts=1577969856
_idvc=0
_idn=1
_refts=0
_viewts=
send_image=1
cookie=1
res=1366x768
gt_ms=629
pv_id=dLm2yA
Hier konnte ich nicht nachvollziehen, woher z. B. die _idts-Information kommt. Diese ist bei mehrfachem Download unterschiedlich.

Es wäre super, wenn ihr mir einen Tipp geben könnt, mit welcher Python Erweiterung ich den Download am einfachsten realisieren kann. Ich benutze Anaconda/ Python 3.7.

Danke!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich sehe da die URL https://smard.de/nip-download-manager/n ... arket-data mit den POST-Daten der Form:

Code: Alles auswählen

{"request_form":[{"format":"XML","moduleIds":[6000411],"region":"DE","timestamp_from":1577055600000,"timestamp_to":1578005999999,"type":"discrete","language":"de"}]}
Die richtige moduleIds mußt Du noch in den Entwicklertools rauslesen.
drminic
User
Beiträge: 1
Registriert: Donnerstag 25. Februar 2021, 10:55

Servus, hatte selbst das Problem und hab dazu nen kleines skript geschribene :)
https://github.com/DrNatoor/smard_api
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@drminic: timestamp wird gar nicht verwendet. Es ist auch verwirrend, wenn man als Default-Argument den Zeitpunkt des Programmstarts nimmt, man würde ja den aktuellen Zeitpunkt erwarten. requests kann direkt in json konvertieren, das muß man also nicht explizit machen. Hat zusätzlich den Vorteil, dass der Content-Type richtig gesetzt wird. Variablennamen und Funktionen werden nach Konvention komplett klein geschrieben.

Die Spalten Datum und Uhrzeit sollten zu einer Spalte zusammengefasst werden. Daneben fehlt auch noch dayfirst=True. Zahlen haben ein Dezimalkomma.

Code: Alles auswählen

import time
import requests
import pandas as pd
from io import StringIO

SMARD_URL = "https://www.smard.de/nip-download-manager/nip/download/market-data"

def request_smard_data(modul_ids=[8004169], timestamp_from_in_milliseconds=None,
        timestamp_to_in_milliseconds=None, region="DE", language="de", type="discrete"):
 
    if timestamp_to_in_milliseconds is None:
        timestamp_to_in_milliseconds = int(time.time() * 1000)
    if timestamp_from_in_milliseconds is None:
        timestamp_from_in_milliseconds = timestamp_to_in_milliseconds - 3 * 3600 * 1000
    
    # http request content
    data = {
        "request_form": [{
            "format": "CSV",
            "moduleIds": modul_ids,
            "region": region,
            "timestamp_from": timestamp_from_in_milliseconds,
            "timestamp_to": timestamp_to_in_milliseconds,
            "type": type,
            "language": language
        }]
    }
    response = requests.post(SMARD_URL, json=data)
    print response.text
    # create pandas dataframe out of response string (csv)
    return pd.read_csv(StringIO(response.text), sep=';', decimal=',',  dayfirst=True, parse_dates=[['Datum', 'Uhrzeit']])
Antworten