动态网页抓取(园子如何实现多线程使用webborwser采集页面其中我用到了)

优采云 发布时间: 2021-10-04 20:18

  动态网页抓取(园子如何实现多线程使用webborwser采集页面其中我用到了)

  今天在园子里看到了一个学术驴写的爬虫机器人,用C#webbrowser和Application.DoEvents()实现采集动态网页

  其实我也是用类似的方法抓取需要登录的网页,还有一些动态页面。

  今天想讲的是如何实现webborwser采集页面的多线程使用

  其中,我使用了一个 WeiFenLuo.winFormsUI.Docking.dll,它是一个开源组件

  下载链接:

  关于这个组件,园子里已经有前辈做过详细的使用方法了,这里不再赘述。

  在MainForm窗体中添加一个微分罗控件,并将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的多线程操作

  下面是我写的测试用的小程序

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线