23

我正在使用 C# HttpWebRequest 来获取网页的一些数据。问题是在页面加载后使用 javascript/ajax 更新了一些数据,而我没有在响应字符串中得到它。有没有办法让 webrequest 等到页面中的所有脚本都完成执行?

谢谢

阿米特

4

7 回答 7

16

只是一个想法,但有一种方法可以让 .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。

于 2009-02-05T16:16:12.710 回答
10

如果我正确解释了您的问题,那么您的问题没有简单的解决方案。

您正在从服务器上抓取 HTML,并且由于您的 C# 代码不是真正的 Web 浏览器,因此它不会执行客户端脚本。

这样您就无法访问您获取的 HTML 不包含的信息。

编辑:我不知道来自原始网站的这些 AJAX 调用有多复杂,但您可以使用 Firebug 或 Fiddler for IE 查看请求是如何发出的,以便在您的 C# 应用程序中调用这些 AJAX 调用。所以你可以添加你需要的信息。但这只是理论上的解决方案。

于 2009-02-05T14:16:32.767 回答
4

当您在网络浏览器中打开网页时,浏览器会执行 javascript 并下载页面使用的其他资源(图像、脚本等)。HttpWebRequest 本身不会执行任何操作,它只会下载您请求的页面的 html。它永远不会自己执行任何 javascript/ajax 代码。

于 2009-02-05T14:16:46.040 回答
4

使用 HttpWebRequest 下载页面,以编程方式在源代码中搜索相关的 ajax 信息,然后使用新的 HttpWebRequest 将数据拉下来。

于 2010-07-22T12:13:17.430 回答
3

HttpWebRequest 不模拟网络浏览器,它只是下载您指向的资源。这意味着它不会执行甚至下载 JavaScript 文件。

您必须使用 FireBug 之类的东西来获取通过 JavaScript 提取的数据的 URL,并将您的 HttpWebRequest 指向那个。

于 2009-02-05T14:18:53.183 回答
1

用于HttpWebRequest下载页面。在源代码中搜索相关的 AJAX 信息,然后使用 newHttpWebRequest将这些数据拉下来。

于 2010-12-24T12:05:39.730 回答
0

您可以使用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)
    });     
});
于 2016-02-09T06:27:12.657 回答