webentwicklung-frage-antwort-db.com.de

C # httpwebrequest und Javascript

Ich verwende C # HttpWebRequest, um einige Daten einer Webseite zu erhalten. Das Problem ist, dass einige der Daten mit Javascript/Ajax aktualisiert werden, nachdem die Seite geladen wurde und ich sie nicht in der Antwortzeichenfolge erhalte. Gibt es eine Möglichkeit, die Webanforderung warten zu lassen, bis alle Skripts auf der Seite ausgeführt wurden?

Vielen Dank

Amit

19
Amit Raz

Wenn ich Ihre Frage richtig interpretiere, gibt es keine einfache Lösung für Ihr Problem.

Sie schaben den HTML-Code von einem Server und da Ihr C # -Code kein echter Webbrowser ist, führt er keine Clientskripts aus.

Auf diese Weise können Sie nicht auf Informationen zugreifen, die der abgerufene HTML-Code nicht enthält.

Bearbeiten: Ich weiß nicht, wie komplex diese AJAX Aufrufe von der ursprünglichen Website sind, aber Sie könnten Firebug oder Fiddler für IE verwenden, um zu sehen, wie die Anforderungen sind gemacht, um diese AJAX Aufrufe auch in Ihrer C # -Anwendung aufzurufen. So können Sie die benötigten Informationen hinzufügen. Aber es ist nur eine theoretische Lösung.

9
splattne

Nur eine Idee, aber es gibt eine Möglichkeit, eine Webseite mit .net so zu laden, als wäre sie in einem Browser: mit System.Windows.Forms

sie können die Webseite in ein WebBrowser-Steuerelement laden

WebBrowser wb = new WebBrowser();
wb.ScrollBarsEnabled = false;
wb.ScriptErrorsSuppressed = true;
wb.Navigate(url);
while (wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); }
wb.Document.DomDocument.ToString()

Dies gibt Ihnen wahrscheinlich das Pre-Ajax-DOM, aber vielleicht gibt es eine Möglichkeit, das Ajax zuerst laufen zu lassen.

13
rizzle

Verwenden Sie HttpWebRequest zum Herunterladen der Seite, durchsuchen Sie den Quellcode programmgesteuert nach den relevanten Ajax-Informationen und verwenden Sie dann ein neues HttpWebRequest, um diese Daten abzurufen.

4
Chris Almond

Wenn Sie eine Webseite in einem Webbrowser öffnen, führt der Browser das Javascript aus und lädt zusätzliche Ressourcen herunter, die von der Seite verwendet werden (Bilder, Skripte usw.). HttpWebRequest selbst führt dies nicht aus, sondern lädt nur den HTML-Code für die von Ihnen angeforderte Seite herunter. Der Javascript/Ajax-Code wird niemals alleine ausgeführt.

4
Misko

HttpWebRequest emuliert keinen Webbrowser, sondern lädt nur die Ressource herunter, auf die Sie ihn verweisen. Dies bedeutet, dass keine JavaScript-Dateien ausgeführt oder heruntergeladen werden.

Sie müssten so etwas wie FireBug verwenden, um die URL für die Daten abzurufen, die über JavaScript abgerufen werden, und Ihre HttpWebRequest darauf verweisen.

3
roryf

Verwenden Sie HttpWebRequest, um die Seite herunterzuladen. Durchsuchen Sie den Quellcode nach den relevanten AJAX Informationen und verwenden Sie dann eine neue HttpWebRequest, um diese Daten abzurufen.

1
Nabin Aryal

Du könntest das PhantomJs benutzen. Ich hatte dieses Problem , habe aber keine Lösung für mein Problem gefunden. Meiner Meinung nach ist die beste Lösung Dies .

Meine Lösung sieht so aus:

var page = require('webpage').create();

page.open("https://sample.com", function(){
    page.evaluate(function(){
        var i = 0,
        oJson = jsonData,
        sKey;
        localStorage.clear();

        for (; sKey = Object.keys(oJson)[i]; i++) {
            localStorage.setItem(sKey,oJson[sKey])
        }
    });

    page.open("https://sample.com", function(){
        setTimeout(function(){
         page.render("screenshoot.png") 
            // Where you want to save it    
           console.log(page.content); //page source
            // You can access its content using jQuery
            var fbcomments = page.evaluate(function(){
                return $("body").contents().find(".content") 
            }) 
            phantom.exit();
        },10000)
    });     
});
0
user5708151