Formular einer Webseite anzapfen mittels QueryTable

Viele Webseiten (insbesondere Finanzportale) haben ein Suchformular. Dort kann man z.B. zu einer ISIN oder WKN die Seite der jeweils dazughörigen Aktie heraussuchen und davon z.B. die passende URL oder den entscheideneden URL-Teil in einer LIste speichern.

Diese URLs sind zum Beispiel hilfreich, um Tools zu bauen, mit denen man automatisch eine Menge Kennzahlen abrufen kann, die sich dann wiederum für alle nur denkbaren Investment-Strategien auswerten lassen.

Was ich hier beschreibe, funktioniert zwar nicht für alle Finanzseiten, aber für einige. Ich zeige das am Beispiel von Onvista (https://www.onvista.de). So in etwa erscheint die Seite mit der Suchmöglichkeit nach Name, WKN oder ISIN oben rechts.

Onvista Suche

Wenn wir in das Feld nun eine ISIN eingeben und suchen, landen wir direkt auf der Seite der zugehörigen Aktie, denn die ISIN ist eine eindeutige Kennzahl. Nehmen wir zum Beispiel die Adidas-Aktie. Die hat die ISIN DE000A1EWWW0. Wenn wir danach suchen, erscheint die passende Seite. Dort gibt es z.B. einen Link „Kennzahlen / Fundamental“. Klickt man den an, steht oben in der URL-Zeile genau das, was wir suchen, in unserem Beispiel: https://www.onvista.de/aktien/fundamental/Adidas-Aktie-DE000A1EWWW0.

Vorarbeit: Analysieren der Web-Seite

Wie können wir das nun automatisch ablaufen lassen, so dass es dann auch auf eine ganze Liste von ISINs, die in einem Excel-Sheet stehen, anwendbar ist?

Dazu müssen wir in Erfahrung bringen, wie das Suchfeld funktioniert und ob es für unsere Zwecke geeignet ist. So ein Suchfeld befindet sich innerhalb eines HTML-Formulars. Wir suchen dieses Formular nun im HTML-Quelltext der Internetseite heraus, um festzustellen, ob und wie wir es benutzen (ansprechen) können.

Dazu rufen wir im Browser mit der Seite die Entwicklerwerkzeuge auf. Das geht meistens mit F12. Es erscheint etwas derartiges mit einem „Inspektor“ oder „DOM-Explorer“, worin der HTML-Quelltext zu sehen ist.

Firefox Inspektor

Nun suchen wir uns die entsprechnede Stelle mit dem Formular heraus. Dazu können wir ein Auswahlwerkzeug (kleines Icon meistens ganz links im Inspektor/DOM-Explorer) verwenden und auf das Eingabefeld klicken. Wir können aber auch den HTML-Code nach „ISIN“ durchsuchen, um herauszufinden, wo im Code sich das Eingabefeld für die Suche und damit auch das Such-Formular befindet, und springen dadurch an die passende Stelle. Das sieht in etwa so aus:

HTML-Formular

Nun können wir ablesen, wie wir mit unserer Automatisierung vorgehen können. Ich gebe hier den Code-Ausschnitt wieder, der für uns interessant ist: Ich lasse dabei alles weg, was für uns irrelevant ist, bzw. ersetze es durch Punkte:

<form ... action="https://www.onvista.de/suche/" method="get">
   ...
   <input ... name="searchValue" placeholder="WKN, ISIN, Suchbegriff" ... type="search">
   <input ... type="submit">
   ...
</form>

Zunächst einmal sehen wir, dass dieser <form>-Code unserem gesuchten Formular entspricht, denn das Feld, in dem „WKN, ISIN, Suchbegriff“ steht, befindet sich darin, also innerhalb der Tags <form> und </form>.

Das Formular hat den Parameter method="get". Das ist die Methode, wie die Daten aus den Eingabefeldern des Formulars zur weiteren Verarbeitung übergeben werden. method="get" besagt, dass das über die URL geschieht, durch Anhängen von Parametern. In action="https://www.onvista.de/suche/" steht die URL.

Die Daten aus den Formularfeldern werden als Parameter an die URL angehängt. Das passiert mit vorangestelltem ?. Dann folgen die Angaben in der Gestalt feldname=feldwert. Mehrere werden durch ein & getrennt. Felder sind alle Elemente mit dem Tag <input>, die den Parameter type="text", type="hidden" oder type="search" haben. Von diesen interessieren uns jeweils die Parameter name und value.

Das Suchfeld hat name="searchValue". Als value wird das übergeben, was wir ins Feld eintragen, in unserem Fall also eine ISIN. Es gibt zwar noch weitere Felder mit type="hidden". Die kann man jedoch als Parameter weglassen. So etwas findet man durch Ausprobieren heraus. Die URL zum Suchen der Seite mit der ISIN DE000A1EWWW0, also der Adidas-Aktie würde wie folgt aussehen:

https://www.onvista.de/suche/?searchValue=DE000A1EWWW0

Wir können das ausprobieren, indem wir es einfach oben in die Adresszeile des Browsers eingeben bzw. hier auf den Link klicken. Wir landen tatsächlich direkt auf der Seite mit der Adidas-Aktie.

Bau der Excel-Lösung

Nun können wir eine Excel-Lösung bauen, die zu einer Liste von ISINs jeweils eine Web-Abfrage mit entsprechender URL durchführt und dann ausliest, was wir wissen wollen.

Beginnen wir mit einem Tabellenblatt, auf dem die Aktien mit ihren ISINs in Spalte A bzw. Spalte B stehen. In Spalte C soll dann die gesuchte Onvista-URL landen. Wir nennen das Blatt „Aktien“. So könnte es aussehen:

Tabellenblatt Aktien

Weiterhin brauchen wir ein Tabellenblatt, das wir „Web“ nennen. Das soll als Hilfsblatt für die Web-Abfragen dienen.

So können wir nun ein Makro schreiben:

Option Explicit

Sub OnvistaURLs()

    Dim shW As Worksheet
    Dim shA As Worksheet
    Dim qt As QueryTable
    Dim url As String
    Dim zeile As Integer
    Dim isin As String
    Dim rng As Range
        
    Set shW = Sheets("Web")
    Set shA = Sheets("Aktien")
    
    'Reste? Weg damit!
    For Each qt In shW.QueryTables
        qt.Delete
    Next

    'an diese URL wird jeweils die ISIN angehängt:
    url = "https://www.onvista.de/suche/?searchValue="
    
    'sie Liste der Aktien wird durchgegangen
    zeile = 2
    Do Until shA.Cells(zeile, 1).Value = ""
    
        'Fortschrittsanzeige:
        Application.StatusBar = "Verarbeite Zeile " & zeile
        DoEvents
        
        'Web-Abfrage durchführen
        isin = shA.Cells(zeile, 2).Value
        shW.Cells.Delete
        Set qt = shW.QueryTables.Add("URL;" & url & isin, shW.Cells(1, 1))
        With qt
            .WebSelectionType = xlEntirePage
            .WebFormatting = xlWebFormattingAll
            .WebDisableDateRecognition = True
            .Refresh (False)
            .Delete     'nur die QueryTable ist weg, die Daten sind noch da
        End With
        
        'Auswerten: Wohin führt der Link "Kennzahlen / Fundamental"?
        Set rng = shW.Cells.Find("Kennzahlen", shW.Cells(1, 1))
        If Not rng Is Nothing Then
            '2 Zeilen tiefer steht der Link zu den Fundamentalkannzahlen
            Set rng = shW.Cells(rng.Row + 2, 1)
            If rng.Hyperlinks.Count > 0 Then
                'Das ist die gesuchte URL:
                shA.Cells(zeile, 3).Value = rng.Hyperlinks(1).Address
                DoEvents
            End If
        End If
        
        zeile = zeile + 1
    Loop        'nächste Zeile
    
    'Aufräumen und fertig:
    For Each qt In shW.QueryTables
        qt.Delete
    Next
    shW.Cells.Delete
    
    Application.StatusBar = "OK"
    
End Sub

Was hier besonders zu beachten ist, ist die Eigenschaft qt.WebFormatting = xlWebFormattingAll, so dass dann auch Hyperlinks verfügbar sind. Um zu sehen, was auf dem Tabellenblatt „Web“ beim Ausführen der Web-Abfrage ankommt, kann man im Debugger gleich nach dem Ausführen der Abfrage anhalten. So erhält man einen Eindruck, warum der Code so gebaut wurde.

Nachdem das Makro gelaufen ist, sieht es in der Tabelle etwa so aus:

Tabellenblatt Aktien

Statt der gesamten URL könnte man natürlich auch nur jeweils den spezifischen Teil in die Tabelle schreiben, ja nachdem was man benötigt.