Anzeige
Archiv - Navigation
1656to1660
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

WEb Scraping
20.11.2018 20:03:15
Thomas
Guten Abend zusammen,
bin gerade dabei mit VBA Internetseiten zu scrapen.
Bei meinen ersten beiden Skripts hat das auch sehr gut geklappt, leider funktioniert das dritte nicht, warum? Keine Ahnung.
Code
Sub datazwei()
my_url = "http://gestis.itrust.de/nxt/gateway.dll/gestis_de/492410.xml?f=templates$fn=default. _
htm$vid=gestisdeu:sdbdeu$3.0"
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate my_url
Do Until Not ie.Busy And ie.readyState = 4
DoEvents
Loop
e = ie.document.getElementByclassname("stoffe")(0).innertext
End Sub
in der letzten Zeile bekomme ich den Fehler 438 "Object does not support this property or method"
Bei allen anderen Seiten konnte ich immer getelementby (id, Name, class usw) verwenden, hier klappt das nicht.
Kann mir jemand sagen warum und wie ich das problem lösen kann?
Gruß
Thomas

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: WEb Scraping
20.11.2018 20:12:31
CitizenX
Hi
Element.getElementsByClassName()
VG
AW: WEb Scraping
21.11.2018 07:17:46
Thomas
Hi,
danke für die schnelle Hilfe.
Leider laufe ich jetzt in den felher 91 : "Object variable of With block variable not set"
Habe das Skript langsam durchlaufen lassen um fehler beim Laden der HP auszuschließen.
Diese Gestis Seite ist irgendwie komisch:(
Gruß
AW: WEb Scraping
21.11.2018 11:29:26
CitizenX
Hi,
der Classname "stoffe" existiert ja auch garnicht...
was brauchst du denn, bzw willst du auslesen, erreichen?
VG
Steffen
AW: WEb Scraping
21.11.2018 12:47:34
Thomas
Hallo zusammen,
danke für die Informationen, ich werde mir die andere Seite durchlesen.
Auf der Seite möchte ich nach CAS Nummern aus einem ExcelSheet suchen, dazu möchte ich die Seite steuern. Mit der CAS Nummer öffnet sich ein Sicherheitsdatenblatt und da möchte ich gerne daten wie z.b. den Stoffnamen herausziehen.
Habe bereits einiges ausprobiert, ob man direkt in der obenen suchbar suchen kann oder einen Link zu kreiern, klappt aber alles nicht.
Viele Grüße
Thomas
Anzeige
Das sind Frames
21.11.2018 13:09:29
Zwenn
Hallo Thomas,
jetzt habe ich mir die Seite auch nochmal angesehen. Sie ist aus mehreren Frames aufgebaut. Dein CSS-Klassenname steht im Frame, der die Informationen zum ausgewählten Stoff anzeigt. Dies ist der Link, um nur den Inhalt dieses Frames aufzurufen:
http://gestis.itrust.de/nxt/gateway.dll/gestis_de/492410.xml?f=templates$fn=document-frame.htm$3.0$GLOBAL=G_&G_DIEXSL=gestis.xsl$q=$uq=$x=$up=1
Das Problem ist, man kommt auf "normalem" Wege nicht an den Inhalt des Frames und wenn Du nicht rausfindest, wie der genannte Link dynamisch so aufgebaut werden kann, dass Du ihn für alle gewünschten Stoffe anpassen kannst, habe ich keinen Plan, wie man an die Infos kommen kann.
Der "normale" Weg, um an den Inhalt eines Frames zu kommen ist den DOM Pfad entsprechend aufzubauen. Z.B. so, wenn es der vierte Frame im Frameset wäre:
Set knotenAst = ie.document.frames(3).getElementByclassname("stoffe")(0)

Auf der Seite bekommt man aber die Fehlermeldung: Die Methode 'frames' für das Objekt 'JScriptTypeInfo' ist fehlgeschlagen
Die ganze Seite beinhaltet viel JavaScript. Um sich da durch zu wuseln brauchst Du entweder die Entsprechenden JS Kenntnisse oder jemander, der diese hat und bereit ist sich da durch zu wuseln. Ob man dann am Ende aber wirklich an die Daten kommt kann ich nicht sagen.
Falls Du Dir die Fehlermeldung mal "im Original" ansehen willst:
(Den Zeilenumbruch in der URL musst Du rausnehmen, den hat das Forum gesetzt)

Sub datazwei()
Dim my_url As String
Dim ie As Object
Dim knotenAst As Object
my_url = "http://gestis.itrust.de/nxt/gateway.dll/gestis_de/492410.xml?f=templates$fn=default. _
htm$vid=gestisdeu:sdbdeu$3.0"
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate my_url
Do While ie.readyState  4: DoEvents: Loop
Set knotenAst = ie.document.frames(3).getElementByclassname("stoffe")(0)
MsgBox knotenAst.innertext
End Sub
Viele Grüße,
Zwenn
Anzeige
AW: WEb Scraping
21.11.2018 11:37:43
Zwenn
Hallo Thomas,
du bekommst den Fehler, weil es im Quelltext der Seite keine CSS-Klasse mit dem Namen stoffe gibt. Woher hast du stoffe also genommen? Ich habe den Quellcode der Seite nur kurz auf dieses Wort geprüft und es kommt im gesamten Quelltext gar nicht vor. Ansonsten habe ich nichts weiter untersucht.
Es ist eine fehlende Objekt-Variable, weil über die Get-Befehle Teile des HTML-Codes als Objekte gespeichert werden. Ein Objekt hat Methoden und Eigenschaften. Die Get-Befehle sind Methoden, die du auch wieder auf auf mit ihnen gebildete Ergebnisse anwenden kannst. Das Stichwort dazu heißt DOM (Document Object Model)
Das ist jetzt sehr kompliziert ausgedrückt, ich weiß. Schau mal unter dem Link unter diesem Absatz nach. Da habe ich für jemanden aufgedröselt, was passiert, wenn man die Get-Befehle anwendet und da kannst Du auch nachlesen, wie Du die Fehlermeldung vermeidest, indem Du prüfst, ob das erwartete Objekt vorhanden ist. Ich verlinke mal direkt den Beitrag, in dem genau das drin steht. Der Thread ansich ist recht lang und enthält nochmehr Infos.
https://www.herber.de/cgi-bin/callthread.pl?index=1560197#1560268
Ich empfehle Dir unbedingt mit Option Explicit zu arbeiten. Diese beiden Wörter ganz oben in das Modul schreiben. Dadurch wirst Du gezwungen jede verwendete Variable im entsprechenden Modul zu deklarieren. Außerdem empfehle ich Dir für das Web Scraping unbedingt alles was Du mit den Get-Befehlen machst zunächst in eine Objekt-Variable zu speichern. Sonst kannst Du nicht prüfen, ob überhaupt möglich ist, was das Makro vor hat. Womit wir wieder bei dem von Dir genannten Fehler zur fehlenden Objekt-Variable sind.
Viele Grüße,
Zwenn
Anzeige
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
Anzeige
AW: Gescriptetes Frameset im iFrame - Habs geknackt
21.11.2018 20:36:34
Big
Hi Zwenn,
vielen lieben dank für deine Hilfe, werde den Code morgen anschauen und versuchen nachzuvollziehen. Kannst du mir einen Tipp geben, woher du dein Wissen hast, bzw wie ich mir das Wissen am besten aneignen kann?
Nochmals Danke.
Gruß
Thomas
AW: Gescriptetes Frameset im iFrame - Habs geknackt
21.11.2018 21:56:09
Zwenn
Hallo Thomas,
mit Web Scraping beschäftige ich mich seit einigen Jahren aus beruflichen Gründen. Wir recherchieren im Internet nach Produkt- und Markenpiraterie sowie Hehlerware. Als ich 2007 eingestellt wurde, bedeutete das, wir haben Ebay umgegraben. Inzwischen sieht die Welt des Onlinehandels aber völlig anders aus. Erstmal ging es damit los, dass wir plötzlich Daten von einer Seite brauchten, auf der nur bestimmte Produkte für einen bestimmten Zweig des Einzelhandels gelistet wurden. Dazu habe ich mir etwas ausgedacht, was "irgendwie" in Excel funktioniert hat. Vom DOM wußte ich da noch nix.
Heutzutage brauchen wir Daten von unterschiedlichen internationalen Handels-Plattformen, die in der Regel keine API haben, um direkt die Datenbanken anzuzapfen. Nachdem ich vor einigen Jahren auf das DOM gestoßen bin, habe ich dazu unendlich viel gegoogelt. Außerdem bin ich auf dieses wirklich gute Forum gestoßen. Ich habe hier sehr viele Beiträge gelesen, Code für meine Zwecke angepasst und mir auf diese Weise viel Wissen angeeignet. Davor kannte ich schon StackOverflow.
Ich habe mal ganz klassisch als Autodidakt angefangen, als ich 14 war und meinen ersten Computer kaufte, einen Comodore 128. Als ich später auf PC umgestiegen bin, hatte ich die Möglichkeit an Turbo Pascal von Borland ranzukommen (damals musste man Programmiersprachen noch kaufen). So habe ich mich mit dieser Programmiersprache beschäftigt. Mitte der 90er habe ich ein paar Semester E-Technik studiert. Das einzige was mich da interessierte war aber der Informatikteil. Dort lernte ich systematisch etwas über Algorithmen und Datenstrukturen. Als Programmiersprachen kamen Pascal, C und in Anfängen auch Java zum Einsatz. Parallel habe ich mich privat mit HTML und JavaScript beschäftigt. Das war zu einer Zeit, als mich Leute noch komisch anguckten, als ich ihnen sagte, sie könnten mir auch einfach eine E-Mail schreiben.
Mit VBA kam ich dann das erste Mal 2006 in Kontakt. Ich bekam einen Job, bei dem jeden Abend zwei Excel Listen mit tausenden von Zeilen abgeglichen werden mussten. Die Kollegen haben das ernsthaft von Hand gemacht. Ich bin noch am ersten Abend in die einzige ortsansässige Buchhandlung gegangen und habe die beiden einzigen Bücher zu VBA für Excel gekauft, die es dort gab. Nach ein paar Tagen hatte ich mein erstes Makro fertig, das die beiden Listen automatisch gegeneinander abgleichen konnte.
Also kurz gesagt ... Ich habe zuerst die Grundlagen des Programmierens gelernt. Die sind ganz unabhängig von VBA in den meisten Sprachen gleich. Strukturierte Programmierung, bestehend aus Sequenzen, Entscheidungen und Schleifen. Dazu andere Grundlagen, wie Datentypen, Variablen, Konstanten, Datenfelder, Unterprogramme, usw. Dieses Wissen ist auch noch unablässig, wenn man sich mit Objektorientierter Programmierung beschäftigt.
Deshalb löse ich in VBA manche Probleme nach wie vor auf "etwas merkwürdige Weise". Ganz einfach, weil ich manchmal nicht weiß, was Excel an Bordmitteln zur Verfügung stellt. Auch diesbezüglich ist dieses Forum eine Goldgrube. Irgendwann habe ich dann angefangen hier nicht nur Wissen zu ziehen, sondern auch zurück zu geben. Auch aus dem Grund, dass man selber viel lernt, wenn man sich mit den Problemen anderer beschäftigt.
Ich kann Dir eigentlich nur den altbekannten Tip geben, Dich mit dem Code anderer zu beschäftigen, die schon wissen wie es geht. Man kann sich auch unterschiedliche Lösungswege ansehen und nachvollziehen, damit rumprobieren, eigene Ideen ausprobieren. Grade was unterschiedliche Lösungen oder Ansätze angeht, ist ein Forum wie dieses oder StackOverflow sehr gut geeignet.
Viele Grüße,
Zwenn
Anzeige
AW: Gescriptetes Frameset im iFrame - Habs geknackt
22.11.2018 09:24:25
Thomas
Hi Zwenn,
danke für die Ausführung, dann bin ich ja auf dem richtigen Weg. Mit VBA habe ich erst vor einem Jahr angefangen, vor allem im Berich Data Cleaning und Data Management ist das Tool wirklich weltklasse. Mit der Steuerung anderer Programme durch VBA bin ich noch nicht oft in Kontakt gekommen. Habe bis dato nur Skripts für SAP geschrieben.
Mit dem Steuerung von Websiten öffnet sich natürlich eine ganz neue Welt für die Informationsbeschaffung.
Ich habe versucht deinen Code nachzuvollziehen, weiß noch nicht ob das erfolgreich war.
In deinem Beispiel nimmst du ja bereits den Link für Triethlyencitrat (492410.xml).
Kannst du mir vielleicht auch noch zeigen, wie ich die Website von Beginn an steuern kann, also direkt auf die Suchfunktion zugreifen kann. Ich habe im JS schon die Funktionen gefunden, weiß aber nicht genau wie ich der Variable (var diesuche) meine CAS-Nummern zuweisen kann.
Danke dir:)
Gruß
Thomas
Anzeige
AW: Gescriptetes Frameset im iFrame - Habs geknackt
22.11.2018 10:18:56
Zwenn
Hallo Thomas,
man kann zwar JS Funktionen in Webseiten auslösen, aber man hat keinen Zugriff auf die Variablen. Wie gesagt, habe ich noch nicht ausprobiert, ob die Suchfunktion der Seite sich so über den DOM Pfad ansteuern lässt, wie ich mir das vorstelle.
Der Link war ja der, den Du vorgegeben hattest. Ich bin da auch neugierig. Vor dem Wochenende komme ich allerdings nicht mehr dazu, mit der Suchfunktion rumzuexperimentieren.
Kurze Antwort heute Morgen. :-)
Viele Grüße,
Zwenn
AW: @Zwenn
22.11.2018 10:30:34
Fennek
Hallo Zwenn,
bekanntlich habe vor allem bei Dir die Analyse des DOM kennen gelernt. In einer ähnlichen Aufgabe gab es in diesem Link eine (für mich) neuer Variante mit QueryTable:
http://www.office-loesung.de/p/viewtopic.php?f=166&t=786160
mfg
Anzeige
PQ funktioniert hier nach meinem Verständnis nicht
23.11.2018 10:11:08
Zwenn
Hallo Fennek
Ja, mit dem von Dir angegebenen Link kommt man über Power Query an die Tabelle mit den Schiffsdaten. Das konnte ich so auch nachvollziehen. Aber im vorliegenden Fall dieses Threads funktioniert Power Query nicht. Die Seite verwendet sehr viel JS, und selbst die "normalen" DOM Werkzeuge versagen. Den Versuchszugriff über frames() hatte ich ja dokumentiert.
Weiterhin möchte Thomas gar nicht nur Informationen zu dieser einen Seite abrufen, sondern zu mehreren. Wenn man sich den Link mal ansieht, der auf den gelösten Teil verweist, wird einem schnell klar, dass da keine Parameter in der URL übergeben werden, wie man es sonst so oft sieht. (Parameterliste eingeleitet mit dem Fragezeichen und dann jeder Parameter getrennt durch das Kaufmanns-Und, bzw. Et-Zeichen.) Deshalb kann man die URL nicht einfach anpassen. Jedenfalls weiß ich nicht wie das gehen könnte.
Also muss man jede CAS Nummer über die Suche der Seite schleusen. Auch die liegt in einem iFrame. Wenn das klappt, kann man anschließend so auf die gewünschten Infos zugreifen, wie ich es gezeigt habe. Einen anderen Weg sehe ich da nicht, um den Vorgang zu automatisieren.
Viele Grüße,
Zwenn
Anzeige
AW: Gescriptetes Frameset im iFrame - Habs geknackt
23.11.2018 19:45:24
Anton
auch hallo ,
irgendwie so:
Code in Zwischenablage:

Sub b()
  Dim IEApp As Object, CAS As String, stoffe As String    
  CAS = "71751-41-2" 'anpassen
  Set IEApp = CreateObject("InternetExplorer.Application")  
  IEApp.Visible = True
  IEApp.Navigate "http://gestis.itrust.de"
  Do While IEApp.readyState <> 4: DoEvents: Loop  
  Application.Wait Now + TimeValue("0:00:02")
  Set e = IEApp.document.frames
  With e(0).document
    .getelementbyid("simpledyn").Value = CAS
    For Each inp In .getelementsbytagname("input")  
      If inp.Value = "Suchen" Then  
        inp.Click
        Exit For  
      End If  
    Next
  End With  
  Application.Wait Now + TimeValue("0:00:05")
  Set r = e(1).document.frames
  For Each t In r(1).document.getelementsbytagname("table")  
    If t.classname = "stoffe" Then  
      stoffe = t.innertext
    End If  
  Next
  IEApp.Quit
  Set IEApp = Nothing  
  MsgBox stoffe
End Sub  

mfg Anton
Anzeige
Faszinierend
23.11.2018 22:19:43
Zwenn
Hallo Anton,
ich sehe was Du machst und kann es vom Code her auch gut nachvollziehen. Aber ich verstehe noch nicht warum es funktioniert. Ich habe all möglichen Kram über frames ausprobiert, bekam aber immer die blöde Fehlermeldung zu JS. Deshalb habe ich die relativ komplizierte Lösung ausgeheckt.
Danke für Deinen erneuten Input und die kompakte Lösung :-)
Viele Grüße,
Zwenn

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige