Gescriptetes Frameset im iFrame - Habs geknackt
21.11.2018 17:31:32
Zwenn
Hallo Thomas,
das Thema hat mir jetzt keine Ruhe gelassen. Ich habe mir die Seite nochmal angesehen und bin den Quelltext systematisch durchgegangen. Also im Quelltext der ersten Seite befinden sich unter anderem iFrames. Der mit der ID main enthält ein Dokument, in dem durch ein JavaScript ein Frameset aufgebaut wird. Man kann auf dieses Frameset nicht mit der herkömmlichen Methode zugreifen, wie wir am Nachmittag gesehen haben. Man kann aber das Script zerpflücken und die URL extrahieren, mit der die Seite aufgerufen werden kann, die Deine gewünschte Information enthält.
Ich habe das Makro mit entsprechenden Kommentaren versehen. In der folgenden Lösung habe ich mir alle Prüfungen gespart, ob ein Objekt gebildet werden konnte.
Sub datazwei()
Dim my_url_1 As String
Dim my_url_2 As String
Dim ie As Object
Dim knoten_iFrame As Object
Dim knotenAst As Object
Dim knotenZweig As Object
Dim splitArrayJSganz() As String
Dim splitArrayJSzeile() As String
Dim pruefText As Variant
Dim frameURL As String
my_url_1 = "http://gestis.itrust.de/nxt/gateway.dll/gestis_de/492410.xml"
my_url_2 = "?f=templates$fn=default.htm$vid=gestisdeu:sdbdeu$3.0"
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate my_url_1 & my_url_2
Do While ie.readyState 4: DoEvents: Loop
'Den richtigen iFrame über seine ID finden
Set knoten_iFrame = ie.document.getElementById("main")
'Auf den Inhalt des iFrame zugreifen und alle JavaScripte einsammeln
Set knotenAst = knoten_iFrame.contentWindow.document.getElementsByTagName("script")
'Alle JavaScripte durchgehen, um den Link für das benötigte HTML Dokument zu finden
'Es ist wahrscheinlich immer das zweite Script. Aber auf diese Weise ist man bei
'Änderungen an der Seite etwas abgesichert
For Each knotenZweig In knotenAst
If InStr(1, knotenZweig.innertext, "var doc_body_src") > 0 Then
'Das JS in seine Befehls-Abschnitte zerlegen
splitArrayJSganz = Split(knotenZweig.innertext, ";")
'Jede Zeile auf die Variablendefinition durchgehen
For Each pruefText In splitArrayJSganz
If InStr(1, pruefText, "var doc_body_src") > 0 Then
'Wenn der richtige Abschnitt gefunden wurde,
'diesen in ihre Beestandteile zerlegen
splitArrayJSzeile = Split(pruefText)
'Das sechste Array-Element enthält die gesuchte URL
'Die ist noch mit Anführungszeichen versehen, die
'direkt durch replace entfernt werden
frameURL = Replace(splitArrayJSzeile(5), Chr(34), "")
'Da der Link extrahiert wurde kann die
'pruefText-For-Schleife verlassen werden
Exit For
End If
Next pruefText
'Da der Link extrahiert wurde kann auch die
'knotenZweig-For-Schleife verlassen werden
Exit For
End If
Next knotenZweig
'Mit der so gefundenen URL wird die Seite, die eigentlich in einem
'Frame steht als alleiniges Dokument in den Browser geladen.
'Um die URL zu vervollständigen, muss die Grund-URL der Seite
'noch vorangestellt werden
ie.navigate "http://gestis.itrust.de" & frameURL
Do While ie.readyState 4: DoEvents: Loop
'Jetzt kann der gesuchte Wert einfach ausgelesen werden
MsgBox ie.document.getElementsByClassName("stoffe")(0).innertext
End Sub
Du hattest geschrieben, Du hast eine Tabelle mit CAS Nummern, die Du gerne durchgehen willst. Dazu muss man die Suche der Seite fernsteuern. An die kommt man auf ähnlichem Wege. Sie liegt in einem iFrame auf der zuerst aufgerufenen Seite. Das Eingabefeld und der Suchen-Button sind Input Elemente und sollten sich mittels Makro entsprechend bedienen lassen. Ich habe es aber nicht getestet. Auch hier ist wieder JavaScript im Spiel.
Um die Suche zu bedienen, darf sie nicht als eigene Browserseite geladen werden. Man muss den DOM-Pfad entsprechend aufbauen, um das Suchfeld zu befüllen und den Button zu klicken. Wenn man manuell die CAS Nummer der von Dir verlinkten Seite eingibt, flackert einmal kurz das Suchergebnis als Liste auf. Dann wird direkt die Seite geladen. Ich nehme an, weil es nur ein Suchergebnis dazu gibt. Wie es ist, wenn es mehrere Ergebnisse gibt weiß ich nicht und auch nicht, ob das bei der Eingabe einer CAS Nummer überhaupt vorkommen kann.
Wie Du siehst, ist es beim WabScraping nicht immer mit einem einfachen GetDiesUndDas() getan ;-)
Viele Grüße,
Zwenn