C# httpwebrequest и javascript

Я использую C# HttpWebRequest для получения некоторых данных веб-страницы. Проблема в том, что некоторые данные обновляются с помощью javascript/ajax после загрузки страницы, и я не получаю их в строке ответа. Есть ли способ заставить webrequest ждать, пока все скрипты на странице не завершат выполнение?

спасибо

Амит

7 ответов


Если я правильно интерпретирую ваш вопрос, нет простого решения для вашей проблемы.

вы очищаете HTML с сервера, и поскольку ваш код C# не является реальным веб-браузером, он не выполняет клиентские скрипты.

таким образом, вы не можете получить доступ к информации, которую не содержит HTML, который вы получаете.

Edit: Я не знаю, насколько сложны эти вызовы AJAX с исходного веб-сайта, но вы можете использовать Firebug или Fiddler для IE, чтобы увидеть как выполняются запросы, чтобы вызвать эти вызовы AJAX в вашем приложении c#. Чтобы вы могли добавить кусочки информации, которые вам понадобятся. Но это только теоретическое решение.


просто идея, но есть способ заставить .net загружать веб-страницу, как если бы она была в браузере: с помощью системы.Окна.Формы

вы можете загрузить веб-страницу в элемент управления WebBrowser

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

Это, вероятно, даст вам pre ajax DOM, но, возможно, есть способ позволить ему запустить ajax первым.


когда вы открываете веб-страницу в веб-браузере, именно браузер выполняет javascript и загружает дополнительные ресурсы, используемые страницей (изображения, скрипты и т. д.). HttpWebRequest сам по себе не будет делать ничего из этого, он будет загружать только html для запрошенной Вами страницы. Он никогда не будет выполнять код javascript/ajax самостоятельно.


используйте HttpWebRequest для загрузки страницы, программного поиска исходного кода для соответствующей информации ajax, а затем используйте новый HttpWebRequest для удаления этих данных.


HttpWebRequest не эмулирует веб-браузер, он просто загружает ресурс, на который вы указываете. Это означает, что он не будет выполнять или даже загружать файлы JavaScript.

вам нужно будет использовать что-то вроде FireBug, чтобы получить URL-адрес для данных, извлекаемых через JavaScript, и указать на это HttpWebRequest.


использовать HttpWebRequest для загрузки страницы. Поиск исходного кода для соответствующей информации AJAX, а затем использовать новый HttpWebRequest чтобы вытащить эти данные.


вы можете использовать помощи PhantomJS. Я имел эту вопрос, но не нашел решения для моей проблемы. На мой взгляд, лучшим решением является этой.

мое решение выглядит так:

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)
    });     
});