Was in ASP eigentlich recht komfortabel mit dem XMLHTTP Objekt möglich war, funktioniert in .NET gan z anders. Da WebServices und die Kommunikation mit XML voll implementiert sind, ist das klauen (scrapen) von Websites ist mit .NET nicht mehr ganz so wichtig. Trotzdem gibt es Fälle wo man es durchaus brauchen könnte.
Wir wollen hier bewusst die illegale Seite des Content Klau aussen vor lassen und bauen eine Suchmaschine für .NET Seiten. Dazu muss vom Indexer die Seite des Zielservers analysiert und indiziert werden. Logischerweise ist es nötig sich die Seiten auch holen zu können.
Der wichtigste Namespace dazu ist System.NET. Dieses liefert eine einfache implementierung von heutigen Netz Protokollen. Im Detail verwenden wir die beiden Klassen WebRequest und WebResponse welchen den Request und Response einfacher kapseln.
Eine Besonderheit des WebRequest ist, das es eine abstrakte Klasse ist und deshalb nicht über New und den Contruktor initianlisiert wird sondern über die Methode Create.
Bild:
Für die Benutzereingaben stehen eine Textbox und ein Button zur Verfügung. In der Seite wird noch HTTP vor der Textbox ausgegeben. Zum URL String muss deshalb noch http ect vorgestellt werden.
Dim Scrap As WebRequest Scrap = WebRequest.Create("http://" + txtUrl.Text) |
Als nächstes müssen wir uns um die Rückgabe vom WebServer kümmern. Hier hilft die Klasse Webresponse. Auch dies ist eine abstrakte Klasse und wird gefüllt über die Methode GetResponse eines WebRequest Objektes.
Dim result As WebResponse result = Scrap.GetResponse |
An dieser Stelle wirft man normalerweise einen Blick auf die Eigenschaften des Webresponse Objektes Result. Einzig sinnvolle Methode ist GetResponseStream, die allerdings nur einen nicht ganz einfach zu handhabenden Stream liefert.
Dazu benötigen wir aber den Namespace System.IO um die Klasse Stream überhqaupt zur Verfügung zu haben. Stream ist die Basisklasse für alle Streams (z.B StreamWriter und Streamreader) und handhabt allerdings nur Byte Ströme. Sie könnten an dieser Stelle nur den Status Code prüfen und das Scrappen auf später verschieben. Wir holen uns aber sofort die ganze Seite.
Ein direktes arbeiten mit dem Stream ist aufwendig und nicht sinnvoll. Vor allem die verschiedenen Codings der Websiten blieben unberücksichtigt. Wir verwenden den Streamreader um den Byte Stream mit einem festgelegten Encoding zu laden. Für das Encoden muss aber noch vorher der Namespace System.Text inkludiert werden. Das encoding wird dem StreamReader als Parameter mitgegeben.
Dim encode As Encoding Dim sr As StreamReader encode = Encoding.GetEncoding("utf-8") sr = New StreamReader(myStream, encode) |
Jetzt müss der Stream nur mehr gelesen werden. Die Methode Readline liefert Zeile für Zeile. Um zu Prüfen ob noch Zeichen da sind, prüft die fussgesteuerte Schleife mit dem Kommando Peak. Wenn kein Zeichen mehr zu lesen ist liefert es den Wert -1. Peak verändert die Position des Lese Cursors nicht.
Für sauberen Code müssen nun noch die Fehler behandelt werden. Wir wissen, dies ist am einfachsten über Try Catch. Am kompletten Eventhandler wird in der Exception die Message ausgegeben
Private Sub cmdSubmit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSubmit.Click Dim Scrap As WebRequest Try Scrap = WebRequest.Create("http://" + txtUrl.Text) Dim result As WebResponse result = Scrap.GetResponse Dim myStream As Stream = result.GetResponseStream() Dim encode As Encoding Dim sr As StreamReader encode = Encoding.GetEncoding("utf-8") sr = New StreamReader(myStream, encode) Do Response.Write(sr.ReadLine()) Loop While sr.Peek() <> -1 Catch ex As WebException lblFeedback.Text = ex.Message End Try End Sub |
Für unsere Suchmaschine fehlt hier natürlich noch eine Menge.
- Speichern der Seite in eine Datenbank
- Link analyse
- Suchinterface für den User
Dies wird sich hier aber sicher noch finden, speziell wenn Sie in unseren Foren von www.devtrain.de entsprechende Fragen posten.