今天在園子里看到 學院派的驢 寫的 巧用C#webbrowser以及Application.DoEvents()實現采集動態網頁的爬蟲機器人
其實之前我也是用類似的方法來抓取需要登陸的web頁面,和一些動態加頁的面頁
我今天要說的是如何實現多線程使用webborwser采集頁面
其中我用到了一個WeiFenLuo.winFormsUI.Docking.dll,是一個開源的組建
下載地址:https://github.com/dockpanelsuite/dockpanelsuite/downloads
關於這個組件,園子里已經有前輩做出詳細的使用方法,在此我不再多做說明
http://www.cnblogs.com/wuhuacong/archive/2009/07/09/1520082.html
在MainForm窗體中添加一個WeiFenLuo控件,並且把MainForm窗體的IsMdiContainer屬性設置成True
並且添加addWebForm方法,動態添加子窗體
public void addWebForm(string s) { if (this.InvokeRequired) { this.BeginInvoke(new OneStringParmenters(addWebForm), s); } else { ChildForm f2 = new ChildForm(); f2.Text = s; webForm.Add(s, f2); f2.Show(dockPanel1); } }
在ChildForm窗體中添加一個Webborwser控件
並且添加打開頁面方法
public delegate void OneStringParmenters(string str);//1個string參數委托 public void Navigate(string url) { if (this.InvokeRequired) { this.BeginInvoke(new OneStringParmenters(Navigate), url); } else { webBrowser1.Navigate(url); } }
以及讀取頁面html方法
private string strHtmlLeng = ""; private delegate void NoParameters();//無參數委托; public string StrHtmlLeng { get { if (this.InvokeRequired) { IAsyncResult iar = this.BeginInvoke(new NoParameters(GetHtmlLeng)); while (!iar.IsCompleted) { System.Threading.Thread.Sleep(0); } } else { GetHtmlLeng(); } return strHtmlLeng; } } private void GetHtmlLeng() { strHtmlLeng = webBrowser1.DocumentText; }
添加一個多線程方法,用來模擬多線程打開頁面,並且讀取html
public static void OpenWebPage(object strUrl) { DateTime dt = DateTime.Now; string u = strUrl.ToString(); IAsyncResult iar = Program.form.BeginInvoke(new OneStringParmenters(Program.form.addWebForm), u); while (!iar.IsCompleted) { System.Threading.Thread.Sleep(0); } int n = Program.form.webForm.Count; Program.form.webForm[u].Navigate(u); System.Threading.Thread.Sleep(TimeSpan.FromMinutes(1)); string strHtml = Program.form.webForm[u].StrHtmlLeng; //把html輸出到本地e盤,當采集信息時,可以直接操作html System.IO.StreamWriter sw = new StreamWriter(string.Format("e:/{0}.txt", u)); sw.Write(string.Format("開始時間:{0}\r\n 結束時間:{1}\r\n 打開信息:{2}", dt.ToString("G"), DateTime.Now, strHtml)); sw.Dispose(); }
好了.現在使用多線程來執行OpenWebPage方法,就可以模擬多線程操作Webborwser了
這里是我測試寫的小程序