Anzeige
Archiv - Navigation
1796to1800
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Web-Scraping - Wert nicht auslesbar

Web-Scraping - Wert nicht auslesbar
12.12.2020 09:20:29
Ollinger
Hallo zusammen
Vorab sollte ich vielleicht erwähnen, dass ich zwar super Excel Kenntnisse habe, aber in VBA echt ne Niete bin. Ich hab mir ein Makro zusammenkopiert bzw. gebastelt trifft es wohl eher :)
Ich würde gerne für meine Aktienanalyse mehrere Werte von Marketscreener.com auslesen. Das klappt soweit auch ganz gut. Nur bei einem Wert komme ich nicht weiter, aus welchen Gründen auch immer, lässt der sich nicht auslesen.
Hier der VBA Code:
'Abstand / Niedrigstes Ziel
Set allRowOfData = appIE.document.getElementsByClassName("RC_tdL")
myValue = allRowOfData(0).innerText
Range("B" & i).Value = myValue
hier der Code der Website:
Ich habe alle Variablen "RC_tdL", "RC_tr1" und "RC_tr0" ausprobiert,
auch verschiedene Zeilen: allRowofData(0) von 0 bis teilweise 20.
Welchen Lösungsweg würdet Ihr gehen? Ich hab das Excel mit Macro, Screenshots und links zur Seite auch angehängt. https://www.herber.de/bbs/user/142275.xlsm
Besten Dank für die Unterstützung
Oliver

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Web-Scraping - Wert nicht auslesbar
12.12.2020 11:18:24
volti
Hallo Oliver,
habe Deinen Code jetzt nicht weiter analysiert, aber vielleicht möchtest Du meinen Vorschlag zur u.a. Alternative mal ausprobieren.
Die holt einfach die angegebene Tabelle aus der Web-Site. Hier ist es die 33. Tabelle...
Das Ziel und die Weiterverarbeitung kannst Du dann ja noch anpassen.
Probiere es einfach mal aus.
Code:
[Cc][+][-]

Sub LadeDaten() 'Lädt Tabelle 33 in das Aktive Blatt LadeIETabelle ActiveSheet.Range("A1"), "https://de.marketscreener.com/kurs/aktie/BP-PLC-444968/analystenerwartungen/", 33 End Sub Sub LadeIETabelle(rZiel As Range, sUrl As String, Optional iTabNr As Integer) 'Tabelle aus einer WEB-Anwendung kopieren (KHV Okt 2018) Dim oIE As Object, sArr() As String Dim iZeile As Long, iSpalte As Long, iAnzZl As Long, iAnzSp As Long Set oIE = CreateObject("InternetExplorer.application") oIE.Navigate2 sUrl 'Zur Url surfen oIE.Visible = False While Not oIE.readyState = 4: DoEvents: Wend 'Warten bis Seite geladen ist With oIE.Document.all.tags("table")(iTabNr) 'x.Tabelle ansprechen iAnzZl = .Rows.Length iAnzSp = .Rows(0).Cells.Length ReDim sArr(iAnzZl, iAnzSp) For iZeile = 0 To iAnzZl - 1 For iSpalte = 0 To iAnzSp - 1 sArr(iZeile, iSpalte) = .Rows(iZeile).Cells(iSpalte).innerText DoEvents Next iSpalte Next iZeile End With If iAnzZl > 0 And iAnzSp > 0 Then _ rZiel.Resize(iAnzZl, iAnzSp).Value = sArr() 'Daten ausgeben oIE.Quit Set oIE = Nothing End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Web-Scraping - Wert nicht auslesbar
12.12.2020 12:59:13
Ollinger
Hallo Karlheinz
Vielen Dank für den Input. Ich hatte ja schon erwähnt dass ich die VBA Niete bin :)
Das Makro läuft zwar durch, aber es wird nichts ausgebeben.
Welche Parameter muss ich denn noch hinterlegen?
Und Wie bist du darauf gekommen, dass es Tabelle 33 ist?
Besten Dank & Viele Grüsse
Oliver
AW: Web-Scraping - Wert nicht auslesbar
12.12.2020 13:47:56
volti
Hallo Oliver,
ich habe nur Deine Vorlage genommen und mich mit der Web-Site nicht weiter beschäftigt. Also auch keine weiteren Parameter usw. vorgegeben.
Ich hatte kurz in den Web-Code geschaut und festgestellt, dass dort Tabellen drin sind.
Dann mit einem kleine Zusatzcode alle Tabellen durchgegangen und die Zeilenanzahl anzeigen lassen.
Es sind nur 2 Tabellen mit Zeilenanzahl >4, nämlich 29 und 33.
Beide ausprobiert => fertig.
Oliver, das war jetzt quick und dirty. Je nachdem was man will kann man das ggf. noch deutlich verbessern/erweitern.
PS: Auch mit Deiner Methode wäre man m.M.n. bestimmt auch zum Ziel gekommen, also doch gut, dass Du schon mal soweit gekommen warst. 👍
Hier mal Dein erweitertes Tool. Warum bei Dir jetzt nichts kam, da kann ich erst mal nichts zu sagen.
MarketScreener_Aktiendownload.xlsb
VG KH
Anzeige
AW: Web-Scraping - Wert nicht auslesbar
12.12.2020 14:53:11
volti
Hallo Oliver,
im Nachgang noch eine Variante, die gezielt "Deine" Tabelle aus der Web-Site holt. Die Identifizierung läuft über den Klassennamen "Bord", den es als Tabelle nur einmal gibt.
Code:

Sub DownloadIETabelle()
' Tabelle aus einer WEB-Anwendung kopieren
  Dim sArr() As String, oTable As Object
  Dim iZeile As Long, iSpalte As Long, iAnzZl As Long, iAnzSp As Long
  Dim rZiel As Range, sUrl As String
  
  sUrl = "https://de.marketscreener.com/kurs/aktie/BP-PLC-444968/analystenerwartungen/"
  Set rZiel = ThisWorkbook.Sheets("Aktienreport").Range("A1")
  
  With CreateObject("InternetExplorer.application")
    .Navigate2 sUrl                                     ' Zur Url surfen
    .Visible = False
    While Not .readyState = 4: DoEvents: Wend           ' Warten bis Seite geladen ist
    
    For Each oTable In .Document.all.tags("table")
       With oTable
          On Error Resume Next
          If .classname Like "Bord" Then                ' Klasse der gewünschten Tabelle
             iAnzZl = .Rows.Length
             If iAnzZl > 0 Then
                iAnzSp = .Rows(0).Cells.Length
                ReDim sArr(iAnzZl, iAnzSp)
                For iZeile = 0 To iAnzZl - 1
                    For iSpalte = 0 To iAnzSp - 1
                        sArr(iZeile, iSpalte) = .Rows(iZeile).Cells(iSpalte).innerText
                        DoEvents
                    Next iSpalte
                Next iZeile
             End If
          End If
       End With
    Next oTable
    
    If iAnzZl > 0 And iAnzSp > 0 Then _
    rZiel.Resize(iAnzZl, iAnzSp).Value = sArr()         ' Daten ausgeben
    .Quit
  End With
  MsgBox "Fertig", vbInformation, "Aktien abholen"
  
End Sub

_________
viele Grüße
Karl-Heinz

Anzeige
AW: Web-Scraping - Wert nicht auslesbar
13.12.2020 10:30:49
Ollinger
Hallo Karl-Heinz
wow vielen Dank für den Input. Ich würde mit meinem Ansatz nicht ans Ziel kommen, da irgendwann die Website blockt. Auch die Performance der Abfragen war bzw. ist unterirdisch schlecht. Daher zurück an Start :)
Mit Deinem letzten Ansatz ist die Auslese-Geschwindigkeit super, vielen Dank. Allerdings konnte ich vom Reiter "Finanzen" nur die erste Tabelle auslesen.
Vielleicht ist es besser zu verstehen, wenn ich etwas detaillierter erkläre was ich vor habe:
Meine ursprüngliche Idee war, die einzelnen Aktien (derzeit ca. 50 Titel) untereinander, also pro Zeile und die einzelnen Kennzahlen pro Spalte abzufüllen. Die Idee habe ich verworfen. Es ist zu kompliziert, da ich die einzelnen Kennzahlen dann noch transponieren und ggf. umwandeln müsste. Stattdessen würde ich jetzt pro Aktie ein Tabellenblatt mit den "Rohdaten" erstellen und das dann in einer Übersicht zusammenführen. Die Kennzahlen sind Abzüge unterschiedlicher Daten der einzelnen Tabellenreiter auf Marketscreener (Übersicht, Kurse, News, Rating, Termine, Unternehmen, Finanzen, Analystenschätzungen, Revisionen). Von den Unterseiten benötige ich diverse Kennzahlen/Tabellen, aber eben nicht alle. Die Tabellen würde ich mit etwas Abstand untereinander schreiben. Für die Auswertung ziehe ich mir dann die Daten aus den pro Aktie angelegten Tabellenblättern.
Dein erster Ansatz, bei dem Du alle Tabellen der Unterseite ausgelesen hast, würde bei der Anzahl der Aktien vermutlich den Rahmen sprengen.
Wo stehe ich gerade?
Unter
https://de.marketscreener.com/kurs/aktie/BYD-COMPANY-LIMITED-693358/fundamentals/
konnte ich die Tabelle "Unternehmenswert" mit "BordCollapseYear2" auslesen. Die zweite Tabelle auf der Website "Daten aus dem Jahresbericht" hab ich mit den Namen "std_txt th_inner " versucht und nichts erhalten. Wenn ich den weiter unten stehenden Namen "BordCollapseYear2" auslese erhalte ich wieder die erste Tabelle. Wie kann ich die zweite und dritte Tabelle vom Reiter "Finanzen" auslesen? Ich hab über die Funktion "Element untersuchen" nach dem übergeordneten Tabellennamen gesucht. Wie machst Du das?
Vielen Dank für Deine Unterstützung
Oliver
Anzeige
AW: Web-Scraping - Wert nicht auslesbar
13.12.2020 15:04:00
volti
Hallo Oliver,
Dein erster Ansatz, bei dem Du alle Tabellen der Unterseite ausgelesen hast, würde bei der Anzahl der Aktien vermutlich den Rahmen sprengen.
Die Sub LadeAlleAktienTabellen war nicht für den normalen Gebrauch gedacht, sondern nur zum Aufzeigen, welche Tabellen sich auf der Seite befinden.
Manche Tabellen sind ja auch leer oder enthalten unwichtiges Zeugs.
Natürlich holt man sich nun gezielt die gewünschte(n) Tabelle(n) ab.
Für's Massengeschäft baut man sich dann eine entsprechende Schleife oder Funktionen und/oder navigiert auf eine weitere Seite/Unterseite für weitere Daten.
Alles machbar, halt nur ggf. aufwändig. Wenn Dein Status "VBA bescheiden" noch stimmt, hast Du Dir da eine ganz schöne Aufgabe vorgenommen.
Ich hab über die Funktion "Element untersuchen" nach dem übergeordneten Tabellennamen gesucht. Wie machst Du das?
Ich schaue mir natürlich auch den Quellcode an, kopiere ihn ggf. in den Notepad-Editor, da kann man besser was suchen.
Dann versuche ich herauszubekommen, was ich benötige und welche Identifizierungsmöglichkeiten (id, name, classname...) es gibt.
Die zweite Tabelle auf der Website "Daten aus dem Jahresbericht" hab ich mit den Namen "std_txt th_inner " versucht und nichts erhalten.
Dieser Klassenname ist keiner Tabelle zugeordnet, sondern nur <div> und <td>. Das kann nicht funktionieren...
Wenn ich den weiter unten stehenden Namen "BordCollapseYear2" auslese erhalte ich wieder die erste Tabelle.
Eigentlich ist nur eine id einmalig. Alle anderen Paramter könnten mehrfachvorkommen. Insbesondere auch bei Klassennamen.
Lassen wir doch einfach einen Tabellenzähler als zusätzliches Kriterium mitlaufen.
BTW: Ich kenne die Web-Site nicht und bin auch nicht derjenige, der ständig Web-Sites abholt. Daher müsste mich da auch erst näher umschauen...
Da es um Aktien geht, hier mal mein Aktientool zur Ansicht und wie ich das machen würde.
Aktientool_Ariva.de.xlsb
Und hier noch mal eine Erweiterung zum Abholen mehrerer Tabellen in einem Rutsch, denn das Neu-Aktivieren des IE für jede Tabelle kostet zuviel Zeit.
Code:

Sub DownloadIETabelle()
' Tabelle aus einer WEB-Anwendung kopieren
  Dim sArr() As String, oTable As Object
  Dim iZeile As Long, iSpalte As Long, iAnzZl As Long, iAnzSp As Long
  Dim rZiel As Range, sUrl As String
  Dim sClassname() As String, sTabNr() As String
  Dim i As Integer, iRepNr As Integer
  
  sTabNr = Split("26,31,34", ",")                           'Hier die Tabellennummern eingeben
  
' sUrl = "https://de.marketscreener.com/kurs/aktie/BP-PLC-444968/analystenerwartungen/"
  sUrl = "https://de.marketscreener.com/kurs/aktie/BYD-COMPANY-LIMITED-693358/fundamentals/"
 
  Set rZiel = ThisWorkbook.Sheets("Aktienreport").Range("A1")
  rZiel.Parent.Cells.ClearContents
  
  With CreateObject("InternetExplorer.application")
    .Navigate2 sUrl                                         ' Zur Url surfen
    .Visible = False
    While Not .readyState = 4: DoEvents: Wend               ' Warten bis Seite geladen ist
'Mehrfachduchlauf der Tabellen, um auch die Reihenfolge bestimmen zu können
    For iRepNr = 0 To UBound(sTabNr)
      i = 0
'Untertabelle nach Klassen durchsuchen
      For Each oTable In .Document.all.tags("table")
         With oTable
            i = i + 1
If iRepNr = 0 Then Debug.Print i, .classname & "!"          ' Info: Anzeige der enthaltenen Tabellen
            On Error Resume Next
            If i = Val(sTabNr(iRepNr)) Then                 ' Klasse der gewünschten Tabelle
              
               Erase sArr
               iAnzZl = .Rows.Length
               If iAnzZl > 0 Then
                  iAnzSp = .Rows(0).Cells.Length
                  ReDim sArr(iAnzZl, iAnzSp)
                  For iZeile = 0 To iAnzZl - 1
                      For iSpalte = 0 To iAnzSp - 1
                          sArr(iZeile, iSpalte) = .Rows(iZeile).Cells(iSpalte).innerText
                          DoEvents
                      Next iSpalte
                  Next iZeile
               End If
               If iAnzZl > 0 And iAnzSp > 0 Then _
               rZiel.Resize(iAnzZl, iAnzSp).Value = sArr()  ' Daten ausgeben
               Set rZiel = rZiel.Offset(iAnzZl + 1, 0)      ' Nächste Zielzeile
            End If
         End With
      
      Next oTable
      
    
    Next iRepNr
    .Quit
  End With
  MsgBox "Fertig", vbInformation, "Aktien abholen"
  
End Sub

_________
viele Grüße
Karl-Heinz

Anzeige
AW: Web-Scraping - Wert nicht auslesbar
17.12.2020 13:04:11
Ollinger
Hallo Karl Heinz
Vielen Dank für Deinen Input. Ich konnte die Abfrage bereits umsetzen. Das Script läuft pro Aktie in ca. 1 Minute durch und zieht alle Daten ab. Im Gegensatz zu Deinem Tool, ziehe ich eine Menge Fundamentaldaten von der Website. Ich möchte analysieren wie sich die einzelnen Kennzahlen, Indikatoren und Parameter entwickeln und daraus meine Kauf-/Verkaufshandlungen ableiten. Ich hab Dir einen Zwischenstand des Tools mal angehängt. Bin mir aber nicht sicher, ob man alle Daten ohne Abo sehen kann.
Jedenfalls lade ich die relevanten Rohtabellen in den Reiter "Download", immer ab Spalte G. Teilweise überarbeite ich die Daten noch im Makro, teilweise mit Formeln im Frontend. Die Spalten A-D liefern die überarbeiteten Daten, welche Dann noch mal in einem copy/paste Template in der Zeile 18 dargestellt werden.
Kann ich Dich zu meinem nächsten Schritt noch mal etwas fragen?
Ich kämpfe da ebenfalls mit einigen Herausforderungen. Wobei, ich grosse Lernschritte gemacht habe, was meine VBA Kenntnisse angeht :)
Ich hatte mir das so überlegt. Im Tabellenreiter "Datenreihen" hinterlege ich die ISIN, den Link zur Website der Aktie und die Info "Daten aktualisieren". In der Tabelle werde im Laufe der Zeit weitere Aktien hinzugefügt. Über das Feld "Daten aktualisieren" steuere ich die einzelnen Datenabfrage pro Aktie.
Dann kopiert ein Makro die beiden Felder (ISIN, Link) in den Tabellenreiter "Download" in die Felder B2 und B3. Das Marko zur Datenabfrage wird aktiviert, die hinterlegten Formeln erstellen die Datensatz für die Tabelle und anschliessend kopiert das Marko den Datensatz aus Zeile "18" wieder zurück in den Tabellenreiter "Datenreihe" in die entsprechende Zeile der Aktie. Anschliessend beginnt die Prozedur von vorne bis keine "aktivierten Datenabfragen" mehr übrig sind.
So erhalte ich einen strukturierte Datenbasis für meine Analyse. Kann aber einzelne Aktien oder das gesamte Portfolio abfragen. Die Analyse hab ich noch nicht erstellt. Das ist der letzte Schritt, nachdem alle Daten vorliegen.
Das kopieren würde ich noch über den Makrorecorder hinbekommen, wobei ich nicht weiss, wie ich dem Makro sagen kann, dass es in die richtige Zeile schreibt. Da ja mehrere Werte in den Zeilen stehen und ggf. die alten Werte überschrieben werden. Das nächste ist, wie erstelle ich eine Schleife?
Nochmals herzlichen Dank für die Unterstützung.
https://www.herber.de/bbs/user/142398.xlsm
Viele Grüsse
Oliver
Anzeige
AW: Web-Scraping - Wert nicht auslesbar
17.12.2020 23:31:21
volti
Hallo Oliver,
vielen Dank für Deine Ausführungen.
Ich habe mal Dein Tool geschaut. Da hast Du ja schon vieles aufgebaut.
Ich empfehle Dir, obwohl Anfänger das ja nicht so gerne machen, das Ganze etwas strukturiert zusammenzufassen.
Wann immer größere Codeteile mehr oder weniger das gleiche machen, können diese z.B. in eine Sub/Function ausgelagert werden oder auch in einer Schleife abgearbeitet werden. Hierdurch gibt es den Code nur einmal und der kann dann auch leicht angepasst werden.
Wenn Du wirklich >50 Aktien mit mehreren Downloads abholen willst, dauert das schon eine Weile. In anderen Tools hole ich teilweise durch mehrere IE parallel ab. Das kann dann deutlich schneller gehen.
In der anliegenden Datei habe ich mal angefangen (ungetestet), wie es laufen könnte. Wenn Du möchtest, schreib mir eine eMail (guck in mein Aktientool), dann können wir das gerne bilateral gezielt weiterführen.
Ansonsten Einzelfragen gerne hier im Forum und natürlich viel Erfolg...
Aktentool.xlsm
viele Grüße
Karl-Heinz
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige