2009-09-02 34 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步驟直接訪問源代碼?