Discussion:
Grabben einer Website / Surfen simulieren mit VB.Net
(zu alt für eine Antwort)
Dirk
2004-10-05 11:48:03 UTC
Permalink
Hallo,

ich 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.
Die Schritte wären im einzelnen:
- 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?

Danke,

Dirk
Basil Brunner
2004-10-05 11:59:00 UTC
Permalink
Hallo Dirk
Post by Dirk
ich beabsichtige den dynamisch erzeugten Inhalt einer Website (z.B mit
Börsenkursen) zu grabben und in eine Datenbank zu schreiben.
[...]
Wie kann man das realisieren. Was benötige ich dafür. Womit kann man
da einsteigen. Kennt jemand eventuell Beispiele?
Auf ASPHeute gibt es dazu einige gute Artikel. Schau dir mal den
folgenden an und beachte auch die "verwandten Artikel" am Ende des
Dokuments.

http://www.aspheute.com/artikel/20000824.htm
--
Grüsse, Basil

Thunderbird - Reclaim Your Inbox!
http://www.mozilla.org/products/thunderbird/
Herfried K. Wagner [MVP]
2004-10-05 13:01:55 UTC
Permalink
Hallo Dirk!
Post by Dirk
ich beabsichtige den dynamisch erzeugten Inhalt einer
Website (z.B mit Börsenkursen) zu grabben und in
eine Datenbank zu schreiben.
Beachte, dass dies je nach Dienst, von dem du die Daten entnimmst, ggf.
nicht gestattet ist.

Zum Herunterladen von Dateien kannst du 'WebClient.DownloadFile' benutzen,
weiters ist vielleicht noch die Klasse 'WebRequest' nützlich.
--
Herfried K. Wagner [MVP]
<URL:http://dotnet.mvps.org/>
Arne Janning
2004-10-05 18:42:04 UTC
Permalink
"Dirk" schrieb
Post by Dirk
ich 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

Loading...