Zum Inhalt springen

C# Dynamisches HTML auslesen mit SHDocVw.InternetExplorer


mOSSpOWER

Empfohlene Beiträge

Hallo Kollegen,

Ich möchte mit einer Consolenanwendung (später Windowsdienst) Screenscraping durchführen, also fällt hier schon mal das WebBrowser Control weg, da ich keine Form verwende. Nun gut, geht alles wirklich doll mit ...


Object o = null;

String url = "http://futbol24.com/f24_livenow/LiveNow.html";

SHDocVw.InternetExplorer internetExplorer = new SHDocVw.InternetExplorerClass();

IWebBrowserApp webBrowser = (IWebBrowserApp)internetExplorer;

webBrowser.Visible = true;

webBrowser.Navigate(url, ref o, ref o, ref o, ref o);

Thread.Sleep(5000); // OK, das ist billigstes Ereignishandling 

IHTMLDocument2 doc = (IHTMLDocument2)webBrowser.Document;

Console.Write(doc.body.innerHTML);[/code]

Wenn ich diesen Code ausführe, dann poppt ein Browserfenster hoch und es wird die Seite angezeigt. OK, jetzt bleiben aber noch zwei Probleme übrig:

1) Ich möchte kein neues Browserfenster angezeigt bekommen. Ich möchte alles "behind" machen. OK, dann setzen wir Visible auf false ...

2) Ich möchte den dynamischen HTML-Inhalt auslesen, nur kann ich das, wenn das Fenster offen ist. Dynamisch an dieser Seite ist, dass mittels AJAX die Ergebnisse im Hintergrund nachgeladen werden. Nach dem initialen Aufruf der Seite wird der Text "Please wait!" angezeigt, und danach die Ergebnisse nachgeladen. Mit meinem Programm kann ich auch auf die Ergebnisse zugreifen, vorausgesetzt ist allerdings, dass visible auf true ist, das möchte ich aber nicht, siehe 1). Nun bekomme ich immer (wenn visible true) im HTML angezeigt "Please wait" .. egal, wielange ich den Thread anhalte. Was mache ich falsch, wer kann mir helfen? Danke schon mal für etwaige Antwort.

Link zu diesem Kommentar
Auf anderen Seiten teilen

OK, selbst ist der Mann :D ... für alle die es interessiert:

...

string url = "http://futbol24.com/f24_livenow/LiveNow.html";

Object o = null;

SHDocVw.InternetExplorer internetExplorer = new SHDocVw.InternetExplorerClass();

internetExplorer.Silent = true;

internetExplorer.Navigate(url, ref o, ref o, ref o, ref o);

bool ajax = false;


while(true) {

  if(internetExplorer.ReadyState != tagREADYSTATE.READYSTATE_LOADING && !ajax) {

    String html = ((IHTMLDocument2)internetExplorer.Document).body.innerHTML;

    ajax = html.IndexOf("style=\"DISPLAY: none\">Please wait !!!") != -1;


    if(ajax) {

      break;

    }

  }


  Thread.Sleep(50);

}

...

Ich brauche dieses Browserobjekt überhaupt nicht ... So, ich mach' jetzt Pause, wieder ein DURCHBRUCH! ... hey, natürlich ist das Handling noch nicht "optimal", also keine Postings diesbezüglich ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

mal ne ne einfache frage, was hast du vor?

Willst du nur nen WebRequest machen? Hast du schonmal vom HttpWebRequest gehört?

Ich bin mir zwar nicht 100 Prozent sicher, aber mit 99.99 prozentiger Sicherhteit kann man imo mit einem WebRequest kein Scripting parsen, d.h, wenn ich eine Webseite aufrufe, bekomme ich immer den aufgerufenen Quellcode - mit dem Browserobjekt kann ich aber den manipulierten (z.B. mittels AJAX) Quellcode erhalten und habe mit dem Browser auch gleich Zugriff auf das DOM für (schnellere) weitere Operationen - zusätzlich habe ich auch die Möglichkeit weiterzunavigieren und den Status zu halten. Bei einem WebRequest müsste ich immer einen neuen Request schicken (Stichwort Frames, die sind aber auch schon im InternetExplorer geladen, daher Performance-Gewinn). Im wesentlichen geht es mir darum, dass ich den Quellcode bekomme, den der User visuell im Browser sieht (der sich im Speicher befindet) und nicht den, den der User sieht, wenn er sich den HTML-Quellcode ansehen möchte (dies ist nämlich immer der initial geladene) - und zu guter letzt geht es mir darum, dass ich immer Änderrungen im DOM (mittels AJAX) sofort mitbekomme, ohne wieder einen neuen Request "abzufeuern" - da ich ja einen Speicherausschnitt (DOM) habe.

Proof me wrong, ich bin offen für Neues ;)

P.S. Ich will es jetzt nicht testen, da ich mir so sicher bin, wenn Du aber mit dem HttpWebRequest obige Seite aufrufst, wirst Du IMMER! im Quellcode u.a. finden:

<div id="tabela_mecze_id_czekaj">Please wait !!!</div>

... ich will aber

die nach dem "wait" geladenen Daten sehen .. u.a.

<div id="tablea_mecza_id_czakaj" style="DISPLAY: none">Please wait !!!</div>

Gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...