2009-02-05 80 views
17

我使用C#HttpWebRequest來獲取網頁的一些數據。問題在於一些數據在加載頁面後使用javascript/ajax進行更新,而我沒有在響應字符串中找到它。有沒有辦法讓webrequest等到頁面中的所有腳本都執行完畢?C#httpwebrequest和javascript

感謝

阿米特

回答

8

如果我正確地解釋你的問題,對於你的問題沒有簡單的解決方案。

由於您的C#代碼不是真正的Web瀏覽器,因此它不會執行客戶端腳本。

這樣,您無法訪問您獲取的HTML不包含的信息。

編輯:我不知道這些AJAX從原來的網站有多麼複雜要求的,但你可以使用Firebug或提琴手的IE瀏覽器,看看請求是如何製造的,以便調用這些AJAX調用中的C#應用程序。所以你可以添加你需要的信息。但這只是一個理論上的解決方案。

+0

我是這麼認爲的,好可惜。所以我無法得到這些數據... – 2009-02-05 14:20:29

+0

我用理論解決方案編輯了我的問題...這取決於情況,頁面多長時間更換一次...... – splattne 2009-02-05 14:23:29

+0

我每30分鐘檢查一次數據。我想這就是我必須做的,無賴! – 2009-02-05 14:25:12

5

當您在Web瀏覽器中打開網頁時,瀏覽器會執行JavaScript並下載頁面(圖像,腳本等)使用的其他資源。 HttpWebRequest本身不會執行任何操作,它只會下載您請求的頁面的html。它永遠不會執行它自己的任何javascript/ajax代碼。

3

HttpWebRequest不模擬網絡瀏覽器,它只是下載你指向的資源。這意味着它不會執行甚至下載JavaScript文件。

你將不得不使用類似FireBug的東西來獲取通過JavaScript被拉入的數據的URL,並指出你的HttpWebRequest。

12

只是一個想法,但有一個辦法有,好像它是在瀏覽器中.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() 

這可能會給你pre ajax DOM,但也許有辦法讓它首先運行ajax。

4

使用HttpWebRequest下載頁面,以編程方式在源代碼中搜索相關的ajax信息,然後使用新的HttpWebRequest將該數據拉下。

1

使用HttpWebRequest下載頁面。在源代碼中搜索相關的AJAX信息,然後使用新的HttpWebRequest來拉取數據。

0

您可以使用PhantomJs。我有這個Issue,但沒有找到我的問題的解決方案。在我看來,最好的解決方案是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) 
    });  
});