URL Request korrekt auslesen

Django, Flask, Bottle, WSGI, CGI…
Antworten
k.marco.1970
User
Beiträge: 48
Registriert: Mittwoch 25. Dezember 2013, 20:46

Hallo Forum,

ich versuche mich im Moment mit einer Abfrage an eine Fahrplanauskunft. Mein Ziel ist eine Anfrage an die Fahrplanauskunft zu senden und angezeigten Alternativen zu Parsen und auf einer Seite in einfacherer Form auszugeben. Wenn man also unten angegebene Adresse in den Browser eingibt, wird einem natürlich angezeigt, welche Verbindungen zu welcher Uhrzeit stattfinden.
Mein Problem ist allerdings, wenn ich einen request mit python an die Adresse mache, dann enthält das result nicht die Infos, die auf der Website angezeigt werden, sprich: die Verbindungszeiten (zumindest nicht so, dass ich sie auslesen könnte). Kann jemand helfen, was ich beachten muss und wie ich mit dem Ergebnis umgehen muss, um an die Fahrplanzeiten zu kommen?

Ausgewählt habe ich folgendes Beispiel, um mein Problem zu verdeutlichen:

Code: Alles auswählen

import requests

def fetch_url_content():
    # Ziel-URL
    url = "https://www.vrn.de/mng/#/XSLT_TRIP_REQUEST2@init?mode=sharing&restriction=0&orig=suburbID:8222000:25:Rheinau%20(MA):950115:5652847:MRCV&dest=6002417&isDeparture=true"

    # Setze das hidecookie-Cookie
    cookies = {
        'hidecookie': 'true',  # Das hidecookie-Cookie wird auf "true" gesetzt
    }

    # Optional: User-Agent setzen, um einen modernen Browser zu simulieren
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    }

    try:
        # Sende die Anfrage mit dem Cookie und optionalen Headern
        response = requests.get(url, cookies=cookies, headers=headers, timeout=10)

        # Prüfen des Statuscodes
        if response.status_code == 200:
            print("Anfrage erfolgreich!")
            print("Antwort:")
            print(response.text)
        else:
            print(f"Fehler: Anfrage fehlgeschlagen mit Statuscode {response.status_code}")
    except requests.exceptions.RequestException as e:
        print(f"Ein Fehler ist aufgetreten: {e}")

if __name__ == "__main__":
    fetch_url_content()
Grüße
MK
Benutzeravatar
sparrow
User
Beiträge: 4433
Registriert: Freitag 17. April 2009, 10:28

Oha, das sieht verdächtig nach ChatGPT-Code aus.

Der Inhalt der Webseite wird dynamisch mit JavaScript nachgeladen. Du bekommst also nur das zurück, was auch ein Webbrowser mit seinem Aufruf bekommt. Aber der beginnt dann eben mit dem Response zu arbeiten und JavaScript-Code auszuführen.

Wenn du die Seite also scrapen willst, musst du entweder einen Brower fensteruern oder in die Recherche gehen, was die Webseite über JavaScript lädt und das versuchen selbst durchzuführen.
Benutzeravatar
noisefloor
User
Beiträge: 3993
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

er VRN stellt eine API zur Fahrplanauskunft bereit, siehe https://www.vrn.de/opendata/API . Damit sollte das deutlich einfacher gehen als mit Webseitenscraping.

Gruß, noisefloor
k.marco.1970
User
Beiträge: 48
Registriert: Mittwoch 25. Dezember 2013, 20:46

Hallo noisefloor und sparrow,

ja, das kleine Beispiel ist ChatGPT. Danke für den Hinweis zu API. Es ist auch der Weg ein wenig das Ziel und das Scraping einer JavaScript-Seite würde ich gerne verstehen und bauen. Hat da jemand ein Minimalbeispiel, das er teilen oder einen Link posten kann? Bis dahin werde ich mich mit den Stichworten von sparrow auf die Suche machen nach Beispielen, wie man eine Seite fernsteuert und JavaScript selbst durchführt in der Abfrage.

Grüße
MK
Benutzeravatar
noisefloor
User
Beiträge: 3993
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du brauchst einen headless Browser, damit du das, was auf der Webseite passiert, auch nutzen kannst. Zwei populäre Python-Module dafür sind Selenium und Playwright.

Der Vollständigkeit halber sei noch angemerkt: Web Scraping gilt nicht als die feine Art, besonders dann nicht, wenn man an die Daten auch über eine (offizielle) API heran kommt. Kann auch sein, dass der Server der Webseite Gegenmaßnahmen gegen Web Scraper etabliert hat. Kann, muss aber nicht. Plus du machst dir das Leben unnötig selber schwer, wenn du scrappen willst, statt die API zu nutzen. Ist am Ende deine Frei- / Lebenszeit, die dafür drauf geht.

Gruß, noisefloor
Antworten