Inhalt eines tables mittels C# von einer Dynamsichen Webseite auslesen

  • C#

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Takafusa.

    Inhalt eines tables mittels C# von einer Dynamsichen Webseite auslesen

    Hallo!

    Ich versuche aktuell den Inhalt eines Tables von dieser Webseite auszulesen: masterlist.gtaconnected.com/ (Im Anhang befindet sich auch ein Bild vom Aufbau dieser Webseite)
    Da ich so etwas noch nie gemacht habe, habe ich mir gestern bis in die Nacht viele Tutorials angeschaut aber ich kam trotzdem nicht weiter..

    Nun wollte ich mal hier im Forum nachfragen ob mir vielleicht jemand bei dieser Angelegenheit helfen könnte. Ich würde gerne alle Inhalte von diesem table (wie der Host, Name etc.) in einer Konsolenanwendung angezeigt bekommen.
    Ich denke die Schwierigkeit hierbei ist das dies eine Dynamische Webseite ist und keine statische.

    Über Hilfe würde ich mich freuen!
    Bilder
    • Screenshot 2021-12-17 154037.png

      132,04 kB, 1.879×636, 201 mal angesehen
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Da du sowas noch nie gemacht hast, täte ich dir empfehlen ein Webbrowser Control zu nehmen. Wenn du z.B. im FireFox, irgendwo einen Rechtsklick auf der Seite machst, dann Element Untersuchen klickst, gehen die Dev-Tools auf und springen direkt zur Stelle im Code. So bekommst du IDs oder weitere Details von den Elementen.

    Der Webbrowser aus der Toolbox, lädt die Seite nicht, warum keine Ahung, hier im Forum findest du wie man den Chromium nutzen kann(Nuget), der sollte das können. Würde es mit dem Webbrowser ausser Toolbox gehen würde das etwas so aussehen:

    VB.NET-Quellcode

    1. Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    2. Dim tbody As HtmlElement = WebBrowser1.Document.GetElementById("ServerListing")
    3. If tbody <> Nothing Then
    4. For Each childElement As HtmlElement In tbody.Children
    5. Debug.WriteLine(childElement.TagName)
    6. Next
    7. End If
    8. End Sub


    Mit dem Chromium oder Gecko sollte es ählich sein. Probier erstmal ein Projekt mit Chromium zum laufen zu bringen, dann schauen wir weiter, so das die Seite geladen wird. Dann kannste im Zweifel du Mappe hochladen, dann helfe ich dir gern weiter.
    Bilder
    • Unbenannt.jpg

      20,89 kB, 620×127, 189 mal angesehen
    @Takafusa
    Danke für deine Hilfe!
    Ich habe jetzt mal ein Projekt mit Chromium erstellt, und Chromium lädt die Seite einwandfrei.

    Ich hab das Projekt jetzt mal im Anhang hochgeladen aber ohne Nuget Dateien da es sonst etwas zu groß wäre (über 300mb).
    Installiert habe ich den Chromium Browser über diesen Nuget Link: nuget.org/packages/CefSharp.WPF/
    Dateien
    • ChromiumTest1.zip

      (31,14 kB, 169 mal heruntergeladen, zuletzt: )
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Super, das hat geklappt. Ich war ein wenig voreilig, dachte geht mit dem Chromium gehts so einfach von der hand, wie mit dem Browser aus der Toolbox, aber Pustekuchen. Aber die gute Nachricht, ich hab dein Vorhaben schon umgesetzt obwohl ich das garnet wollte :D . Geht nich, mag ich nicht, war sofort im "Kampfmodus".

    Ich hab mich nun richtig damit auseinandergesetzt, ein Vorteil beim CefSharp, man kann einfach ein JavaScript schreiben und sich aussuchen was man returnt, ich hoffe bist fit in Sachen JS. Der Browser führt es aus, und gib uns was wir im Script festgelegt haben.

    Noch eine schlechte Nachricht, hab keine Ahnung von WPF, daher habe ich mit CefSharp.Winforms gearbeitet, sollte aber vom Prinzip her gleich sein. Weil ich dachte es ist einfach wie beim TB-Browser, dich nun nicht noch dazu bringen will mit JS zu hantieren, häng ich einfach die Mappe an.

    Wenn es Probleme wegen dem Package gibt, installier es neu, hab den PAckages Ordner gelöscht. VS müsste beim ersten kompileren (hoffe ich)den Packages Ordner neu erstellen und runterladen, sonst installier CefSharp.Winforms neu. Das kannste dann bei Bedarf nach WPF protieren.

    Die Projektmappe ist Option Strict Off, weiter unten sind Option Strict On komforme Änderungen!!!!!!
    Dateien
    • WindowsApp1.7z

      (7,85 kB, 171 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Takafusa“ ()

    Jauu es funktioniert wunderbar! :D

    Ich musste den Code für C# etwas anpassen:
    Spoiler anzeigen

    C#-Quellcode

    1. private void Browser_LoadingStateChanged(object sender, CefSharp.LoadingStateChangedEventArgs e)
    2. {
    3. if (!e.IsLoading) {
    4. Task.Run(() => {
    5. Thread.Sleep(1000);
    6. CBrowser.GetMainFrame().EvaluateScriptAsync(Properties.Resources.js).ContinueWith(x => {
    7. JavascriptResponse res = x.Result;
    8. Done((IList<object>)res.Result);
    9. });
    10. });
    11. }
    12. }
    13. private void Done(IList<object> result)
    14. {
    15. for (int i = 0; i < result.Count; i++) {
    16. IList<object> cols = (IList<object>)result[i];
    17. Console.WriteLine(cols[0] + " " + cols[1] + " " + cols[2] + " " + cols[3] + " " + cols[4] + " " + cols[5]);
    18. }
    19. }


    Den JavaScript Code habe ich in den Resourcen als Textdatei hinzugefügt. So kann ich ihn ganz einfach als string abrufen mit dieser Zeile Properties.Resources.js.
    Ich muss gestehen das ich mich mit JavaScript wirklich nicht auskenne, aber es sieht garnicht so kompliziert aus!

    Vielen Dank für deine Hilfe, ich weiß es sehr zu schätzen :saint:
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Super das es geklappt hat, ich habe gerade bemerkt, das ich im neuen Studio noch mit Strict Off arbeite, habs ganz schnell umgestellt. Die Beispielmappe ist noch Option Strict Off. Hatte befürchtet würdest Probleme beim übersetzen bekommen, hab zu spät dran gedacht das in der Überschrift C# stand, aber du hast es geschafft.

    ClonkAndre schrieb:

    Ich muss gestehen das ich mich mit JavaScript wirklich nicht auskenne, aber es sieht garnicht so kompliziert aus!


    Ich fall immer wieder auf die Schnute mit JS. Absolut nicht Typsicher, hab deswegen zu viel Zeit verschwendet beim finden von fehlern.
    var a = 6;
    var b = "6";
    var c = a + b;
    alert(c);
    Ausgabe = 66

    Takafusa schrieb:

    Ich fall immer wieder auf die Schnute mit JS. Absolut nicht Typsicher, hab deswegen zu viel Zeit verschwendet beim finden von fehlern.
    var a = 6;
    var b = "6";
    var c = a + b;
    alert(c);
    Ausgabe = 66


    Ui, ich weiß nicht viel von JS aber ich hätte gedacht es wäre Typsicher.
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Ich bin schon so oft mit JS in fallen getappt, hatte im Nachhinein manchmal Tränen in den Augen vor lachen, weil ich so blöd war. Aber solange man über seine eigenen Dummheiten lachen kann, gehts ja noch, auch wenn's hin und wieder viel Zeit gekostet hat.

    So, hab das eben auch in VB auf Option Strict On geändert.
    Hier die Änderungen, damit das vollständig ist.

    VB.NET-Quellcode

    1. Private Sub ChromiumWebBrowser1_LoadingStateChanged(sender As Object, e As LoadingStateChangedEventArgs) Handles ChromiumWebBrowser1.LoadingStateChanged
    2. If Not e.IsLoading Then
    3. Threading.Thread.Sleep(1000) 'sonst is nicht alles geladen, JS braucht auch nen momemt um ausgeführt zu werden
    4. ChromiumWebBrowser1.GetMainFrame().EvaluateScriptAsync(js).ContinueWith(New Action(Of Task(Of JavascriptResponse))(Sub(res)
    5. Dim response As JavascriptResponse = res.Result
    6. Done(DirectCast(response.Result, List(Of Object)))
    7. End Sub))
    8. End If
    9. End Sub
    10. Private Sub Done(result As List(Of Object))
    11. BeginInvoke(Sub()
    12. For i = 0 To result.Count - 1
    13. Dim cols As List(Of Object) = DirectCast(result(i), List(Of Object))
    14. Dim dbg As String = ""
    15. For Each col As String In cols
    16. dbg += col & " "
    17. Next
    18. Debug.WriteLine(dbg)
    19. Next
    20. End Sub)
    21. End Sub

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