DevTrain Startseite Advanced Developers Conference vom 14.-15. Februar 2011  
  
  
SUCHEN:  
ARTIKEL ONLINE: 525   

Kategorien
.NET
Datenbanken
Web
XML

Allgemein
Camp
Foren
Events
Persönliche Einstellungen
Registrieren
Prämien Shop
Kontakt
Impressum
Über DevTrain

Autoren


   Autor: Hannes Preishuber Artikel Drucken
        
DOT NetScrap: Der Raubüberfall aufs Web mit .NET

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.


 


DevTrain Camp - Schneller zum .NET 3.5 Developer
 
Verwandte Artikel      Verlinkte Dokumente
    Keine verknüpften Dokumente
    Keine Links vorhanden

  Erfasst am: 27.05.2002
  Gültig bis: 26.06.2002
7 Ratings
Bewertung: 54,3%
schlecht    sehr gut  

 
© Copyright 2007 ppedv AG