Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#httpwebrequest和javascript_C#_Javascript_Ajax_Httpwebrequest - Fatal编程技术网

C#httpwebrequest和javascript

C#httpwebrequest和javascript,c#,javascript,ajax,httpwebrequest,C#,Javascript,Ajax,Httpwebrequest,我正在使用C#HttpWebRequest获取网页的一些数据。问题是一些数据在页面加载后使用javascript/ajax更新,而我没有在响应字符串中得到它。有没有办法让webrequest等待页面中的所有脚本都完成执行 谢谢 Amit如果我正确地解释了你的问题,你的问题就没有简单的解决办法了 你正在从服务器上抓取HTML,因为你的C代码不是真正的web浏览器,它不会执行客户端脚本 这样,您就无法访问您获取的HTML不包含的信息 Edit:我不知道这些来自原始网站的AJAX调用有多复杂,但是您可

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

谢谢


Amit

如果我正确地解释了你的问题,你的问题就没有简单的解决办法了

你正在从服务器上抓取HTML,因为你的C代码不是真正的web浏览器,它不会执行客户端脚本

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


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

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

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


您必须使用FireBug之类的工具获取通过JavaScript拉入的数据的URL,并将您的HttpWebRequest指向该URL。

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

使用HttpWebRequest下载页面,通过编程搜索源代码中的相关ajax信息,然后使用新的HttpWebRequest下拉该数据。

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

您可以使用。我有这个,但没有找到解决问题的办法。在我看来,最好的解决办法是

我的解决方案如下所示:

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

我想到了,但它不是一个URL,而是一个数字,当我使用http请求时,数字所在的标签是空的,我也有同样的想法。但我想,随着时间的推移,让代码继续工作将是一件非常困难的事情……从我尝试的30分钟来看,这样做似乎一点也不简单。我用一个理论解决方案编辑了我的问题。。。这取决于环境,页面多久更改一次…我每30分钟检查一次数据。我想这就是我必须要做的,笨蛋!通常,您会运行一个真正的浏览器,并从C#自动执行它。您需要添加对System.Windows.Forms的引用才能访问WebBrowser类(如果您的项目中尚未引用该类)。此外,以下内容有助于此解决方案的线程版本正常工作。这样的数据必须被执行,你不能仅仅通过获取它来解决问题