Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1944to1948
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 Anzahl div Class auslesen

Web Scraping Anzahl div Class auslesen
25.09.2023 09:07:55
Reaper Grim
Hallo Jungs,

ich hatte vor geraumer Zeit schon mal eine Frage bezüglich Web Scraping hier gestellt " https://www.herber.de/forum/archiv/1924to1928/1924269_Web_Scraping.html ",
jetzt steh ich vor einem anderen Problem.
Ist es möglich aus einem "div class" Container die Anzahl der untergeordneten "div classes" zu ermitteln und diejenigen die ein bestimmtes Kriterium enthalten als Zahl auszugeben und entsprechend in eine Zelle zu schreiben???

Hintergrund ist, dass diese classes keine Informationen enthalten, sondern nur bestimmte Präfixe. Diese classes beziehen sich auf der Webseite nur auf Images, die entweder als aktiv oder Inaktiv dargestellt werden.

https://www.herber.de/bbs/user/163091.xlsx

Meine Frage ist, ob es möglich sowas zu bewerkstelligen oder ob ich mir nen anderen Weg suchen muss.

vielen Dank und viele Grüße
Reaper




4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Web Scraping Anzahl div Class auslesen
25.09.2023 13:15:57
Zwenn
Hallo Reaper,

ich habe mir die Seite angesehen und Dir folgendes Makro gebastelt. Im Kern solltest Du verstehen, wie Du an den gesuchten Wert kommst. Habe ich ausführlich erklärt. Das Makro ist ein lauffähiges Beispiel, dass Dir in einer Tabelle die Schiffsnamen inklusive Verlinkung auf die Schiffseite und die Anzahl der inaktiven Sterne liefert.


Sub GetShipData()

Dim url As String
Dim doc As Object
Dim nodeAllShips As Object
Dim nodeOneShip As Object
Dim shipName As String
Dim shipUrl As String
Dim sheetInUse As Worksheet
Dim currRow As Long

Set sheetInUse = ActiveWorkbook.ActiveSheet 'Bei Bedarf Anpassen
currRow = 1 'Bei Bedarf Anpassen
url = "https://swgoh.gg/p/231956643/ships/" 'Anpassen, ggf. mit in eine Schleife packen
Set doc = CreateObject("htmlFile")

With CreateObject("MSXML2.XMLHTTP.6.0")
.Open "GET", url, False
.send
If .Status = 200 Then
doc.body.innerhtml = .responseText

'Alle Schiffe auslesen
Set nodeAllShips = doc.getElementsByClassName("collection-ship")

'Alle Schiffe durchgehen
For Each nodeOneShip In nodeAllShips
'Schiffsname für die Zuordnung auslesen und Seite zum Schiff verlinken
'Die Ausgabe erfolgt in der oben angegebenen Tabelle und in der oben angegeben Zeile in Spalte 1
shipName = nodeOneShip.getElementsByClassName("collection-ship-name")(0).innertext
shipUrl = nodeOneShip.getElementsByClassName("collection-ship-name")(0).getElementsByTagName("a")(0).href
shipUrl = Replace(shipUrl, "about:/", "https://swgoh.gg/")
sheetInUse.Hyperlinks.Add Anchor:=Cells(currRow, 1), Address:=shipUrl, TextToDisplay:=shipName

'Der gesuchte Wert kann einfach ermittelt werden, indem eine Node Collection über die Klasse
'ship-portrait__star--inactive gebildet wird. Diese ist in den nicht gewünschten Sternen nicht
'vorhanden. Das funktioniert, weil mit getElementsByClassName() jede der angegebenen Klassen für
'sich abgefragt werden kann. Die Klassen sind meistens durch Leerzeichen voneinander getrennt.
'Die Node Collection wird in jedem Fall gebildet, auch wenn die abgefragte Klasse nicht gefunden
'wird. In dem Fall enthält die Node Collection keine Elemente, womit Length den Wert 0 liefert.
'Die Ausgabe erfolgt in der oben angegebenen Tabelle und in der oben angegeben Zeile in Spalte 2
sheetInUse.Cells(currRow, 2) = nodeOneShip.getElementsByClassName("ship-portrait__star--inactive").Length

currRow = currRow + 1
Next nodeOneShip
Else
MsgBox "Seite konnte nicht geladen werden. HTML status: " & .Status
End If
End With
End Sub

Viele Grüße,

Zwenn
Anzeige
AW: Web Scraping Anzahl div Class auslesen
28.09.2023 09:58:59
Reaper Grim
Hi,

vielen vielen Dank erst mal an Dich Zwenn für Deine wieder mal schnelle Antwort. Das Makro läuft super, muss aber noch das mit den Sternen etwas umgestalten, weil nur die Anzahl der inaktiven Sterne angezeigt werden. Ich muss das ganze umdrehen. Sprich wenn zb. 3 Sterne inaktiv sind dann soll in der Zelle 4 stehen, weil ja 4 aktiv sind und wenn alle Sterne erreicht sind dann soll dann entsprechend die 7 drin stehen.

Aber eine kleine Bitte hätte ich noch. Ist es möglich noch zusätzlich die "Crew Mitglieder" zu den jeweiligen Schiffen hinzu zu fügen ???

Da ich bereits eine Schleife für die ganzen Charaktere laufen lasse und mir die entsprechenden Werte hole, weiß ich nicht wie ich das am besten löse, ob ich den Code entsprechend in die bestehende Schleife mit integriere oder ob ich das ganze in einer separaten Sub laufen lasse.

Das ganze soll in etwa so aussehen:

Charakter1 | Wert1 | Wert2 | Wert3 | Wert4 | Ship | Anzahl Sterne
Charakter2 | Wert1 | Wert2 | Wert3 | Wert4 | Ship | Anzahl Sterne
Charakter3 | Wert1 | Wert2 | Wert3 | Wert4 | Ship | Anzahl Sterne

Wenn ein Charakter kein Schiff hat dann soll nichts drin stehen.

viel Grüße
Reaper


Anzeige
AW: Web Scraping Anzahl div Class auslesen
28.09.2023 18:15:00
Zwenn
Hallo Reaper,

ich hatte wohl nicht richtig gelesen und dachte, Du willst die Anzahl der inaktiven Sterne. Hatte mich schon gewundert. Aber die Anzahl der aktiven bekommst Du ja einfach, wenn Du vor den Auslesepart mit .Length am Ende 7 - schreibst. Hätte ich daran gearbeitet die Zahl der aktiven Sterne rauszufinden, hätte ich es ganz genauso gemacht. Denn die Klasse für die inaktiven taucht ja nur auf, wenn es sie gibt. Diese Einträge sind also am einfachsten zu bestimmen.

Ich habe versucht die Namen der Crews auszulesen. Im HTML Code stehen die in einem Attribut namens data-original-title und man würde eigentlich mit folgender Zeile da ran kommen:
sheetInUse.Cells(currRow, currCol) = nodeOneCrewMember.getAttribute("data-original-title")

Allerdings werden die eigentlichen Daten, bzw. Inhalte der Seite offenbar über JavaSkript nachgeladen, während die Seite im Browser aufgebaut wird. Das bedeutet, es sind dynamische Inhalte und die lassen sich mit xhr nicht auslesen. Damit kann man nur statische Dokumente von einem WebServer laden. Ich habe auch nachgesehen, was sonst für Dateien zu der Webseite geladen werden, damit sie funktioniert. Ich hatte auf ein JSON gehofft, aber die Daten sind nirgendwo enthalten.

Um doch dran zu kommen, bräuchte man z.B. SeleniumBasic. Damit kann man z.B. Chrome oder Edge automatisieren. Das muss allerdings installiert werden und es gehört noch ein sogenannter WebDriver für den gewählten Browser dazu. Die WebDriver arbeiten irgendwann nicht mehr mit älteren Browser Versionen zusammen und müssen dann erneuert werden.
https://stackoverflow.com/questions/57216623/using-google-chrome-in-selenium-vba-installation-steps/57216623#57224810

Es soll aber eine Möglichkeit geben, den Edge Browser durch Einträge in die Windows Regestry doch wieder in die Lage zu versetzen, dass er direkt aus VBA heraus angesprochen werden kann. So, wie damals der Internet Explorer. Ich habe das bisher nicht ausprobiert:
https://stackoverflow.com/questions/70619305/automating-edge-browser-using-vba-without-downloading-selenium/71994505#71994505

Deinen Wunsch, Daten zu Charaktären auszulesen, habe ich nicht wirklich verstanden. Meinst Du mit Charaktäre die Crew Mitglieder oder Daten zu Schiffen von anderen Spielern? Ich habe auch keine Listen gesehen, die nur vier Werte enthalten. Lade doch mal hoch, was Du bisher hast. Das ist am einfachsten, weil Du Dich daran ja bereits probiert hast. Füge auch gerne eine Tabelle ein, in der Du von Hand das gewünschte Ergebnis mit ein paar echten Daten füllst und wo Du sie her hast.

Viele Grüße,

Zwenn
Anzeige
AW: Web Scraping Anzahl div Class auslesen
29.09.2023 12:34:35
Reaper Grim
Hi Zwenn,

Ok gut bissl blöd geschrieben. Ich hab ne Projekt Mappe (noch nicht ganz fertig) wo ich für jedes Mitglied einer Gilde sämtliche Charaktere auslesen lasse und anschließend die Rohdaten entsprechend weiter behandle und analysiere.

aktuell sehen die eingelesenen Roh daten in etwa so aus

Mitglied 1 ________________________Mitglied 2 ........... usw
Charakter1 | wert1 | wert2 | wert3 Charakter1 | wetr1 | wert2 | wert3 ............ usw
.
.
.
.usw

Eigentlich möchte ich noch zu den jeweiligen Charakteren die zusätzlich noch ein Schiff besitzen diese hinten dran hängen, bin mir mom nicht sicher ob es nicht einfacher wäre für "Charaktere" und "Schiffe" nicht 2 seperate Blätter zu benutzen.

in etwa so
Mitglied 1 ______________________________________________________ Mitglied 2 _____________________________________________________________........... usw
Charakter1 | wert1 | wert2 | wert3 | Schiffname | Anzahl_Sterne Charakter1 | wetr1 | wert2 | wert3 | Schiffname | Anzahl_Sterne ______ ............ usw

Ich hab ne Excel angehängt. Hoffe die ist hilfreich

https://www.herber.de/bbs/user/163162.xlsm

viele Grüße
Reaper




Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige