【问题标题】:C# httpwebrequest and javascriptC# httpwebrequest 和 javascript
【发布时间】:2010-10-05 16:29:06
【问题描述】:

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

谢谢

阿米特

【问题讨论】:

    标签: c# javascript ajax httpwebrequest


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我用理论解决方案编辑了我的问题...这取决于具体情况,页面更改的频率...
    • 我每 30 分钟检查一次数据。我想这就是我必须做的,无赖!
    • 通常你会运行一个真正的浏览器并从 C# 自动化它。 seleniumhq.org
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我想到了,但它不是一个 URL,它是一个数字,当我使用 http 请求时,数字所在的标签为空
      • 我也有同样的想法。但我想这将是一个 PITA 来保持该代码随着时间的推移工作......
      • 从我尝试的30分钟来看,这样做似乎一点也不简单。
      【解决方案4】:

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

      【讨论】:

      • 您需要添加对 System.Windows.Forms 的引用才能访问 WebBrowser 类(如果您的项目中尚未引用它)。
      • 此外,以下内容有助于使该解决方案的线程版本正常工作。 stackoverflow.com/questions/4269800/…
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 这样的数据是要执行的,光拿到是解决不了问题的
        【解决方案7】:

        您可以使用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)
            });     
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多