- Anzeige -
aircross - high performance gliders
- Anzeige -
TURNPOINT - European Brands for Pilots
- Anzeige -
= fly it your way =
- Anzeige -
AUS LEIDENSCHAFT AM FLIEGEM
- Anzeige -
http://www.skyman.aero/de/gleitschirme/sir-edmund.html

Ankündigung

Einklappen
Keine Ankündigung bisher.

Programmierungs-Frage Xcontest / Python

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Programmierungs-Frage Xcontest / Python

    Ich mache statistische Auswertungen von Flügen die auf xcontest eingetragen sind.
    Brute-Force-Methode: xcontest "worldwide flight search" im Browser aufrufen, Tabelle mit Ctrl-C/Ctrl-V in ein Textfile kopieren.
    Nächste Seite aufrufen - wieder kopiern usw.
    Und das script liest dann das Textfile ein.

    Besser: Die Seite direkt im script aufrufen.

    Perl / LWP::Simple geht leider mit xcontest nicht (wie mit manchen anderen Seiten auch, dazu gibt es einen thread in stackoverflow).

    Nächster Versuch: Pyhton mit requests.
    Die url sieht z.B. so aus:
    https://www.xcontest.org/world/en/flights-search/?list[sort]=time_start&filter[point]=16.040952%2047.829427
    Dazu muss ich eingeloggt sein, ich probiere es so:
    (siehe https://realpython.com/python-requests/#authentication)

    >>> import requests
    >>> from getpass import getpass
    >>> requests.get('https://www.xcontest.org/world/en/flights-search/?list[sort]=time_start&filter[point]=16.040952%2047.829427', auth=('martinpi', getpass()))
    Password:
    <Response [401]>

    Mit HTTPBasicAuth, HTTPDigestAuth und HTTPProxyAuth funktioniert es auch nicht.

    Weiß jemand, welche Autorisierung xcontest verwendet und wie man sie implementiert?
    Evtl. mit einer anderen Programmiersprache/Library/Tool?
    Danke!

    (PS: Bitte keine Diskussion über die Sinnhaftigkeit von Statistiken u.ä., es ist wirklich nur eine Frage für ProgrammiererInnen)
    Ich habe so viel über die Gefahren des Fliegens gelesen dass ich jetzt ernsthaft überlege, gänzlich aufzuhören mit dem lesen.

    #2
    deine Methode wird so nicht funktionierten da der Login via Post request durchgeführt werden muss und unter anderem auch eine Session gespeichert.
    Auf github finden sich einige beispiele von bestehenden scrapern. Siehe z.B.:

    https://github.com/dbrgn/hnf-peaks/b...contest.py#L77

    (jeh nachdem wieviel traffic du verursachst wäre es aber wohl von vorteil mit dem xcontest team in kontakt zu treten um ggf einen API key zu erhalten
    oder mal mit ihnen abzuklären ob es bessere varianten gibt um an die Daten zu gelangen).

    Kommentar


      #3
      Zitat von abi Beitrag anzeigen
      deine Methode wird so nicht funktionierten da der Login via Post request durchgeführt werden muss und unter anderem auch eine Session gespeichert.
      Auf github finden sich einige beispiele von bestehenden scrapern. Siehe z.B.:

      https://github.com/dbrgn/hnf-peaks/b...contest.py#L77

      (jeh nachdem wieviel traffic du verursachst wäre es aber wohl von vorteil mit dem xcontest team in kontakt zu treten um ggf einen API key zu erhalten
      oder mal mit ihnen abzuklären ob es bessere varianten gibt um an die Daten zu gelangen).
      Super, vielen Dank!
      Den github-Link habe ich mir schon angeschaut, das ist genau das was ich brauche!

      xcontest habe ich schon angeschrieben, aber (noch) keine Antwort bekommen.
      Viel traffic werde ich (aus heutiger Sicht) nicht generieren.

      LG und Danke noch einmal!
      Martin
      Ich habe so viel über die Gefahren des Fliegens gelesen dass ich jetzt ernsthaft überlege, gänzlich aufzuhören mit dem lesen.

      Kommentar


        #4
        So, das Abfragen aus worldwide flight search tuckert schon brav vor sich hin.

        Jetzt versuche ich, flight details abzufragen. Also z.B. die Koordinaten von Start- und Landeplatz auszulesen.
        Aus der Tabelle der Flüge bekomme ich den Link zur Detail-Ansicht.


        Ich autherntifiziere mich wie im obigen Link beschrieben,

        Code:
        from requests_html import HTMLSession
        queryUr = 'https://www.xcontest.org/world/en/flights/detail:martinpi/18.6.2022/11:37'
        session = HTMLSession()
        auth_response = session.post(XCONTEST_URL_BASIC, data={
            'login[username]': username,
           'login[password]': password,
           'login[persist_login]': 'Y',
           })
        data = session.post (queryUrl)
        Das Problem dabei: Ich muss das Javascript interpretieren.

        Code:
        print ("rendering......")
        data.html.render() # Ich bekomme: MaxRetries: Unable to render the page. Try increasing timeout
        # data.html.render(timeout=100.0, retries=20) # bringt auch nichts
        print ("getting rendered data")
        dataString = data.html.full_text
        Ich bekomme: MaxRetries: Unable to render the page. Try increasing timeout

        ​Wenn ich den Inhalt von data in ein file schreibe und dieses file mit dem Browser öffne, passiert folgendes:
        mit Chrome oder Opera werde ich weitergeleitet zu https://www.xcontest.org/api/auth/seed/ und dann hängt der Browser.​
        Offensichtlich doch noch ein Authorisierungs-Problem.
        Blöderweise ist html.render() eine Portierung von Chromium.

        Wenn ich das file mit Firefox öffne, dann geht es. Ich sehe zwar keine graphische Darstellung des Fluges, aber die Daten wie die Koordinaten von Start- und Landeplatz.

        Jetzt habe ich mit pyautogui folgenden Würgaround gemacht.
        Das was ich in data bekommen habe, steht im file raw.html (damit ich es beim Test nicht jedes Mal neu abfragen muss).

        Code:
        import pyautogui
        import time
        import os
        
        firefox = "\"C:\\Program Files\\Mozilla Firefox\\firefox.exe\""
        url = "file://d:\\daten\\python\\raw.html"
        outFile = 'd:\\daten\\python\\test_firefox.html'
        
        os.system (firefox + " -new-window " + url)
        time.sleep (3)
        pyautogui.hotkey('ctrl', 's')                        # save file as
        time.sleep (1)
        pyautogui.write(outFile)                #            # filename to write
        pyautogui.press('enter')
        time.sleep (1)
        pyautogui.hotkey('alt', 'f4')                        # end firefox
        ​
        Mir ist klar, dass das eine Holzhammer-Methode ist.
        Wie geht es eleganter?
        Ich habe so viel über die Gefahren des Fliegens gelesen dass ich jetzt ernsthaft überlege, gänzlich aufzuhören mit dem lesen.

        Kommentar


          #5
          Meinen Link (hnf-peaks) hast du bereits gefunden. Nur noch ein Kommentar dazu: Wenn du zu lange / zu häufig scrapest, wirst du von XContest irgendwann automatisch gesperrt. Ich hatte den Leuten von XContest damals eine Email geschrieben und sie haben meine Heim-IP netterweise whitelisted.

          Bei einem anderen Projekt hingegen (https://www.gleitschirmdrachenforum....cc-threema-bot), welches 24/7 auf meinem Server läuft, bin ich einige Zeit später ebenfalls in irgend eine Blockade reingelaufen, und zwar komplett mit IP Blackholing, dann geht gar nichts mehr. (Obwohl ich nur 1x pro Minute den RSS-Feed abgefragt habe.) Die zwei E-Mails dazu wurden leider nie beantwortet. Glücklicherweise stand in diesem Jahr eh eine Servermigration an, damit gab's dann eine neue IP. RSS wird jetzt nur noch alle 3 Minuten abgefragt.

          Kommentar


            #6
            Ansonsten gibts auch Services die proxy rotation anbietet. Man zahlt halt dafür.

            Kommentar

            Lädt...
            X