C#多線程使用webbrowser實現采集動態網頁的爬蟲機器人


今天在園子里看到 學院派的驢 寫的 巧用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了

這里是我測試寫的小程序

http://files.cnblogs.com/jiangming/TestThreadWebBrowser.zip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM