Daten laden

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Higlav.

    Daten laden

    Hallo Zusammen

    Ich hoffe ich bin hier im richtigen Unterforum :/

    Ich habe einige Fragen zum herunterladen von Quellcode.
    Momentan lese ich den Quellcode von einer Website aus und mit RegEx die Fussball Resultate.
    Somit kann ich diese Fussballtabelle in meinem Programm weiter verarebeiten.

    Nun wenn ich dies mit 10 Tabellen mache ist dies sehr Zeitaufwendig. Könnt Ihr mir Tipps geben wie ich dies schneller machen kann? Oder wie ich die Performance erhöhen kann?
    Hier mein bisheriger Ablauf:
    - Quellcode der Website downloaden.
    - Mit RegEx Matches auslesen.
    - Tabellen Resultate weiter verarbeiten.

    Vielen Dank für Eure Antworten.

    Freundliche Grüsse

    Lingo
    Also wenn ich Internetseiten auslese/verarbeite, dauert das pro Seite vielleicht 1 Sekunde(abhängig davon, wie lange der Serer für die Antwort braucht). Wie gehst du denn vor? Sicher nicht mit 'nem WebBrowser, oder? :rolleyes:
    Ich habe mir beispielsweise eine Basisklasse für Internetseiten aufgebaut, die mit POST- und GET-Methoden arbeitet, den Quellcode hält und verarbeitet. Dann erben alle spezifischeren Seiten von dieser Klasse und bedienen sich des darunterliegenden Quellcodes. Funktioniert momentan ziemlich performant. Aber eben: Man kann auch mit einem noch so guten Quellcode die Geschwindigkeit nicht weit erhöhen, da das meiste vom Server und der Verbindung zu diesem abhängt.

    Lingo schrieb:

    @Higlav
    Ich habe dafür 10 verschiedene Webbrowser benutzt :/

    Ehrlich? =O
    Dann steige ab sofort auf HTTPWebRequests/-Responses um. ;) Die WebBrowsers laden den gesamten(!) Inhalt herunter: Bilder, Werbung, Filmchen etc. und stellen diese auch noch optisch dar. Das ist völlig unperformant, wenn du lediglich auslesen willst. :thumbup:
    Schau dir mal den System.Net.WebClient an ;)

    Dort hast du die möglichkeit mit DownloadString den kompletten HTML code in einen String zu laden und dann mit RegEx zu durchsuchen. Damit kannst du in Sekunden deine Ergebnise extrahieren...

    Wenn du die RegEx Pattern schon hast wirst du bei der umstellung auf den WebClient keine Probleme haben.
    Vielen Dank für eure Antworten.
    Ich habe es nun so gemacht:

    VB.NET-Quellcode

    1. Dim URL As String = [url]http://www.google.ch[/url]
    2. Dim request As HttpWebRequest = CType(WebRequest.Create(URL), HttpWebRequest)
    3. Dim response As HttpWebResponse = CType(request.GetResponse, HttpWebResponse)
    4. Dim reader As StreamReader = New StreamReader(response.GetResponseStream)
    5. Dim str As String = reader.ReadLine()
    6. Do While str.Length > 0
    7. RichTextBox1.Text = RichTextBox1.Text & str
    8. reader.ReadLine()
    9. Loop


    Jedoch is tmeine Richtextbox zu klein. (Die Datengrösse)
    Was kann ich nehmen, dass ich garantiert von jeder Website den Code hinein bekomme?
    @Lingo meinst Du;

    VB.NET-Quellcode

    1. Do While str.Length > 0
    2. RichTextBox1.AppendText(str & Environment.NewLine)
    3. str = reader.ReadLine()
    4. Loop

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Lingo schrieb:

    Was kann ich nehmen, dass ich garantiert von jeder Website den Code hinein bekomme?

    Erst mal umbauen:
    Annahme: .NET FW 4.5

    VB.NET-Quellcode

    1. Public Async Sub LoadContentsAsync()
    2. For Each Link In MyLinkList 'List(Of Uri)
    3. If Await AppendContentAsync(Link) Then
    4. 'Success
    5. Else
    6. 'Failed
    7. End If
    8. Next
    9. End Sub
    10. Public Async Function AppendContentAsync(uri As Uri) As Task(Of Boolean)
    11. Dim Req = HttpWebRequest.CreateHttp(uri)
    12. Dim Resp As HttpWebResponse
    13. Dim StrR As StreamReader
    14. Try
    15. Resp = DirectCast(Await Req.GetResponseAsync, HttpWebResponse)
    16. StrR = New StreamReader(Resp.GetResponseStream)
    17. RichTextBox1.Text &= Await StrR.ReadToEndAsync
    18. Return True
    19. Catch ex As Exception
    20. Return False
    21. Finally
    22. Resp.Dispose
    23. StrR.Dispose
    24. End Try
    25. End Sub


    EDIT: Mist, das kann gar nicht funktionieren: Diese Methode würde ein InvalidCrossThread-Dingens werfen. Musst halt Invoken, bevor du den Text der RTB änderst. Ansonsten bleibt aber alles gleich.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Higlav“ ()

    Vielen Dank für eure Antworten.
    Ich werden den Quelltext mit RegeX durchgehen.
    Den Quelltext in einer RichTextBox "zwischen zu speichern" finde ich etwas undschön.
    Wie könnte ich dies machen? Quellcode in einen String laden? Wenn aber der String zu klein ist was dann?
    Listo Of String machen?

    Vielen Dank für eure Antworten.
    List of String klingt doch nciht schlecht.
    Was spricht denn dagegen?
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Vielleicht wäre ein Dictionary(Of Uri, String) auch nicht schlecht: Dann kannst'es besser zuordnen.
    Oder gleich mit'nem Dataset, wenn's komplexer wird.
    du lädst doch den Quellcode einer Homepage, sehe ich das richtig?

    Zeig mir eine Homepage bei der der Quellcode größer 1MB ist...Quellcode ist NUR text...da brauchst du schon rießige Seiten. Ich weiß nicht wie die Seite von der du deine Daten extrahieren willst aufgebaut ist, aber ich kenne keine auf der ALLE ergebnisse aus allen Ligen in einem Quellcode stehen.

    Lingo schrieb:

    @Higlav
    Du hast eigentlich einfach eine Funktion daraus gemacht und übergibst dieser den Link?
    Wenn die Funktion durch ist könnte man in diese Fall die RegEx Abfrage starten?

    Kannst du mir bitte erklären was das Await in der If-Abfrage macht?

    Hier handelt es sich um die äusserst komfortable Async/Await-Funktionen des .NET-Frameworks ab 4.5.
    Das Await bewirkt, dass gewartet wird, bis die asynchrone Funktion fertig ist. Hierbei wird der Task(Of Boolean) ausgewertet, sodass man weitermachen kann, als hätte man einen einfachen Boolean zurückbekommen - eben, weil das Resultat des Tasks schon erwartet wurde. Auf diese Weise kannst du deinen Code abarbeiten, ohne, dass dein GUI flackert, oder dass du den Threadpool/Thread/BackgroundWorker/SynchronizationContext/Invoke-Methoden bemühen musst.