Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1828to1832
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
Download des Inhalts einer Internetseite
18.05.2021 14:33:13
Peter
Hallo Leute,
ich bin am verzweifeln!
Für ein privates Projekt möchte ich gerne einige der Seiten von offiziellecharts.de einlesen und die Inhalte auswerten.
Beispiel: https://www.offiziellecharts.de/titel-details-2145979
Ich habe schon öfter Internetinhalte per Excel VBA eingelesen. Keine Probleme!
Ich kenne zwei Methoden dazu, beide versagen hier.
Interessant ist auch, dass obiger Link auf einem Excel-Blatt als Hyperlink eingefügt auch dort nicht aufrufbar ist!
Ich habe eine Mappe mit meinen beiden Methoden hochgeladen:
https://www.herber.de/bbs/user/146256.xlsm
Hat irgend jemand noch eine Idee, wie ich an die Inhalte der Seite(n) komme?
Danke!

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Download des Inhalts einer Internetseite
18.05.2021 16:58:22
Zwenn
Hallo Peter,
hier mal ein kleiner Schubs in die richtige Richtung. Du veranstaltest ein viel zu großes Brimborium. Um den HTML Code einer Seite mit dem IE runterzuladen, reichen ein paar Zeilen. Beachte die Pause, nachdem der IE gemeldet hat, er habe die Seite vollständig geladen. Das hat er nicht, denn die eigentlichen Inhalte werden nachgeladen, sind also dynamischer Content. Die 5 Sekunden sind eine sehr stumpfe Methode für so eine notwendige Pause. Besser ist es, eine Schleife einzubauen, die auf das Vorhandensein eines bestimmten Elementes der zu ladenden Seite wartet. Die sollte mit einem Timeout versehen werden, falls das gewünschte Element nicht geladen werden kann.
Wozu Du den Timeout für die Instanzierung des IE brauchst erschließt sich mir nicht. Du bildest doch nur ein Objekt, das sich immer bilden lässt. Wenn das auf Deinem Rechner rumzickt, stimmt da was nicht. Ich habe im Wortsinn millionen von Seiten über den IE ausgelesen und habe nie erlebt, dass der nicht Instanziert werden konnte.
Deine Seite läuft noch im IE. aber mittelfristig solltest Du unabhängig von ihm werden, der wird nämlich gerade aktiv ausgemustetrt. Viele Seiten lassen sich mit ihm schon heute nicht mehr öffnen, andere haben Webtechniken integriert, die der IE gar nicht beherrscht und noch andere leiten direkt auf den Edge Browser um. Das Ding ist tot, töter am tötesten ;-)
Was auch immer Du auslesen willst, beschäftige Dich mal mit dem DOM (Document Object Modell). Davon schaust Du Dir das Interface "Element" an:
https://developer.mozilla.org/en-US/docs/Web/API/Element
Darin findest Du unter anderem die get-Methoden, von denen ich getElementsByTagName() verwendet habe. Mit dem selber parsen des HTML-Code-Strings machst Du Dir nur unnötig viel Arbeit.
Es folgt noch der Link zu meinem Profil auf SO. Ich antworte fast nur zum Thema WebScraping. Da findest Du also einige Beispiele zu unterschiedlichen Fragestellungen. Ansonsten kannst Du auf SO auch mal nach [excel] [web-scraping] suchen. Mit eckigen Klammern, dadurch suchst Du nach entsprechend getaggten Fragen. Solltest Du drüber stolpern, empfehle ich die Lektüre der Antworten von QHarr und SIM. Es gibt noch ein paar andere mehr oder weniger regelmäßig antwortende zu dem Thema, aber die beiden gehören zu den sehr guten Leuten mit viel Erfahrung.
https://stackoverflow.com/users/10046897/zwenn?tab=answers&sort=newest&page=1

Sub GetHTML()
Dim ie As Object
Dim url As String
url = "https://www.offiziellecharts.de/titel-details-2145979"
'Initialize Internet Explorer, set visibility,
'call URL and wait until page is fully loaded
ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate url
Do Until ie.readyState = 4: DoEvents: Loop
'Wait to load dynamic content after IE reports it's ready
Application.Wait (Now + TimeSerial(0, 0, 5))
Debug.Print ie.document.getElementsByTagName("html")(0).outerHTML
ie.Quit
End Sub
Viele Grüße,
Zwenn
Anzeige
AW: Download des Inhalts einer Internetseite
18.05.2021 18:50:30
Peter
Hallo Zwenn,
danke für deine ausführliche Antwort.
Dein Codebesispiel ist aber die abgespeckte Version genau der IE-Version, die tot, töter am tötesten ist ;---) ?
Nachdem ich dem Befehl 'ie = CreateObject(...' noch ein 'set' davor spendiert habe, habe ich ihn gleich getestet.
Ich hatte sogar den Bebehl 'ie.Visible = True' dringelassen, obwohl ich das in einer endgültigen Version nicht will.
Und natürlich hat die abgespeckte Version (bei mir) auch nicht funktioniert, aber, da der IE sein Fenster geöffnet hatte, konnte ich jetzt den Text lesen:
'Die Seite kann nicht angezeigt werden.
•Vergewissern Sie sich, dass die Webadresse https://www.offiziellecharts.de stimmt.
•Suchen Sie die Seite mit Ihrer Suchmaschine.
•Aktualisieren Sie die Seite in ein paar Minuten.'

Und tatsächlich kann der IE die URL 'http://www.offiziellecharts.de/titel-details-2145979' nicht auflösen, auch nicht, wenn man ihn händisch öffnet und dort die URL pastet!
Du hattest also auf jeden Fall recht mit 'IE ist tot'!!
Man muss dazu sagen: Ich habe Windows 7 und damit IE 11. Bei dir hat die URL im IE geöffnet?
Somit habe ich nun leider immer noch keine Lösung... :--(
Was macht die Seite nur mit diesem Aufruf? Hast du da irgendeine Idee? Also Edge, FF, Crome und Opera können die URL auflösen und die Seite darstellen. Wie könnte man das in VBA auch schaffen?
Ich wäre dir sehr dankbar, wenn du da einen Vorschlag für mich hättest.
Dein Vorschlag mit dem DOModell hilft je erst weiter, wenn ich den Inhalt der Seite runterladen kann, oder habe ich das falsch verstanden?
Grüße, Peter
Anzeige
AW: Download des Inhalts einer Internetseite
18.05.2021 21:21:12
Zwenn
Hallo Peter,
bei mir funktioniert die Seite noch im IE11. Allerdings arbeite ich unter Windows 10. Ob es aber OS bedingte Unterschiede des IE gibt kann ich nicht sagen. Ist ja eigentlich die gleiche Version. Ich kann übrigens auch Deinen in der Excel-Tabelle hinterlegten Link anklicken und er wird ganz normal im Standardbrowser geöffnet. Bei mir im FireFox.
Das Set habe ich vergessen wieder hinzuschreiben. Sorry :-) Ich hatte den Code kurz mit With createObject... ausprobieren wollen, um eine Variablendeklaration "einzusparen". Habe dass dann aber bleiben lassen und die Zeile (falsch) zurück geändert. Unterm Strich ging es mir darum, Dir die Sache mit der notwendigen Pause näher zu bringen. Aber wenn das kleine Beispiel bei Dir gar nicht läuft, ist das natürlich einigermaßen sinnfrei. Auf das DOM der Seite kannst Du auch erst zugreifen, wenn die Seite geladen ist, das stimmt. Der Hintergrund ist, dass es einen Baum (Datenstruktur) des HTML-Dokumentes gibt, auf den man gezielt zugreifen kann, der aber logischerweise für jede Seite individuell ist:
https://de.wikipedia.org/wiki/Document_Object_Model
Für viele Seiten kann man den Ansatz über xhr (XML HTTP Request) gehen. Damit ist man den IE los. Leider habe ich im Netzwerkverkehr der Seite keine Datei gefunden, die die Seitendaten direkt enhält. Mitunter findet man das Gesuchte einfach in der Haupt-HTML-Datei, in einer anderen HTML-Datei oder auch einem JSON. Für die vorliegende Seite scheint mir der Inhalt über JavaScript generiert zu werden. Es gibt so einige Dateien, die von YouTube, Spotify und Facebook sind. Das ist alles "eingebetteter Kram" sozusagen. Zu xhr ist vor allem anzumerken. dass ausschließlich statische Inhalte geladen werden. Es wird also nix nachgeladen, weil JS nicht ausgeführt wird. Somit sind auch AJAX Inhalte damit nicht zu bekommen, außer sie liegen bereits in einem JSON oder so vor.
Um trotzdem mit einem Browser arbeiten zu können, kannst Du SeleniumBasic bzw. den SeleniumWrapper für VBA verwenden. Was die Unterschiede sind bzw. ob es welche gibt, kann ich Dir leider nicht beantworten. Beide Lösungen werden seit geraumer Zeit nicht mehr weiter entwickelt soweit ich weiß. Sie funktionieren aber nach wie vor mit aktuellen Browsern und den zugehörigen aktuellen WebDrivern dafür. Selbst habe ich bisher erst ein paar Gehversuche mit SeleniumBasic unternommen und dafür den Chrome Browser verwendet.
Selenium ist ein Browser Automatisierungsprojekt, welches eigentlich zum automatisierten Testen von Webpages für Entwickler gedacht ist. Aber natürlich kann es auch zum Scrapen verwendet werden. Selenium bringt allerdings eigene Befehle mit. Vom Prinzip her funktioniert es, wie die Anwendung des DOM für den IE. Aber es wird anders aufgeschrieben und bietet wohl auch noch andere Möglichkeiten. Z.B. die Erstellung von Screenshots. Wie gesagt, da stecke ich selber noch in den Anfängen. Hier kannst Du Dich über Selenium selbst informieren. Dort findest Du aber keine Möglichkeit für die Verwendung mit VBA (soweit ich es gesehen habe). Wie Du es mit VBA verwenden kannst, beschreibe ich nach den folgenden beiden Links:
https://de.wikipedia.org/wiki/Selenium
https://www.selenium.dev/
Der einzige Browser, der sich direkt aus VBA heraus steuern lässt, ist der IE. Das ist nämlich der einzige, der von Haus aus eine COM Schnittstelle mitbringt:
https://de.wikipedia.org/wiki/Component_Object_Model
Die folgenden Schritte musst Du durchführen, um Das Dreigespann SeleniumBasic, Chrome und Chrome WebDriver mit VBA zum Laufen zu bringen:
  • SeleniumBasic runterladen und installieren: https://florentbr.github.io/SeleniumBasic/

  • Falls nicht vorhanden, die aktuelle Chrome Version runterladen und installieren: https://www.google.com/intl/de_de/chrome/

  • WebDriver für Chrome runterladen: https://sites.google.com/a/chromium.org/chromedriver/downloads
    Achtung: Es muss zwingend die Version sein, die zur installierten Chrome Browser Version identisch ist. (Aktuell 90)
    Entzippe das Archiv chromedriver_win32.zip und kopiere den WebDriver chromedriver.exe an die richtige Stelle. Dafür gibt es zwei Möglichkeiten:
    1. C:\Program Files\SeleniumBasic
    2. C:\Users\%username%\AppData\Local\SeleniumBasic

  • Öffne die VBA IDE in Excel und setze den Verweis auf Selenium Type Library
    Extras -> Verweise... -> Selenium Type Library
    Es gibt sicher auch eine Möglichkeit für Late Binding, aber mit dem Verweis hat man erstmal die Möglichkeit sich über den Object Explorer (F2 in der IDE) eine Übersicht der Möglichkeiten zu verschaffen. Beim Entwickeln selbst steht dann auch erstmal IntelliSense zur Verfügung. An dieser Stelle sei angemerkt, dass die Möglichkeiten von SeleniumBasic gegenüber den Versionen für andere Programmiersprachen wohl ziemlich eingeschränkt ist. Naja, das Basic muss ja irgendwo herkommen ;-) Ob das mit SeleniumWrapper anders ist weiß ich (noch) nicht. Link zum Download weiter unten. Testen musst Du dann ggf. selbst.

  • Kopiere folgendes Makro und führe es aus.
    
    Sub ErsteH1Auslesen()
    Dim bot As New WebDriver
    'URL aufrufen
    bot.Start "chrome", "https://www.offiziellecharts.de/titel-details-2145979"
    'Ohne die folgende Zeile wird die Seite nicht geladen
    'Keine Ahnung warum, aber mit klappt es,
    'auch ohne manuell programmierte Pause
    bot.Get "/"
    'Es sollte eine MessageBox mit der ersten gefundenen Überschrift
    'im Tag h1 angezeigt werden: NATHAN EVANS
    MsgBox bot.FindElementByTag("h1").Text
    End Sub
    

  • Hier ist noch der Link zu SeleniumWrapper. Ob es da mehr Möglichkeiten gibt oder ob die Einrichtung anders läuft, als für SeleniumBasic, kann ich nicht sagen. Das beginnt schon mit dem Ort, an den der WebDriver hingehört. Kann man aber sicher alles recherchieren:
    https://code.google.com/archive/p/selenium-vba/downloads
    Was mit SeleniumBasic übrigens Out Of The Box läuft, ist der PhantomJSDriver. Keine Ahnung warum. Das ist insofern interessant, weil das ein HeadlessBrowser ist. Der hat also keine GUI, rendert aber die Seiten und kann auch mit dynamischem Inhalt umgehen. Das weiß ich, weil ich damit die Aufnahme von Screenshots einer ganzen Seite getestet habe. Unter SeleniumBasic wird mit der Screenshot Methode leider nur der Sichtbare Teil als Grafik erfasst. Tja, wo nix sichtbares ist, da gibts auch keine Scrollbalken. Für wen denn? ;-) Also gibts mit der gleichen Methode die ganze Seite als Grafik (Ok, die Methoden sind für jeden WebDriver individuell vorhanden (siehe ObjectExplorer), aber identisch vom Umfang her, soweit ich gesehen habe.
    Das folgende Beispiel setzt einen Screenshot in die Excel-Tabelle in B2 (ohne YT-Vorschaubild):
    
    Sub DemoPhantomJSDriver()
    Dim bot As Selenium.PhantomJSDriver
    Dim transfer As Object
    Set bot = New Selenium.PhantomJSDriver
    'Hier habe ich mit dem setzen eines UserAgent getestet
    'Kann wichtig sein, wenn "ohne Agent" von einer Seite abgelehnt wird
    bot.AddArgument "I am a unicorn" '"user-agent=Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
    bot.Get "https://www.offiziellecharts.de/titel-details-2145979"
    bot.Window.Maximize
    Set transfer = bot.TakeScreenshot
    transfer.ToExcel Range("B2")
    End Sub
    
    So, ich hoffe das hilft Dir weiter. Auch wenn es ein komplett neues Feld aufmacht.
    Viele Grüße,
    Zwenn
    Anzeige
    Download des Inhalts einer Internetseite
    19.05.2021 16:21:07
    Anton
    Hallo zusammen,
    vielleicht reicht schon sowas?:

    Sub b()
      Dim objXMLHTTP As Object  
      Dim html As Object  
      Dim result As Object  
     
      Set html = CreateObject("htmlfile")  
      Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")  
      objXMLHTTP.Open "GET", "https://www.offiziellecharts.de/titel-details-2145979", False  
      objXMLHTTP.send
      If objXMLHTTP.Status = 200 Then  
        html.body.innerhtml = objXMLHTTP.Responsetext
       'Debug.Print html.body.innertext
        For Each result In html.getelementsbytagname("div")  
          If result.classname = ("container") And InStr(1, result.innerhtml, "big-head") <> 0 Then    
            MsgBox result.innertext
          End If  
        Next
      End If  
      Set objXMLHTTP = Nothing  
      Set html = Nothing  
    End Sub

    mfg Anton
    Anzeige
    AW: Download des Inhalts einer Internetseite
    19.05.2021 17:08:44
    Zwenn
    Hallo Anton,
    es geht also doch mit xhr, was mich überrascht. Ich habe es nicht getestet, weil ich überzeugt davon war, es kann nicht gehen, weil Inhalte nachgeladen werden. Danke für das Aufzeigen dieser Möglichkeit. In Zukunft also einfach mal Testen, bevor ich mit Kanonen auf Spatzen schieße :-)
    Deshalb dachte ich, es gehe nicht:
    Userbild
    Viele Grüße,
    Zwenn
    AW: Download des Inhalts einer Internetseite
    19.05.2021 18:32:15
    Peter
    Hallo Anton,
    danke für dein Code-Beispiel. Und auch das funktioniert nicht!
    Beim Abarbeiten des Befehls "objXMLHTTP.send"kommt die Fehlermeldung:
    "Laufzeitfehler '-2146697211 (800c00005)': Die angegebene Resource konnte nicht gefunden werden".
    (Mit der Zeile "objXMLHTTP.Open "GET", "https://www.herber.de/forum/" title="Auf der Suche nach einer Lösung für deine Excel-Probleme? Dann bist du beim Excel-Forum xlforum.herber.de genau richtig! Unser Forum bietet dir eine breite Palette an Expertenwissen, Tipps und Tricks rund um das Thema Excel. Egal, ob du ein Anfänger bist oder bereits Erfahrung hast, unsere Community steht dir jederzeit mit Rat und Tat zur Seite. Du möchtest mehr über die neuesten Excel-Features erfahren? Oder brauchst du Hilfe bei der Erstellung komplexer Formeln? Kein Problem! In unserem Forum findest du eine Vielzahl von Beiträgen, die dir dabei helfen, deine Excel-Kenntnisse zu verbessern. Und das Beste: Das Excel-Forum xlforum.herber.de ist komplett kostenlos! Melde dich noch heute an und werde Teil unserer wachsenden Community von Excel-Enthusiasten. Wir freuen uns darauf, dich kennenzulernen und dir dabei zu helfen, das Beste aus Excel herauszuholen!">" davor, funktioniert es dagegen einwandfrei!)
    Ich denke auch in deinem Code wird wieder auf den Internetexplorer (v11.0.9600.19596) in meiner Windows 7- Installation zurückgegriffen. Und der kann diese URL einfach nicht "parsen"! (Kommt leere Antwort).
    Ich hatte heute den ganzen Vormittag versucht, meinen IE upzudaten (geht nicht, ist die letzte Version von 2016) oder Einstellungen zu verändern (Alle Sicherheitsdinge ausgeschaltet, ...)
    Nichts hat geholfen. Scheinbar geht das nicht in Window 7... Hmmm.
    Die "Kanonen auf Spatzen" von Zwenn gehen im Moment deutlich über meinen Horizont... Seuftz...
    Danke, für Eure Versuche. Muss wohl einen neuen PC (Windows 10!) kaufen :--)
    Anzeige
    AW: Download des Inhalts einer Internetseite
    19.05.2021 19:22:33
    Zwenn
    Hallo Peter,
    Antons Script läuft bei mir einwandfrei. Es hat auch nix mit dem IE zu tun. Irgend etwas ist auf Deinem Rechner vergrießgnaddelt. Anders kann ich mir das nicht vorstellen und bin deshalb auch nicht sicher, ob Du mit Selenium Erfolg hättest (ist eigentlich eine Schritt für Schritt Anleitung und sieht nur auf den ersten Blick kompliziert aus). Mal fernab von irgendwelchen Analysen, wieso, warum, weshalb ...
    Was hast Du denn für einen Rechner? Also welche Hardware steckt da drin? Du musst ja nicht gleich einen neuen kaufen, wenn sich Win10 auf Deinem einfach installieren lässt. Ich weiß nicht, ob es noch immer funktioniert eine Win10 Lizenz bei laufender Win7 Lizenz zu bekommen, aber das wäre das erste, was Du probieren solltest, wenn Du auf Win10 willst. Mein Rechner ist jetzt 4,5 Jahre alt (Desktop PC mit Intel Kaby Lake CPU) und Win10 läuft auch in der aktuellen Version ohne irgendwelche Zicken. Selbst auf einem 2013 zusammengestellten Rechner mit AMD APU läuft Win10 einwandfrei. Also bitte nicht gleich Hardware ablösen, die Deinen Anforderungen eigentlich noch entspricht, nur weil ein Excel-Makro nicht will :-) Ich gehe sogar davon aus, dass eine saubere Neuinstallation von Win7 zum Erfolg führen würde. Aber wenns geht, auf Win10, weil alles drunter wird von MS nicht mehr supportet.
    Viele Grüße.
    Zwenn
    Anzeige
    AW: Download des Inhalts einer Internetseite
    21.05.2021 12:42:59
    Peter
    Also, das hat mir jetzt keine Ruhe gelassen mit Windows 7.
    Neben meinem PC mit Win 7 Professional habe ich noch einen Laptop mit Win 7 Home. Habe es dort versucht: Mit beiden Methoden FEHLER! "URL nicht gefunden". Es muss also generell an Windows 7 liegen. Beide Win 7 - Installationen sind auf dem neuesten Stand!
    Außerdem, wie gesagt, benutze ich diese Methoden schon viele Jahre für viele verschiedene Internetseiten und alle hatten und haben kein Problem.
    Irgendetwas ist schon besonders an dieser URL. Und das kann Windows 7 nicht ab...
    Die URL hat auch keinen Eintragen in der Hosts-Datei, Anton!
    OK, im Moment habe ich wenig Zeit, werde mich später mal mit 'Selenium' beschäftigen. Vielen Dank für Eure Unterstützung!
    Anzeige
    AW: Download des Inhalts einer Internetseite
    20.05.2021 12:05:31
    Anton
    Hallo Peter,
    
    Muss wohl einen neuen PC (Windows 10!) kaufen 
    
    musst du nicht, schau dir das hier an.
    mfg Anton
    Seite gesperrt?
    20.05.2021 12:40:30
    Anton
    Hallo nochmal,
    kann es sein, dass die Seite durch den Eintrag in der Datei "C:\Windows\System32\drivers\etc\hosts" gesperrt ist?
    mfg Anton

    20 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige