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

时间:2009-09-02 15:19:02

标签: c# webclient

我正在使用WebClient下载网站

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数据?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我认为您需要使用WebBrowser控件才能执行此操作,因为您确实需要在页面上运行javascript来完成页面加载。根据您的应用程序,这可能也可能不适用于您 - 请注意它是Windows.Forms控件。

答案 2 :(得分:0)

当您在浏览器中访问某个页面时,它

1.从中下载文档     请求网址

2.下载任何引用的内容            img,链接,脚本等标签(任何东西            引用外部文件)

3.执行适用的javascript。

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

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

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