C # httpwebrequest и JavaScript - PullRequest
       13

C # httpwebrequest и JavaScript

19 голосов
/ 05 февраля 2009

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

Спасибо

Amit

Ответы [ 7 ]

14 голосов
/ 05 февраля 2009

Просто идея, но есть способ заставить .net загрузить веб-страницу, как если бы она была в браузере: используя System.Windows.Forms

Вы можете загрузить веб-страницу в элемент управления 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()

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

9 голосов
/ 05 февраля 2009

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

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

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

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

4 голосов
/ 22 июля 2010

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

4 голосов
/ 05 февраля 2009

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

3 голосов
/ 05 февраля 2009

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

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

1 голос
/ 24 декабря 2010

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

0 голосов
/ 09 февраля 2016

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

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

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)
    });     
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...