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