2

我正在使用 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 数据?

4

3 回答 3

1

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

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

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

于 2009-09-02T15:36:58.037 回答
0

当你在浏览器中访问一个页面时,它

1.从请求的 url 下载文件

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

3.在适用的情况下执行javascript。

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

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

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

于 2009-09-02T15:51:44.387 回答
0

我认为您需要使用WebBrowser控件来执行此操作,因为您实际上需要页面上的 javascript 来运行以完成页面加载。根据您的应用程序,这对您来说可能会也可能不会——注意它是一个 Windows.Forms 控件。

于 2009-09-02T15:36:01.813 回答