2009-09-02 62 views
2

我使用WebClient的如何阅读使用webclient通过ajax生成的内容?

public void download() 
{ 
client = new WebClient(); 
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); 
client.Encoding = Encoding.UTF8; 
client.DownloadStringAsync(new Uri(eUrl.Text)); 
} 
void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
{ 
    SaveFileDialog sd = new SaveFileDialog(); 
    if (sd.ShowDialog() == DialogResult.OK) 
    { 
     StreamWriter writer = new StreamWriter(sd.FileName,false,Encoding.Unicode); 
     writer.Write(e.Result); 
     writer.Close();     
    } 
} 

这正常下载网站。但我无法阅读使用ajax加载的内容。像这样:

<div class="center-box-body" id="boxnews" style="width:768px;height:1167px; "> 
    loading .... </div> 

<script language="javascript"> 
    ajax_function('boxnews',"ajax/category/personal_notes/",''); 
    </script> 

这个“ajax_function”从客户端的服务器上下载数据。

如何下载完整的网页html数据?

+1

我不知道阿贾克斯可以做成一个副词;) – Kevlar 2009-09-02 15:22:22

回答

0

我想你需要使用一个WebBrowser控件来做到这一点,因为你实际上需要在页面上运行javascript来完成页面加载。根据您的应用程序,这可能或可能不适合您 - 请注意这是一个Windows.Forms控件。

+0

webBrowser是下载所有图片。我不需要下载图片,我只需要下载html文本数据。 – ebattulga 2009-09-02 15:39:39

1

为此,您需要在完整的Web浏览器中托管一个Javascript运行时。不幸的是,WebClient无法做到这一点。

您唯一的选择就是自动化WebBrowser控件。您需要将其发送到URL,等到主页面任何AJAX内容已经被加载(包括如果需要用户操作,则触发该加载),然后刮掉整个DOM。

如果你只是在抓取一个特定的网站,你可能最好只是自己拉动AJAX URL(模拟所有需要的参数),而不是拉动调用它的网页。

+0

如何设置浏览器不下载图片。 – ebattulga 2009-09-02 15:44:17

+0

@ebattulga - 那真是一个不同的问题。它已经在这里问:http://stackoverflow.com/questions/1260615/disable-image-loading-on-webbrowser-control-c-net-2-0 - 但没有答案。不过,这是一个很好的问题。 – 2009-09-02 15:56:27

0

当您在浏览器访问一个网页,它

1.downloads从 请求的文档URL

由 IMG,链接,脚本等标签(任何引用

2.downloads什么 引用外部文件)

3.如果适用,请执行javascript。

WebClient类仅执行步骤1.它封装了一个http请求和响应。它确实有而不是包含一个脚本引擎,并且据我所知,它不会找到引用其他文件的图像标签等,并启动进一步的请求以获取这些文件。

如果您想在页面被AJAX调用和处理程序修改后获取页面,则需要使用具有Web浏览器全部功能的类,这几乎意味着使用Web浏览器可以以某种方式自动化服务器端。 WebBrowser控件执行此操作,但我认为它仅适用于WinForms。我不寒而栗,想到这里的安全问题,或者如果多个用户同时利用这个设施,服务器上的需求就会下降。

问自己一个更好的问题是:你为什么要这样做?如果您真正感兴趣的数据是通过AJAX(可能通过Web服务)获得的,那么为什么不跳过webClient步骤直接访问源代码?