"Dirk" schrieb
Post by Dirkich beabsichtige den dynamisch erzeugten Inhalt einer Website (z.B mit
Börsenkursen) zu grabben und in eine Datenbank zu schreiben.
Welche Steuerelemente/Komponenten sind bei VB.Net hierfür am besten
geeignet. Da sich der Aufbau der Seite u.U. verändert, muss ich das
"Surfen" an die entsprechende Stelle eventuell ersteinmal simulieren.
- Startseite aufrufen
- den Link für Kurse suchen
- Kennnummer der Aktie angeben
- Ok klicken
- die erscheinende Seite durchsuchen und in den Kurs in die Datenbank
schreiben
Wie kann man das realisieren. Was benötige ich dafür. Womit kann man
da einsteigen. Kennt jemand eventuell Beispiele?
Hallo Dirk,
Mit Screenscrapern habe ich so leidliche Erfahrung...
Prinzipiell gibt es erstmal 2 Möglichkeiten (nachdem Du Dir über Herfrieds
rechtliche Bedenken klargeworden bist):
1.: Automation des IE (oder des WebBrowser-Controls)
2.: HttpWebRequest/Response.
Möglichkeit 1 sieht erstmal einfach aus:
Du kannst einfach mit WebBrowser.Navigate() zu einer Seite navigieren und
bekommst mit WebBrowser.Document eine Referenz auf das
MSHTML-Document-Objekt, das den Inhalt der Seite beschreibt, und auf dessen
DOM Du dann etwa per document.GetElementById() zugreifen kannst, etwa so,
wie Du das vielleicht auch aus JavaScript kennst.
Die Probleme stecken aber im Detail: ich habe z.B. die Erfahrung gemacht,
dass oft Events einfach nicht abgefangen werden können, das
DocumentCompleted-Event des WebBrowser-Controls, dass unverzichtbar für
diesen Weg ist (weil Du nur auf das Document zugreifen kannst, wenn es
fertig geladen ist) wird oft nicht ausgelöst, etc. Die Interop-Bibliothek,
die VS.NET um das WebBrowser-Control generiert, ist außerordentlich buggy.
Viele Dinge findet man nur durch Trial&Error heraus, das gilt insbesondere
für die MSHTML-Bibliothek, ich habe nie verstanden, wann ich HTMLDocument,
oder HTMLDocument2 oder IHTMLDocument oder IHTMLDocument2 nehmen muss, und
so ist das so ziemlich mit allen Elementen. Ausserdem ist nicht geklärt, was
passieren soll, wenn sich das Layout der Seite ändert, und der Link für die
Kurse nicht mehr da ist, wo er früher war.
Kurzum, wenn Du professionell programmieren willst (oder musst), und etwas
mehr als absolut triviale Dinge tun willst, dann ist das definitiv kein
gangbarer Weg.
Dennoch ein paar Links zu diesem Thema aus meiner Sammlung (einige C#,
trifft aber natürlich auch für VB.NET zu):
Creating a simple Web browser
Using ActiveX components in managed code
Exposing COM interfaces from managed code
Customizing the WebBrowser component
http://www.codeproject.com/books/0764549146_8.asp
Hosting a webpage inside a Windows Form
http://www.codeproject.com/csharp/winformiehost.asp
Using MSHTML Advanced Hosting Interfaces
http://www.codeproject.com/csharp/advhost.asp
Using the WebBrowser control in .NET
http://www.codeproject.com/csharp/webbrowser.asp
HOW TO: Invoke the Find, View Source, and Options Dialog Boxes for the
WebBrowser Control
http://support.microsoft.com/?id=311288
Host the WebBrowser Control in Visual Basic .NET
http://support.microsoft.com/?id=311303
Möglichkeit 2 bedeutet erstmal mehr Handarbeit:
Wenn die WebSite, die Du scrapen willst, zum Beispiel Cookies,
Authentifizierung oder irgendeine Art von Session-Management verlangt, musst
Du das selbst implementieren. Wenn Du mehr als nur eine Handvoll Seiten
scrapen willst, musst Du Dich zwangsläufig um asynchrone Aufrufe,
Multithreading, etc. kümmern, damit das ganze halbwegs performant ist.
Fehlerbehandlung ist nicht trivial: was passiert wenn keine
Internetverbindung vorhanden ist, wenn der Server der Site nicht erreichbar
ist, etc. Ausserdem bekommst Du von HttpWebResponse nur einen Stream zurück,
den Du vielleicht in einen String lesen kannst: die Links mittels Regex oder
sonstwas herauszufieseln ist ebenfalls eine wacklige Lösung. Dafür hast Du
dann aber auch volle Kontrolle darüber, was auf der Http-Ebene passiert.
Was würde ich Dir also empfehlen?
Eine wirklich gute Bibliothek für Screenscraping ist das "HTML Agility Pack
for .NET" von Simon Mourier[MS]
http://blogs.msdn.com/smourier/archive/2003/06/04/8265.aspx
Ich habe diese Bibliothek in mehreren Screenscraping-Projekt eingesetzt und
kann nur Gutes berichten.
Ein Beispiel für den Einsatz der Bibliothek findest Du hier:
http://groups.google.de/groups?selm=OV1rLwhlEHA.2864%40TK2MSFTNGP14.phx.gbl
oder hier
http://groups.google.de/groups?selm=eKpnFrtlEHA.1152%40TK2MSFTNGP11.phx.gbl
Die Bibliothek nimmt Dir den ganzen Request/Response-Kram, Multithreading,
Teile der Fehlerbehandlung und vor allen Dingen das Parsen der
zurückgelieferten Seiten komplett ab. Simon liefert ein paar gute Beispiele
mit, schau Dir das einfach mal an.
Ein Http-Tracer wird nützlich sein, um herauszufinden, was unter der Haube
so vor sich geht:
http://www.fiddlertool.com/fiddler/
BTW: In .NET 2.0 gibt es eine "WebBrowser"-Class, die, soweit ich das bis
jetzt getestet habe, die Probleme der alten IE-Automation löst.
http://msdn2.microsoft.com/library/5d67hf8a.aspx
Gruß
Arne Janning