現在的網頁有相當一部分是采用了AJAX技術,不管是采用C#中的WebClient還是HttpRequest都得不到正確的結果,因為這些腳本是在服務器發送完畢后才執行的!
但我們用IE瀏覽頁面時是正常的,所以解決方法只有1個就是采用WebBrowser控件
但是使用Webbrowser你會發現,在DownloadComplete事件中,你根本無法知道頁面何時才算是真正的加載完畢!
當然個別有Frame的網頁可能會觸發多次Complete,即使你采用計數器的辦法,即在Navigated事件中++,而在DownloadComplete中做--,也仍然不能得到JS完成執行后的結果,我開始也感覺到非常奇怪,直到后來GG了相關AJAX的文章,明白了其中原委.
最終解決方案就是利用WebBrowser+Timer來解決抓取頁面的問題
而其中的關鍵仍然是頁面狀態,我們可以利用webBrowser1.StatusText,如果返回"完成",表示頁面加載完畢!
示例代碼如下:
private void timer1_Tick(object sender, EventArgs e) { textBox1.Text += webBrowser1.StatusText; if (webBrowser1.StatusText == "完成") { timer1.Enabled = false; //頁面加載完成,做一些其它的事 textBox1.Text += webBrowser1.Document.Body.OuterHtml; //webBrowser1.DocumentText 注意不要用這個,這個和查看源文件一樣的 } } private void Form1_Load(object sender, EventArgs e) { string Url = "http://cd.mei8.cn/face/work/windex.aspx?btn=6"; webBrowser1.Navigate(Url); }
放三個控件,webBrowser,timer,textBox timer設置為可用